电机驱动-标准库和HAL库

embedded/2025/1/20 14:04:31/

一、标准库

Motor.c-标准库

#include "stm32f10x.h"                  // Device header
#include "PWM.h"/*** 函    数:直流电机初始化* 参    数:无* 返 回 值:无*/
void Motor_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);		//开启GPIOA的时钟GPIO_InitTypeDef GPIO_InitStructure;						//定义GPIO初始化结构体GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;		//使用GPIOA引脚4、5,分别接在电机驱动AIN1、AIN2GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);						//初始化GPIOAPWM_Init();		//初始化PWM,需要PWM模块
}/*** 函    数:直流电机调速* 参    数:Speed代表直流电机转速,Speed>0正转,Speed<0反转* 返 回 值:无*/
void Motor_SetSpeed(int8_t Speed)
{if(Speed >= 0)		//正转{//设置电机驱动AIN1、AIN2引脚控制电机转向GPIO_SetBits(GPIOA,GPIO_Pin_5);GPIO_ResetBits(GPIOA,GPIO_Pin_4);PWM_SetCompare3(Speed);}else				//反转{//设置电机驱动AIN1、AIN2引脚控制电机转向GPIO_SetBits(GPIOA,GPIO_Pin_4);GPIO_ResetBits(GPIOA,GPIO_Pin_5);PWM_SetCompare3(Speed);}
}

Motor.h-标准库

#ifndef __MOTOR_H
#define __MOTOR_Hvoid Motor_Init(void);
void Motor_SetSpeed(int8_t Speed);#endif

PWM.c-标准库

#include "stm32f10x.h"                  // Device header/*** 函    数:PWM初始化* 参    数:无* 返 回 值:无*/
void PWM_Init(void)
{//开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);		//开启定时器TIM2时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	//开启GPIOA时钟//GPIOA初始化,引脚设为2GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//配置TIM2时钟源为内部时钟TIM_InternalClockConfig(TIM2);//TIM2时基初始化TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;		//ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1;	//PSCTIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//输出比较初始化,设置为通道3TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCStructInit(&TIM_OCInitStructure);						//结构体初始化(结构体参数多)TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;			//比较模式设置为PWM1TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;	//输出极性设为高(为低则输出高低取反)TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 0;			//CCR,与ARR一同决定占空比,由于ARR=100,所以占空比为CCR%TIM_OC3Init(TIM2,&TIM_OCInitStructure);		//初始化,设置为通道3,对应GPIOA引脚2TIM_Cmd(TIM2,ENABLE);		//定时器使能,开启定时器TIM2
}/*** 函    数:PWM调节占空比* 参    数:Compare写入需要设定的CCR的值* 返 回 值:无* 注意事项:通过设置CCR调节。并非直接调节*/
void PWM_SetCompare3(uint16_t Compare)
{TIM_SetCompare3(TIM2,Compare);		//修改TIM2的CCR
}

PWM.h-标准库

#ifndef __PWM_H
#define __PWM_Hvoid PWM_Init(void);
void PWM_SetCompare3(uint16_t Compare);#endif

二、HAL库

Motor.c-HAL库

#include "main.h"                  // Device header
#include "Motor.h"
#include "tim.h"
/*** 函    数:直流电机初始化* 参    数:无* 返 回 值:无*/
void Motor_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = Motor_AIN1_Pin|Motor_AIN2_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
}/*** 函    数:直流电机调速* 参    数:Speed代表直流电机转速,Speed>0正转,Speed<0反转* 返 回 值:无*/
void Motor_SetSpeed(int8_t Speed)
{if(Speed >= 0)		//正转{//设置电机驱动AIN1、AIN2引脚控制电机转向HAL_GPIO_WritePin(GPIOA,Motor_AIN1_Pin,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOA,Motor_AIN2_Pin,GPIO_PIN_RESET);__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,Speed);}else				//反转{//设置电机驱动AIN1、AIN2引脚控制电机转向HAL_GPIO_WritePin(GPIOA,Motor_AIN1_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA,Motor_AIN2_Pin,GPIO_PIN_SET);__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,Speed);}
}

Motor.h-HAL库

#ifndef __MOTOR_H
#define __MOTOR_Hvoid Motor_Init(void);
void Motor_SetSpeed(int8_t Speed);#endif


http://www.ppmy.cn/embedded/155503.html

相关文章

报告分享 | 大语言模型安全和隐私研究综述

大语言模型的强大能力和广泛应用引发了大量的相关研究&#xff0c;尤其是其在安全和隐私方面所带来的问题。本报告以 2024 年发表在《High-Confidence Computing》期刊上的一篇综述论文为核心&#xff0c;介绍大语言模型安全和隐私研究概况。 1 背景和动机 大型语言模型&#…

Three.js+Vue3+Vite应用lil-GUI调试开发3D效果(三)

前期文章中我们完成了创建第一个场景、添加轨道控制器的功能&#xff0c;接下来我们继续阐述其他的功能&#xff0c;本篇文章中主要讲述如何应用lil-GUI调试开发3D效果&#xff0c;在开始具体流程和步骤之前&#xff0c;请先查看之前的内容&#xff0c;因为该功能必须在前期内容…

vue2配置跨域后请求的是本机

这个我来说明一下&#xff0c;因为我们公司的后端设置解决了跨域问题&#xff0c;所以我有很久没有看相关的内容了&#xff0c;然后昨天请求了需要跨域的接口&#xff0c;请求半天一直不对&#xff0c;浏览器显示的是本机地址&#xff0c;我以为是自己配置错了&#xff0c;后面…

使用Pytorch完成图像分类任务

使用Pytorch完成图像分类任务_pytorch_Benron-GitCode 开源社区

python实现pdf转word和excel

一、引言   在办公中&#xff0c;我们经常遇收到pdf文件格式&#xff0c;因为pdf格式文件不易修改&#xff0c;当我们需要编辑这些pdf文件时&#xff0c;经常需要开通会员或收费功能才能使用编辑功能。今天&#xff0c;我要和大家分享的&#xff0c;是如何使用python编程实现…

AUTOSAR从入门到精通-自动驾驶测试技术

目录 前言 算法原理 测试场景定义与作用 测试场景要素 测试场景分类 场景信息提取与挖掘方法 自动驾驶感知测试分类 自动驾驶图像系统测试 自动驾驶激光雷达系统测试 自动驾驶融合感知系统测试 自动驾驶仿真测试 1. 功能安全 2. 预期功能安全 3. 软件测试 4.敏捷…

matlab实现了一个完整的语音通信系统的模拟,包括语音信号的读取、编码(PCM 和汉明码)、调制

% step 1: 读入语音信号,并进行归一化处理 [audio, fs] = audioread(D:\txyp4.m4a); len_speech = length(audio); % 计算语音信号的采样点个数

Agent AI: 强化学习,模仿学习,大型语言模型和VLMs在智能体中的应用

Agent AI: 强化学习,模仿学习,大型语言模型和VLMs在智能体中的应用 “Agent AI: Surveying the Horizons of Multimodal Interaction”主要探讨了 Agent AI 技术,包括其在多模态交互中的应用、面临的问题及解决方案。Agent AI 是一种能在不同环境中感知和行动的智能体系统,…