4、电机驱动与控制:直流电机、步进电机、舵机的驱动原理,L298N、TB6612等驱动模块的接线与PWM调速
在STM32机器人项目中,电机是执行机构的核心,直接决定了机器人的运动性能、定位精度和响应速度。直流电机、步进电机和舵机分别适用于不同的场景:直流电机适合高速连续旋转,步进电机适合精确的角度定位,舵机则适合关节或转向控制。本章将深入剖析三类电机的驱动原理,重点讲解L298N与TB6612两款主流驱动模块的接线方法、PWM调速机制,并结合实际工程案例给出选型与调试建议。
上图展示了STM32、驱动模块与三类电机之间的完整控制链路。STM32通过定时器输出PWM信号控制电机速度或舵机角度,通过GPIO控制方向引脚和使能引脚。驱动模块(L298N或TB6612)作为功率放大级,将逻辑电平转换为电机所需的大电流驱动信号。电源分配是整个系统的关键,逻辑电源与电机电源必须严格分离,否则会导致单片机复位或驱动芯片烧毁。
4.1 直流电机的驱动原理与PWM调速
直流电机是最基础的执行元件,其转速与端电压成正比,转矩与电枢电流成正比。STM32无法直接驱动电机(GPIO输出电流仅约20mA),必须通过驱动模块进行功率放大。PWM调速的本质是改变电机端电压的平均值,从而控制转速。
核心原理:H桥电路是直流电机驱动的标准拓扑。四个开关管(MOSFET或三极管)组成桥式结构,通过控制对角开关管的导通组合,实现电机正转、反转、刹车和滑行四种状态。PWM信号施加在使能端(ENA/ENB)或输入引脚上,通过调节占空比改变平均电压。
L298N是经典的H桥驱动芯片,内部包含两个H桥,可同时驱动两台直流电机或一台步进电机。其逻辑电源Vcc为5V,电机电源VS为6~12V。每个通道有3个控制引脚:ENA(PWM使能)、IN1、IN2(方向控制)。当ENA为高电平时,IN1=1、IN2=0为正转,反之为反转;当ENA为低电平时,电机滑行停止。
TB6612是新一代MOSFET H桥驱动芯片,相比L298N具有更低的导通压降(约0.5V vs 2V),因此效率更高、发热更小。其逻辑电源Vcc支持2.7~5.5V,可直接由STM32的3.3V供电,电机电源VM最高15V。TB6612的控制逻辑与L298N类似,但增加了STBY(待机)引脚,低电平时所有输出关闭,用于省电。
| 参数 | L298N | TB6612 |
|---|---|---|
| 驱动方式 | 双H桥(BJT) | 双H桥(MOSFET) |
| 逻辑电压 Vcc | 5V | 2.7~5.5V(推荐3.3V) |
| 电机电压 VS/VM | 6~12V | 2.5~15V |
| 最大持续电流 | 2A/通道 | 1.2A/通道 |
| 导通压降 | 约2V | 约0.5V |
| PWM频率上限 | 约40kHz | 约100kHz |
| 待机模式 | 无 | STBY引脚 |
| 典型应用 | 大电流电机、教学实验 | 电池供电机器人、低功耗设计 |
4.2 步进电机的驱动原理与细分控制
步进电机将电脉冲信号转换为角位移,每接收一个脉冲,电机旋转一个固定角度(步距角)。常见的28BYJ-48步进电机步距角为5.625°/64(减速比1:64),即每个脉冲旋转约0.0879°。步进电机适合开环位置控制,无需编码器即可实现精确定位。
驱动步进电机需要按照特定的通电顺序切换绕组电流。以四相五线步进电机为例,有单四拍(A-B-C-D)、双四拍(AB-BC-CD-DA)和八拍(A-AB-B-BC-C-CD-D-DA)三种工作方式。八拍方式步距角减半,运行更平滑。STM32通过GPIO输出脉冲序列,配合ULN2003或专用驱动芯片(如A4988、DRV8825)实现功率驱动。
工程经验:对于28BYJ-48电机,推荐使用八拍方式,虽然速度稍慢,但振动和噪声明显降低。若需要更高转速,可改用双四拍。注意:步进电机在静止时仍保持转矩,但长时间通电会发热,建议在不需要保持位置时关闭使能。
在实际接线中,ULN2003模块的IN1~IN4连接STM32的GPIO,OUT1~OUT4连接电机绕组。驱动时序通过软件延时或定时器中断产生。若使用A4988等细分驱动模块,则只需STEP(脉冲)和DIR(方向)两个引脚,通过MS1/MS2/MS3设置细分倍数(1、1/2、1/4、1/8、1/16),可显著降低振动和噪声。
4.3 舵机的驱动原理与PWM控制
舵机是一种位置伺服驱动器,通过PWM信号的脉宽控制输出轴角度。标准舵机(如SG90)的PWM周期为20ms(50Hz),脉宽0.5ms对应0°,1.5ms对应90°,2.5ms对应180°。舵机内部包含直流电机、减速齿轮组、位置反馈电位器和控制电路,形成闭环控制。
STM32驱动舵机时,需要生成50Hz的PWM信号,并精确控制高电平脉宽。使用定时器时,若时钟频率为72MHz,预分频器设为71(得到1MHz计数频率),自动重载值设为19999(得到50Hz),则比较寄存器CCR的值直接对应脉宽微秒数。例如,CCR=1500时,脉宽为1.5ms,舵机处于中位。
// 舵机PWM初始化(TIM2, PA0)
TIM_TimeBaseInitTypeDef TIM_InitStruct;
TIM_OCInitTypeDef OC_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
TIM_InitStruct.TIM_Prescaler = 71; // 72MHz/72 = 1MHz
TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_InitStruct.TIM_Period = 19999; // 1MHz/20000 = 50Hz
TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM2, &TIM_InitStruct);
OC_InitStruct.TIM_OCMode = TIM_OCMode_PWM1;
OC_InitStruct.TIM_OutputState = TIM_OutputState_Enable;
OC_InitStruct.TIM_Pulse = 1500; // 1.5ms 中位
OC_InitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &OC_InitStruct);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_Cmd(TIM2, ENABLE);
舵机的PWM信号对脉宽精度要求较高,1μs的误差约对应0.1°的角度偏差。因此,建议使用定时器硬件PWM而非软件延时模拟,以避免中断干扰导致抖动。
4.4 L298N与TB6612的接线实战与PWM调速案例
下面以双直流电机小车为例,分别给出L298N和TB6612的完整接线方案,并对比实际调试效果。
案例背景:设计一台两轮差速驱动小车,使用STM32F103C8T6控制,电机为6V直流减速电机(额定电流约300mA),电池为7.4V 2S锂电池。要求实现PWM调速、正反转和急停功能。
L298N接线方案:
- 将L298N的VS接电池正极(7.4V),GND接电池负极,Vcc接5V稳压输出(或从板载5V取电)。
- 将STM32的PA0(PWM)接ENA,PA1接IN1,PA2接IN2(左电机);PA3(PWM)接ENB,PA4接IN3,PA5接IN4(右电机)。
- 电机M1、M2分别接OUT1/OUT2和OUT3/OUT4。
- 将L298N的GND与STM32的GND共地。
TB6612接线方案:
- 将TB6612的VM接电池正极(7.4V),Vcc接STM32的3.3V,GND共地。
- 将STM32的PA0(PWM)接PWMA,PA1接AIN1,PA2接AIN2(左电机);PA3(PWM)接PWMB,PA4接BIN1,PA5接BIN2(右电机)。
- STBY引脚接STM32的3.3V(或GPIO高电平),使能芯片。
- 电机A、B分别接AO1/AO2和BO1/BO2。
两种方案的PWM调速代码逻辑相同,核心是设置定时器输出比较值。以1kHz PWM频率为例,若定时器预分频为71,自动重载值为999,则CCR值从0到999对应占空比0%~100%。
// 设置左电机速度,speed范围 -1000 ~ 1000
void Motor_SetSpeed(int16_t speed) {
if (speed > 0) {
GPIO_SetBits(GPIOA, GPIO_Pin_1); // IN1=1
GPIO_ResetBits(GPIOA, GPIO_Pin_2); // IN2=0
TIM_SetCompare1(TIM2, speed); // PWM占空比
} else if (speed < 0) {
GPIO_ResetBits(GPIOA, GPIO_Pin_1); // IN1=0
GPIO_SetBits(GPIOA, GPIO_Pin_2); // IN2=1
TIM_SetCompare1(TIM2, -speed);
} else {
GPIO_SetBits(GPIOA, GPIO_Pin_1); // 刹车
GPIO_SetBits(GPIOA, GPIO_Pin_2);
TIM_SetCompare1(TIM2, 0);
}
}
实测对比:在相同7.4V电源和6V电机条件下,L298N输出端实测电压约5.2V(压降1.8V),电机最高转速约180rpm;TB6612输出端实测电压约6.8V(压降0.6V),电机最高转速约230rpm。在持续运行5分钟后,L298N散热片温度达65℃,而TB6612仅微温(约40℃)。
风险提示:L298N的压降会导致电机在低电压时启动困难,尤其在电池电量下降时更为明显。若使用3.7V单节锂电池,建议直接选用TB6612或DRV8833等低压差驱动芯片。另外,务必在电机电源端并联100μF电解电容和0.1μF陶瓷电容,吸收电机换向产生的反电动势尖峰。
4.5 常见误区与调试要点
在电机驱动调试中,以下问题最为常见,需要特别注意:
- 共地问题:驱动模块的GND必须与STM32的GND相连,否则PWM信号无参考电平,电机无法正常工作。
- 逻辑电源不足:L298N的Vcc若直接从STM32的5V引脚取电,当电机电流较大时可能导致单片机复位。建议使用独立稳压芯片供电。
- PWM频率选择:直流电机PWM频率低于10kHz时会产生可闻噪声,高于20kHz时驱动芯片开关损耗增大。推荐15kHz左右。
- 舵机抖动:若舵机在静止位置抖动,通常是PWM信号不稳定或电源纹波过大。检查定时器配置和电源滤波。
- 步进电机失步:加速过快或负载过大时,步进电机会失步。应设置加减速曲线,避免瞬间启停。
调试建议:先用万用表测量驱动模块逻辑端电压,确认ENA/ENB为高电平;再用示波器观察PWM波形,确认频率和占空比正确;最后空载测试电机转向,再带载调试。若电机不转,优先检查使能引脚和方向引脚的电平组合。
总结而言,直流电机、步进电机和舵机的驱动原理各有侧重,但都离不开PWM信号和H桥/专用驱动电路。L298N适合教学和低要求场景,TB6612更适合电池供电的移动机器人。在实际项目中,应根据电机额定电压、电流、控制精度和电源效率综合选型,并严格遵循共地、滤波和散热规范,才能保证系统稳定可靠运行。