第三章 电机驱动与控制:直流电机原理、PWM调速控制、H桥电路设计、电机驱动芯片选型
各位同学,欢迎来到第三章。
这一章,我们聊聊电机驱动。说实话,在剃须刀这类便携设备里,电机就是心脏。电机选得好、驱动做得稳,整机体验就成功了一半。我自己做过的几个项目里,因为电机驱动翻车的案例,一只手都数不过来。所以这一章,我会把直流电机原理、PWM调速、H桥电路、驱动芯片选型这些核心内容,掰开了揉碎了讲给你听。
3.1 直流电机原理:从物理到工程
直流电机,说白了就是靠电流产生磁场,推动转子转起来。你想想看,一个线圈放在磁场里,通上电,它就会转。这就是最基础的物理原理——安培力。
但在工程里,我们更关心几个关键参数:
- 额定电压:电机正常工作的电压。比如剃须刀常用3.7V或5V电机。
- 空载转速:电机不带负载时的转速,单位RPM。
- 堵转电流:电机卡住不转时的电流。这个值很重要,选驱动芯片时一定要看它能不能扛住。
- 转矩常数:电流和输出扭矩的关系。
我记得有一次,一个同事选了个小电机,觉得空载电流才几十毫安,结果一装到剃须刀头上,刀网一卡,电流直接飙到1.2A。驱动芯片瞬间过热保护,整机停机。嗯,这就是典型的「堵转电流」没算清楚。
核心要点:直流电机的启动电流通常是额定电流的5~10倍。设计驱动电路时,必须留足余量。
3.2 PWM调速控制:不只是调电压
很多人以为,调电机转速就是调电压。其实不对。你调电压,电机确实会转得快或慢,但效率会下降,发热会增大。真正高效的方式是——PWM(脉宽调制)。
PWM的原理很简单:用固定频率的方波,控制导通时间(占空比)。占空比越大,平均电压越高,转速越快。频率一般选在20kHz以上,这样人耳听不到噪音。
我个人的习惯是:
- 剃须刀电机:PWM频率选25kHz~30kHz。太低会有啸叫声,太高会增加MOS管开关损耗。
- 占空比范围:10%~95%。低于10%电机可能不转,高于95%容易烧驱动。
这里给一个简单的PWM控制代码示例(基于STM32):
// 初始化定时器TIM3,输出PWM
void Motor_PWM_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 使能时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置PA6为复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 定时器配置
TIM_TimeBaseStructure.TIM_Period = 999; // 自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler = 71; // 预分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// PWM模式配置
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 500; // 初始占空比50%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_Cmd(TIM3, ENABLE);
}
// 设置占空比函数
void Motor_SetSpeed(uint16_t duty) {
if(duty > 950) duty = 950; // 上限保护
if(duty < 50) duty = 50; // 下限保护
TIM_SetCompare1(TIM3, duty);
}
小技巧:实际项目中,我建议在PWM输出引脚上加一个10kΩ下拉电阻。防止MCU启动瞬间引脚悬空,电机突然全速转起来。这个坑我踩过,真的会吓一跳。
3.3 H桥电路设计:正反转与刹车
直流电机只能正转?当然不是。用H桥电路,你可以实现正转、反转、刹车、滑行四种状态。
H桥的名字很形象——四个开关管(通常是MOSFET)组成一个「H」形状。电机接在中间横杠上。控制四个管的通断,就能改变电流方向。
四种工作状态:
| 状态 | Q1 | Q2 | Q3 | Q4 | 电机行为 |
|---|---|---|---|---|---|
| 正转 | ON | OFF | OFF | ON | 正向旋转 |
| 反转 | OFF | ON | ON | OFF | 反向旋转 |
| 刹车 | OFF | ON | OFF | ON | 电机短接,快速停止 |
| 滑行 | OFF | OFF | OFF | OFF | 电机自由停止 |
这里有个关键点:绝对不能出现Q1和Q2同时导通,或者Q3和Q4同时导通。那叫「直通」,相当于电源短路,瞬间烧毁MOS管。我曾经在一个原型板上,因为软件延时没算好,两个管同时开了0.5ms,结果MOS管直接冒烟。嗯,从那以后我每次写H桥控制代码,都会加死区时间。
警告:H桥的死区时间至少设置1μs。如果MOS管开关速度慢,建议加到3~5μs。别省这点时间,省下来的钱不够买新MOS管的。
3.4 电机驱动芯片选型:以DRV8833为例
自己搭H桥?当然可以。但说实话,对于剃须刀这种消费级产品,我更推荐用集成驱动芯片。体积小、保护全、设计简单。
DRV8833是我用得比较多的一款。它是个双通道H桥驱动芯片,每个通道能持续输出1.5A,峰值2A。对于剃须刀电机来说,绰绰有余。
DRV8833的几个关键特性:
- 工作电压:2.7V~10.8V,覆盖单节锂电池到三节电池。
- 内置保护:过流保护、过热保护、欠压锁定。这些保护功能,自己搭H桥很难做得这么全。
- PWM频率:最高支持250kHz,完全够用。
- 封装:QFN封装,3mm×3mm,非常适合空间受限的产品。
我个人的选型建议:
- 如果电机电流<1A,用DRV8837(更小、更便宜)。
- 如果电机电流1A~2A,用DRV8833(性价比最高)。
- 如果电机电流>2A,考虑DRV8870或外置MOS管方案。
下面是一个DRV8833的典型应用电路:
// DRV8833 引脚连接(以STM32为例)
// nSLEEP -> PB0 (高电平使能)
// IN1 -> PA0 (PWM输入)
// IN2 -> PA1 (方向控制)
// OUT1 -> 电机正极
// OUT2 -> 电机负极
void DRV8833_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA, ENABLE);
// nSLEEP引脚配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// IN1、IN2配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 使能芯片
GPIO_SetBits(GPIOB, GPIO_Pin_0);
}
// 设置电机正转,占空比50%
void Motor_Forward(void) {
TIM_SetCompare1(TIM2, 500); // PA0输出PWM
GPIO_ResetBits(GPIOA, GPIO_Pin_1); // IN2低电平
}
// 设置电机反转,占空比50%
void Motor_Reverse(void) {
TIM_SetCompare1(TIM2, 500);
GPIO_SetBits(GPIOA, GPIO_Pin_1); // IN2高电平
}
// 刹车
void Motor_Brake(void) {
GPIO_SetBits(GPIOA, GPIO_Pin_0); // IN1高电平
GPIO_SetBits(GPIOA, GPIO_Pin_1); // IN2高电平
}
经验之谈:DRV8833的nSLEEP引脚,我建议用MCU的GPIO控制,不要直接接VCC。为什么?因为系统休眠时,你可以拉低nSLEEP让芯片进入低功耗模式,电流只有1μA左右。这对电池供电的剃须刀来说,非常关键。
3.5 避坑指南:电机驱动的常见问题
最后,我总结几个实际项目中容易踩的坑:
- 电源纹波过大:电机启动瞬间电流很大,会导致电源电压跌落。我建议在电机电源引脚附近加一个470μF电解电容+0.1μF陶瓷电容。
- EMI干扰:电机电刷会产生火花,干扰MCU工作。解决办法:在电机两端并联一个0.1μF电容,或者加一个磁珠。
- PWM频率选择不当:频率太低,电机有啸叫声;频率太高,MOS管发热严重。20kHz~30kHz是黄金区间。
- 死区时间不够:前面说过了,至少1μs。如果你用DRV8833这类集成芯片,它内部已经处理好了,但自己搭H桥一定要小心。
我曾经在一个量产项目中,因为PCB布局时把电机驱动线和信号线走得太近,结果电机一转,ADC采集的数据全是乱的。后来把驱动线单独走一层,中间加地平面隔离,问题才解决。嗯,这就是所谓的「布局决定成败」。
好了,第三章就到这里。下一章我们讲传感器与反馈控制,到时候会用到这一章的PWM和H桥知识。记得动手练一练,光看是学不会的。