直流有刷电机驱动实战:从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二极管保护ADC
3.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检测到过流时立即关闭PWM
if(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小时无故障。关键是要理解:好的电机驱动不是功能实现,而是异常处理。每个保护环节都是为应对现实中的不可预测情况——比如我们遇到过金属屑导致电机短路、连接器进水造成信号异常等问题。
