1.程序功能
直流电机是能将直流电能转换成机械能的旋转电机。
驱动方式一:只能打开或关闭,不能变速与换向,用继电器,BJT或MOS开关控制通断即可。
驱动方式二:可以打开或关闭,可以变速,但不能换向,用PWM控制电子开关即可。
驱动方式三:可以打开或关闭,可以变速,也可以换向,用PWM控制桥路。
2.硬件部分
PB1、PB0、PA1、PA作为单片机的输出口,输入到驱动芯片,再由驱动芯片驱动电机转动。一个驱动芯片最多驱动两个直流电机。
驱动芯片内驱动电路为桥路,所以使用驱动方式三,芯片内部桥路电路如下图:
3.初始化配置
4.代码部分
DC直流电机结构体封装,并在.c文件里赋值
直流电机启动函数:
static void Start(void)
{
if(DC_Motor.Direction == Forward_State)
{
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);
}
else
{
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
}
DC_Motor.Status = Start_State;
}
直流电机停止函数:
static void Stop(void)
{
//停止电机
HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_3);
HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_4);
//更新电机状态
DC_Motor.Status = Stop_State;
}
方向调整函数:
static void Direction_Adjust(void)
{
if(DC_Motor.Status == Start_State)
{
if(DC_Motor.Direction == Reverse_State)
{
//停止反转
HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_4);
//等待电机完全停止
HAL_Delay(100);
//正向转动电机
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);
//更新方向状态
DC_Motor.Direction = Forward_State;
}
else
{
HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_3);
HAL_Delay(100);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
DC_Motor.Direction = Reverse_State;
}
}
}
速度调整函数:
static void Speed_Adjust(Speed_Change_t Speed_Change)
{
if(DC_Motor.Status == Start_State)
{
if(Speed_Change == Speed_up)
{
//速度选择
switch(DC_Motor.Speed)
{
case Speed_50: DC_Motor.Speed = Speed_60; break;
case Speed_60: DC_Motor.Speed = Speed_70; break;
case Speed_70: DC_Motor.Speed = Speed_80; break;
case Speed_80: DC_Motor.Speed = Speed_90; break;
case Speed_90: DC_Motor.Speed = Speed_100; break;
case Speed_100: DC_Motor.Speed = Speed_100; break;
default: DC_Motor.Speed = Speed_50;
}
}
else
{
//速度选择
switch(DC_Motor.Speed)
{
case Speed_50: DC_Motor.Speed = Speed_50; break;
case Speed_60: DC_Motor.Speed = Speed_50; break;
case Speed_70: DC_Motor.Speed = Speed_60; break;
case Speed_80: DC_Motor.Speed = Speed_70; break;
case Speed_90: DC_Motor.Speed = Speed_80; break;
case Speed_100: DC_Motor.Speed = Speed_90; break;
default: DC_Motor.Speed = Speed_90;
}
}
//¸更新定时器CCR值
TIM3->CCR3 = DC_Motor.Speed;
TIM3->CCR4 = DC_Motor.Speed;
}
}
外部中断回调函数:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
//控制启停
if(GPIO_Pin == KEY1_Pin)
{
LED.LED_Flip(LED2);
if(DC_Motor.Status == Stop_State)
{
//启动
DC_Motor.Start();
}
else
{
//停止
DC_Motor.Stop();
}
}
//控制方向
if(GPIO_Pin == KEY2_Pin)
{
LED.LED_Flip(LED2);
DC_Motor.Direction_Adjust();
}
//加速
if(GPIO_Pin == KEY3_Pin)
{
LED.LED_Flip(LED2);
DC_Motor.Speed_Adjust(Speed_up);
}
//减速
if(GPIO_Pin == KEY4_Pin)
{
LED.LED_Flip(LED2);
DC_Motor.Speed_Adjust(Speed_down);
}
}
本次只驱动了一个直流电机,若还想驱动一个电机,方法类似。