功能实现:按键控制刹车,调速,正反转
基础知识点:TIM , PWM ,电机驱动原理 ,STM32CubeIDE参数设置,常用HAL库函数
- TIM :本次采用高级定时器TIM1输出两路互补PWM波驱动电机驱动板
- PWM:采用TIM1通道CH1/CH1N
- 电机驱动原理:采用H桥电路,AT8236芯片。
H桥电路图如下,由四个MOS管连接电机组成,MOS管接收高电平时导通,低电平时关闭,由此可知Q1与Q4导通时电机启动(设此时为正转),那么Q3与Q2导通时电机为反转,故只需在Q1与Q4端口连接CH1通道,Q3与Q2端口连接CH1N通道,通过选择CH1/CH1N通道使与关闭便可控制电机正反转。同时调节PWM波形占空比即可控制直流有刷电机转速;
配合电机驱动板厂家给出参数控制表,我们便可得出电机驱动的思路(基本驱动):
- IN1接口接CH1输出,IN2接口接CH1N输出。
- 正转:CH1通道正常输出PWM波,CH1N通道关闭输 出PWM波并置低电平。
- 反转:CH1N通道正常输出PWM波,CH1通道关闭输出PWM波并置低电平。
- 通过更改CH1与CH1N通道输出的PWM波占空比来调节电机转速。
- STM32CubeIDE 定时器参数设置与说明
补充:
- TIM定时器溢出事件计算方法(单位S):
T =(ARR + 1)*(PSC + 1)/ F
F :启用APBx总线时钟频率
- TIM定时器频率计算方法(单位Hz):
频率 = 1 / T
- PWM占空比计算方法:
占空比 = Pulse / ARR * 100 %
- 分辨率计算方法:
频率 / F(启用总线频率)
- 常用HAL库函数
定时器启动函数:HAL_TIM_Base_Start();
定时器关闭函数:HAL_TIM_Base_Stop();
CH1通道PWM输出启动函数:HAL_TIM_PWM_Start();
CH1N通道PWM输出启动函数:HAL_TIMEx_PWMN_Start();
CH1通道PWM输出关闭函数:HAL_TIM_PWM_Stop();
CH1N通道PWM输出关闭函数:HAL_TIMEx_PWMN_Stop();
更改占空比函数:__HAL_TIM_SetCompare();
- 程序源码实例(仅电机驱动函数):
uint8_t direction = 0; //电机状态标志位 1 正转 0 反转
uint8_t STAO = 0; //启停标志位 1 启动 0 停止
uint16_t velocity = 299; //速度变量
void motor_start_stop() //电机停止
{
HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1); //关闭CH1通道输出
HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_1); //关闭CH1N通道输出
}
void motor_advance() //电机前进
{
HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_1); //关闭CH1N通道输出
HAL_Delay(50); //延时
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); //开启CH1通道输出
direction = 1; //电机状态标志位置 1
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,299); //给定初始速度(占空比10%)
velocity = 299; //加速变量 复位
}
void motor_Back() //电机后退
{
HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1); //关闭CH1通道输出
HAL_Delay(50); //延时
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1); //开启CH1N通道输出
direction = 0; //电机状态标志位置 0
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,299); //给定初始速度(占空比10%)
velocity = 299; //加速变量 复位
}
void motor_hasten() //电机加速
{
if(velocity <= 999) //判断占空比是否为100%
{
velocity += 100; //更改占空比(增加10%)
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,velocity);//每次增加10%
}
}