直流有刷电机驱动实战:从H桥到保护电路的全栈解析

张开发
2026/5/8 1:51:36 15 分钟阅读
直流有刷电机驱动实战:从H桥到保护电路的全栈解析
1. 直流有刷电机驱动系统全栈解析第一次接触直流有刷电机驱动时我被H桥电路烧坏了三个MOS管才明白电机驱动不是简单接上PWM就能转的。本文将用STM32高级定时器实战演示从H桥原理到保护电路设计手把手带你构建工业级电机控制系统。直流有刷电机Brushed DC Motor作为最古老的电动机类型至今仍在电动工具、机器人关节、工业传送带等领域广泛应用。其核心优势在于控制简单——两根线接电源就能转改变电压极性立即反转。但要把这种简单的电机用在正式项目中需要解决三大难题H桥电路的死区控制烧管子的元凶实时监测电压/电流/温度系统安全的生命线硬件保护电路设计最后一道防线2. H桥驱动从原理到实战2.1 经典H桥电路剖析H桥由四个开关器件MOSFET或三极管组成H形拓扑通过对角线导通控制电流方向。我曾用IR2104半桥驱动芯片搭建的电路如下图所示// 典型H桥控制逻辑 void Motor_SetDirection(bool forward) { if(forward) { HAL_GPIO_WritePin(IN1_GPIO_Port, IN1_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(IN2_GPIO_Port, IN2_Pin, GPIO_PIN_RESET); } else { HAL_GPIO_WritePin(IN1_GPIO_Port, IN1_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(IN2_GPIO_Port, IN2_Pin, GPIO_PIN_SET); } }关键参数计算栅极驱动电流 ≥ Qg(总栅极电荷)/开关时间死区时间 ≥ 栅极导通延迟时间 - 关断延迟时间 余量(通常≥500ns)续流二极管反向恢复时间 死区时间2.2 STM32高级定时器配置STM32的TIM1/TIM8高级定时器支持互补PWM输出和可编程死区这是避免上下管直通的关键。以下是我的实际配置void MX_TIM1_Init(uint32_t arr, uint32_t psc) { htim1.Instance TIM1; htim1.Init.Prescaler psc; htim1.Init.CounterMode TIM_COUNTERMODE_UP; htim1.Init.Period arr; htim1.Init.RepetitionCounter 0; HAL_TIM_PWM_Init(htim1); TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig { .OffStateRunMode TIM_OSSR_ENABLE, .DeadTime 0x0F, // 约700ns死区 .BreakState TIM_BREAK_DISABLE }; HAL_TIMEx_ConfigBreakDeadTime(htim1, sBreakDeadTimeConfig); }实测建议用示波器观察HO/LO输出确保死区时间内两个信号均为低电平。我曾因死区不足导致MOS管发热严重电机运行时管子温度高达80℃。3. 多通道安全监测系统3.1 电流检测方案对比方案精度成本响应速度适用场景采样电阻运放±5%低快大多数应用霍尔传感器±1%高较快高压隔离场合电流互感器±3%中慢交流大电流检测推荐使用50mΩ/2W的锰铜采样电阻配合INA240电流检测运放其共模电压可达80V。电路设计要点布局时采样电阻到运放的走线尽量短添加RC低通滤波fc≈10kHz运放输出接TVS二极管保护ADC3.2 基于DMA的ADC采集STM32的ADC配合DMA可实现无CPU干预的连续采样。以下是三通道配置示例void ADC_Init(void) { hadc1.Instance ADC1; hadc1.Init.ScanConvMode ENABLE; hadc1.Init.DMAContinuousRequests ENABLE; HAL_ADC_Init(hadc1); // 配置通道电压→温度→电流 ADC_ChannelConfTypeDef sConfig {0}; sConfig.Channel ADC_CHANNEL_9; // 电压 sConfig.Rank 1; HAL_ADC_ConfigChannel(hadc1, sConfig); sConfig.Channel ADC_CHANNEL_0; // 温度 sConfig.Rank 2; HAL_ADC_ConfigChannel(hadc1, sConfig); sConfig.Channel ADC_CHANNEL_8; // 电流 sConfig.Rank 3; HAL_ADC_ConfigChannel(hadc1, sConfig); HAL_ADC_Start_DMA(hadc1, (uint32_t*)adc_values, 3); }数据处理技巧采用滑动平均滤波I_avg 0.2*I_new 0.8*I_avg电流校准电机静止时记录ADC偏移值温度换算NTC热敏电阻使用Steinhart-Hart方程计算4. 硬件保护电路设计4.1 三级保护机制软件保护ADC检测到过流时立即关闭PWMif(current 2A) { HAL_TIM_PWM_Stop(htim1, TIM_CHANNEL_1); HAL_GPIO_WritePin(EN_GPIO_Port, EN_Pin, GPIO_PIN_RESET); }硬件比较器LM393快速触发保护响应时间1μs同相端接电流检测信号反相端设置阈值电压如0.5V对应5A输出接MCU复位引脚和MOS管栅极保险丝备份选择慢熔型保险丝应对启动冲击电流4.2 典型保护电路graph LR A[电流检测] --|至ADC| B(MCU) A --|至比较器| C(LM393) C -- D[MOS管栅极下拉] C -- E[MCU复位] F[温度开关] -- E实战经验在电机堵转测试中纯软件保护平均响应时间为20ms加入硬件比较器后缩短到800ns有效避免了MOS管损坏。5. 系统集成与调试5.1 控制算法实现采用带限幅的PI速度控制typedef struct { float Kp, Ki; float integral; float max_output; } PI_Controller; float PI_Update(PI_Controller* ctrl, float error) { ctrl-integral error; // 抗积分饱和 if(ctrl-integral ctrl-max_output) ctrl-integral ctrl-max_output; else if(ctrl-integral -ctrl-max_output) ctrl-integral -ctrl-max_output; return ctrl-Kp * error ctrl-Ki * ctrl-integral; }5.2 调试 Checklist[ ] 上电前测量H桥无短路[ ] 用可调电源限流测试[ ] 逐步增加PWM占空比观察电流[ ] 故意制造过流验证保护电路[ ] 连续运行30分钟监测温升遇到电机振动问题时可尝试增加PWM频率通常10-20kHz检查电源退耦电容每管加0.1μF陶瓷电容在电机端子并联104电容这套系统已成功应用于AGV小车驱动连续运行2000小时无故障。关键是要理解好的电机驱动不是功能实现而是异常处理。每个保护环节都是为应对现实中的不可预测情况——比如我们遇到过金属屑导致电机短路、连接器进水造成信号异常等问题。

更多文章