第4章 电机控制基础:直流有刷电机工作原理、PWM调速原理、H桥驱动电路设计、电机堵转检测与保护
各位同学,今天我们来聊聊剃须刀里最核心的执行部件——电机。说实话,我见过不少工程师在电路设计上花了大把功夫,结果电机选型或者驱动电路出了岔子,整个项目推倒重来。电机控制这块,看似基础,但坑真的不少。
4.1 直流有刷电机工作原理
直流有刷电机,说白了就是最经典的那种电机。你给它通上直流电,它就转。为什么能转?我简单解释一下:电机内部有定子(永磁体或电磁铁)和转子(绕有线圈的电枢)。当电流通过电刷和换向器流入转子线圈时,线圈在磁场中受力,产生转矩,转子就转起来了。
这里有个关键点——换向器。它负责在转子转到特定位置时,自动切换电流方向,保证转子始终朝一个方向转。我在项目中遇到过一个问题:客户反馈电机噪音大,拆开一看,换向器磨损严重。后来发现是电刷材质选型不对,碳刷硬度太高。嗯,这里要注意,电刷和换向器的匹配,直接影响电机寿命。
直流有刷电机的几个核心参数,我列个表,大家记一下:
| 参数 | 说明 | 我的经验值 |
|---|---|---|
| 额定电压 | 电机正常工作的电压 | 剃须刀常用3.7V或5V |
| 空载转速 | 不加负载时的转速 | 一般8000-15000 RPM |
| 堵转电流 | 转子卡住时的电流 | 通常是额定电流的5-10倍 |
| 额定转矩 | 电机能持续输出的力矩 | 剃须刀约2-5 mN·m |
4.2 PWM调速原理
电机调速,最常用的方法就是PWM(脉冲宽度调制)。你想想看,如果直接调电压,效率低,发热大。PWM就不一样了——它通过快速开关电源,改变占空比,来调节电机两端的平均电压。
占空比,就是高电平时间占整个周期的比例。比如50%占空比,平均电压就是电源电压的一半。电机转速和占空比基本成正比。为什么会这样?因为电机的机械惯性比较大,它响应的是平均电压,而不是瞬间的开关状态。
我给大家看一段典型的PWM控制代码,这是我在STM32上常用的:
// 定时器配置,输出PWM,频率20kHz
void Motor_PWM_Init(void) {
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
// 设置占空比,范围0-1000
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 500); // 50%占空比
}
// 调速函数
void Motor_SetSpeed(uint16_t speed) {
if(speed > 1000) speed = 1000;
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, speed);
}
这里有个细节:PWM频率怎么选?我建议剃须刀用15kHz到25kHz。低于15kHz,人耳能听到电机啸叫,用户体验很差。高于25kHz,MOS管的开关损耗会明显增加。我曾经试过用10kHz,结果客户投诉说电机有高频噪音,后来改到20kHz就解决了。
4.3 H桥驱动电路设计
直流有刷电机要正反转,怎么办?用H桥电路。H桥由四个开关管(通常是MOSFET)组成,形状像字母"H"。通过控制不同开关管的导通组合,可以改变电机电流方向,实现正转、反转、刹车和滑行。
四种基本工作状态:
- 正转:Q1和Q4导通,电流从左到右流过电机
- 反转:Q2和Q3导通,电流从右到左
- 刹车:Q1和Q3导通(或Q2和Q4),电机两端短路,快速停止
- 滑行:所有开关管关断,电机自由转动
设计H桥时,我最怕遇到"直通"问题。什么叫直通?就是同一侧的两个管子同时导通,比如Q1和Q2同时打开,电源直接对地短路,瞬间烧毁MOS管。我在项目中遇到过这种情况:软件工程师写的PWM死区时间太短,导致上下管切换时短暂导通,炸了好几个MOS管才找到原因。
解决方法是加死区时间。死区时间,就是上下管切换时,先关断一个,等一小段时间再打开另一个。一般设置100ns到500ns就够了。硬件上,我习惯用专用的H桥驱动芯片,比如DRV8837或L9110S,它们内部已经处理了死区逻辑。
下面是一个分立元件H桥的简化原理图描述:
// 伪代码:H桥控制逻辑
void H_Bridge_Control(uint8_t direction) {
switch(direction) {
case FORWARD:
Q1_ON(); Q4_ON();
Q2_OFF(); Q3_OFF();
break;
case REVERSE:
Q2_ON(); Q3_ON();
Q1_OFF(); Q4_OFF();
break;
case BRAKE:
Q1_ON(); Q3_ON();
Q2_OFF(); Q4_OFF();
break;
case COAST:
Q1_OFF(); Q2_OFF();
Q3_OFF(); Q4_OFF();
break;
}
}
4.4 电机堵转检测与保护
剃须刀最怕什么?堵转。刀网卡住胡须或者异物,电机转不动,电流瞬间飙升。如果不做保护,轻则烧毁驱动芯片,重则电池过热甚至起火。所以,堵转检测是必须的。
检测方法主要有两种:
- 电流检测法:在电机回路中串联一个小电阻(比如0.1Ω),用ADC采样电阻两端的电压。当电流超过设定阈值,判定为堵转。
- 反电动势检测法:电机堵转时,反电动势消失,通过检测电机端电压的变化来判断。这个方法不需要采样电阻,但算法复杂一些。
我个人更推荐电流检测法,简单可靠。下面是我常用的堵转检测代码:
#define MOTOR_STALL_CURRENT 2000 // 堵转电流阈值,单位mA
#define STALL_TIMEOUT_MS 500 // 堵转持续500ms判定为故障
uint16_t motor_current = 0;
uint32_t stall_start_time = 0;
void Motor_Stall_Detect(void) {
// 读取ADC值,换算成电流
motor_current = Get_Motor_Current();
if(motor_current > MOTOR_STALL_CURRENT) {
if(stall_start_time == 0) {
stall_start_time = HAL_GetTick();
} else if((HAL_GetTick() - stall_start_time) > STALL_TIMEOUT_MS) {
// 堵转保护动作
Motor_Stop();
Set_Error_Flag(ERROR_MOTOR_STALL);
// 可以尝试反转一下,看是否能解除堵转
Motor_Reverse(100); // 反转100ms
stall_start_time = 0;
}
} else {
stall_start_time = 0; // 电流恢复正常,清除计时
}
}
这里有个避坑指南:我曾经遇到过一个问题,电机启动瞬间电流也会很大,容易误触发堵转保护。解决办法是加一个延时,比如启动后100ms内不检测堵转,或者用软件滤波,取多次采样的平均值。
保护动作怎么做?我一般分三步:
- 第一步:立即停止PWM输出,切断电机电源
- 第二步:尝试反转一小段时间(比如200ms),看能否解除卡滞
- 第三步:如果反转无效,彻底关闭电机,并上报故障码
好了,这一章的内容就到这里。电机控制是嵌入式系统的基础功,但也是容易出问题的地方。下一章我们会讲传感器接口设计,到时候再聊。