1. PWM控制直流电机的基础原理我第一次接触PWM控制电机是在大学机器人社团当时用Arduino给小车调速发现同样的电压下电机转速竟然能通过一串开关信号精确调节。这背后的核心就是**脉冲宽度调制PWM**技术。PWM本质上是通过快速切换电源通断用数字信号模拟模拟量输出。举个例子就像用开关控制水龙头如果每秒开关10次每次打开0.1秒相当于持续打开时的10%流量。对于直流电机这种通断控制最终表现为转速变化。**占空比Duty Cycle**是PWM最关键的参数它表示一个周期内高电平持续时间与总周期的比值。当占空比为30%时电机获得的平均电压就是电源电压的30%。实测发现小型直流电机的转速与占空比基本呈线性关系见下表占空比平均电压实测转速空载20%1.0V1200 RPM50%2.5V3000 RPM80%4.0V4800 RPM注意上表数据基于6V电源电压的130型直流电机测试不同电机特性会有差异2. 关键参数对电机性能的影响2.1 占空比与转矩的关系很多人误以为占空比只影响转速实际上它直接影响的是电机转矩。我在调试机械臂时深有体会当占空比低于15%时电机虽然能转但根本带不动负载。这是因为电枢电流 $I_a (V_{in} - E_b)/R_a$反电动势 $E_b K_e \cdot \omega$输出转矩 $T K_t \cdot I_a$其中$K_e$是反电动势常数$K_t$是转矩常数。当占空比降低时$V_{in}$减小导致$I_a$和$T$同步下降。这就是为什么重载场合需要更高占空比。2.2 PWM频率的选择频率选择不当会导致两个典型问题低频1kHz电机会发出可闻噪音我在早期项目中用500Hz频率时电机啸叫声非常明显高频20kHzMOSFET开关损耗加剧用示波器能看到驱动芯片明显发热经过多次测试推荐频率范围小型电机12V5-10kHz中型电机12-24V10-15kHz大功率电机24V15-20kHz2.3 死区时间设置使用H桥驱动时死区时间是避免上下管直通的关键。曾经因为没设置死区烧毁了价值200元的MOSFET。经验公式死区时间(ns) 开关延迟(ns) 20%余量例如IR2104驱动芯片的典型延迟为120ns建议设置150ns死区。STM32的定时器可以直接配置死区寄存器TIM_BreakDeadTimeConfigTypeDef sDeadTimeConfig; sDeadTimeConfig.DeadTime 0x8F; // 对应约5.6us死区 sDeadTimeConfig.BreakState TIM_BREAK_ENABLE; HAL_TIMEx_ConfigBreakDeadTime(htim1, sDeadTimeConfig);3. 硬件选型实战指南3.1 定时器芯片对比在无MCU的方案中我对比过三种PWM生成方案方案精度成本适用场景555定时器±5%0.5简单调速玩具SG3525±1%3电源/电机控制STM32定时器±0.1%10需要精确控制的场合555电路示例----- | | R1 | | Vin o--/\/\/--o--|555 | | | |-- PWM Out R2 | | | /\/\/--o--| | | ----- C13.2 MOSFET选型要点选MOSFET主要看三个参数VDS至少是电源电压的2倍RDS(on)越小越好大电流选10mΩQg栅极电荷影响驱动难度推荐型号小电流5AIRLZ44N中电流5-20AIRF3205大电流20AAUIRFS84093.3 续流二极管选择电机是感性负载关断时会产生反向电动势。我曾因省略续流二极管导致MCU复位。必须选择快恢复二极管如FR2071A/1000V肖特基二极管SS343A/40V4. 软件实现与优化技巧4.1 基于STM32的PWM配置以STM32F103为例配置TIM1通道1输出PWM// 时钟配置 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); // 时基初始化 TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; TIM_TimeBaseStruct.TIM_Prescaler 84-1; // 1MHz计数频率 TIM_TimeBaseStruct.TIM_Period 1000-1; // 1kHz PWM频率 TIM_TimeBaseInit(TIM1, TIM_TimeBaseStruct); // PWM通道配置 TIM_OCInitTypeDef TIM_OCInitStruct; TIM_OCInitStruct.TIM_OCMode TIM_OCMode_PWM1; TIM_OCInitStruct.TIM_Pulse 300; // 初始占空比30% TIM_OC1Init(TIM1, TIM_OCInitStruct); // 使能输出 TIM_CtrlPWMOutputs(TIM1, ENABLE); TIM_Cmd(TIM1, ENABLE);4.2 动态调整占空比通过PID算法实现速度闭环控制float PID_Control(float setpoint, float feedback) { static float integral 0, last_error 0; float error setpoint - feedback; integral error * dt; float derivative (error - last_error) / dt; last_error error; return Kp*error Ki*integral Kd*derivative; } // 在主循环中调用 uint16_t duty PID_Control(target_rpm, actual_rpm) * 1000; __HAL_TIM_SET_COMPARE(htim1, TIM_CHANNEL_1, duty);4.3 抗干扰措施在工业现场遇到过PWM信号被干扰的情况解决方法增加硬件滤波在PWM输出端加RC低通如1kΩ100nF软件消抖连续3次采样一致才更新占空比屏蔽线缆使用双绞屏蔽线连接驱动板5. 常见问题排查问题1电机抖动不转检查电源电压是否足够测量PWM信号是否正常到达MOSFET栅极确认H桥没有上下管直通问题2电机只能单向转检查方向控制信号电平测试H桥另一侧MOSFET是否损坏验证互补PWM通道配置问题3高占空比时电机突然停转可能是过流保护触发检查电流采样电阻值一般用0.1Ω/2W适当调整保护阈值记得第一次调试时电机莫名奇妙地反转后来发现是逻辑分析仪抓取的PWM相位反了。这种问题最有效的排查方法是断开电机负载单独测试驱动信号用示波器观察各关键点波形逐步增加负载观察现象变化