前言:
声明:学习笔记来自正点原子B站教程,仅供学习交流!!
一 基本原理
1.1 左手定则
左手定则是判断通电导线处于磁场中时,所受安培力 F (或运动)的方向、磁感应强度 B的方向以及通电导体棒的电流 I 三者方向之间的关系的定律。
左手定则的具体内容: 将左手四指并拢伸直,使拇指与其他四指在平面内垂直,手掌方向代表磁场的方向(从 N 级到 S 级),四指代表电流的方向(从正极到负极),那拇指所指的方向就是受力的方向
1.2 电机转动原理
直流有刷电机的工作原理:
直流有刷电机,其实就是直接最简单的方式利用安培力,给导线通电,然后在磁场中运动。
- 如图a,电流从A流向B,通过左手定则,可以得到ab段得到的力从右指向左,而dc段的力从左指向右,所以电机做逆时针运动
- 如图b,电流从B流向A,通过左手定则,可以得到dc段得到的力从右指向左,而ab段的力从左指向右,所以电机做逆时针运动
注意:这种是直流有刷电机的基本原理,换向器用于保证电机能够在越过中点时继续往下运动。不难发现,这种电机有一个很明显的缺点,就是速度不稳定。当线圈转动到不同的位置时,受到的安培力大小不同,所以速度也不同
因此,在实际的应用中,转子通常都会有三匝或以上的线圈,它的受力情况会复杂很多,但是基本的原理是相通的。
1.3 调速原理
根据洛伦兹力的表达公式:F=BIL(B为磁场强度,I为电流强度,L为导线强度),可以知道转子线圈的受力与电流成正比关系,也就是说我们只需要改变电压,即可以电机转速。
1.4 换向原理
根据直流有刷电机的工作原理可知,当转子线圈中电流的方向发生变化,线圈的受力情况也会发生改变,因此,我们只需要改变转子线圈中的电流方向即可实现电机换向
二 电机驱动
1.1 H桥驱动原理
上图的 H 桥搭建全部使用的是 NPN,导通逻辑都是基极为高电平时导通。如果 Q1和 Q4 三极管导通,那么电机的电流方向是从点 a 到点 b,假设此时电机正转;如果 Q2 和 Q3三极管导通,那么电机的电流方向是从点 b 到点 a,此时电机就反转了。上述就是 H 桥控制电机正反转的逻辑原理。在驱动电机时,必须保证 H 桥的同一侧三极管不会同时导通,否则将会发生短路,比如: Q1 和 Q2 同时导通或者 Q3 和 Q4 同时导通,这都是不可取的
上图是一个完整的全桥驱动点图,从左到右,首先利用单片机产生两路互补的PWM信号,比如UH为1时UL为0,进入高速光耦EL0631(TA),光耦有隔离保护的作用,输出后PWM波与输入相反,比如UH为0、UL为1;这两路信号会分别进入上下两个半桥芯片(黄色),芯片的输入输出逻辑逻辑表如上(SD低电平时输出无效,也叫刹车/停止引脚)
功能实现:
- 电机启停:IO控制半桥芯片SD引脚的输入电平
- 电机正反转:最简单的就是利用两个IO进行翻转,但是需要注意死区时间
- 电机调速:一个IO固定输出,另一个使用PWM输出(改变占空比)
- 电机正反转、调速实现: PWM互补输出,即两个IO固定输出与PWM输出交替进行
1.2 H桥驱动程序
- 定时器初始化函数:初始化通道IO,配置定时器、PWM互补输出以及死区控制
- 电机初始化函数:初始化SD引脚IO,默认拉低SD
- 电机启动函数:开启定时器和拉高SD引脚,开启定时器函数:HAL_TIM_Base_Start
- 电机停止函数:关闭定时器和拉低SD引脚,关闭定时器函数:HAL_TIM_Base_Stop
- 电机正反转函数:先关闭两个通道的PWM输出,正转就开启主通道,反转就开启互补通道,关闭PWM输出函数:HAL_TIM_PWM_Stop、HAL_TIMEx_PWMN_Stop
1.2.1 硬件设计
PWM_UH--------------------------- PA8(TIM1 主输出通道)
PWM_UL--------------------------- PB13(TIM1 互补输出通道)
SD(刹车)------------------------ PF10
1.2.2 软件设计
为了实现电机正反转功能与调速功能,需要使用到STM32的互补输出和死区插入
- STM32引脚配置
- 定时器基本配置
设置TIM1模式为定时器互补输出,并设置为计数周期为50us(将计数周期设置足够的小,电机运行流畅一点),死区设置为0x0F。
- 电机正反转控制
根据上述说明,控制电机正反转是根据控制电流(电压)方向实现的,根据H桥的原理,我们通过控制两个PWM通道的输出控制电流(电压)的方向
void motor_dir_ctrl(Direction_E dir)
{
HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_1);
if(dir == CW)
{
dc_motor.dir = CW;
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
}
else
{
dc_motor.dir = CCW;
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
}
}
- 电机的速度控制
电机的转速是通过电压的大小进行控制的,我们通过PWM波形的占空比,实现控制电压的大小
void motor_pwm_set(int32_t pwm)
{
dc_motor.pwm = pwm;
if(pwm <= __HAL_TIM_GetAutoreload(&htim1) - 0x0F)
{
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_1, pwm);
}
}
- 电机的刹车控制
IR2104STRPBF芯片有个/SD引脚,当该引脚为低电平时,IR2104STRPBF芯片所有输出为低,此时电机没有驱动电压;当该引脚为高电平时,输出正常。所以我们通过控制该引脚实现刹车功能
void motor_sw_ctrl(Status_E sw)
{
if(sw == Start)
{
dc_motor.status = Start;
DC_MOTOR_START;
}
else
{
dc_motor.status = Stop;
DC_MOTOR_STOP;
}
}