第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就解决了。

注意:PWM频率不是越高越好。频率太高,电机电感会限制电流上升速度,导致实际转矩下降。我一般控制在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;
    }
}
核心要点:H桥设计的关键是防止直通。我建议新手直接使用集成驱动芯片,省心又可靠。如果非要自己搭分立电路,死区时间一定要留够。

4.4 电机堵转检测与保护

剃须刀最怕什么?堵转。刀网卡住胡须或者异物,电机转不动,电流瞬间飙升。如果不做保护,轻则烧毁驱动芯片,重则电池过热甚至起火。所以,堵转检测是必须的。

检测方法主要有两种:

  1. 电流检测法:在电机回路中串联一个小电阻(比如0.1Ω),用ADC采样电阻两端的电压。当电流超过设定阈值,判定为堵转。
  2. 反电动势检测法:电机堵转时,反电动势消失,通过检测电机端电压的变化来判断。这个方法不需要采样电阻,但算法复杂一些。

我个人更推荐电流检测法,简单可靠。下面是我常用的堵转检测代码:

#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),看能否解除卡滞
  • 第三步:如果反转无效,彻底关闭电机,并上报故障码
重要提醒:堵转保护不能只靠软件。硬件上一定要加保险丝或者自恢复保险丝(PTC)。我见过一个案例,软件跑飞了,堵转保护没触发,结果电机线圈烧断,差点把PCB板都烧了。硬件保护是最后一道防线,不能省。

好了,这一章的内容就到这里。电机控制是嵌入式系统的基础功,但也是容易出问题的地方。下一章我们会讲传感器接口设计,到时候再聊。