直流有刷电机驱动实战:从H桥原理到STM32高级定时器配置

张开发
2026/6/2 20:58:42 15 分钟阅读
直流有刷电机驱动实战:从H桥原理到STM32高级定时器配置
1. 直流有刷电机驱动基础直流有刷电机Brushed DC Motor是嵌入式系统中最常见的执行机构之一。它的核心结构包含定子、转子、电刷和换向器四个部分。当电流通过电刷流入转子绕组时会在磁场中产生安培力推动转子旋转。这种电机最大的特点就是控制简单——改变电压极性就能反转调整电压大小就能调速。我在实际项目中发现很多初学者容易混淆几个关键参数额定电压电机长期稳定工作的电压值超过可能烧毁绕组堵转电流电机卡住时的电流通常是额定电流的5-10倍空载转速不带负载时的最高转速单位RPM减速比减速电机特有的参数比如10:1表示输出转速是电机转速的1/10特别注意电机堵转时会产生大电流如果不及时处理几分钟内就可能烧毁驱动电路。我在早期项目中就因此损失过三个电机驱动模块。2. H桥驱动电路详解2.1 基本H桥工作原理H桥电路是驱动直流有刷电机的核心由四个开关管MOSFET或三极管组成H形拓扑。通过控制对角开关管的通断可以实现电机的正反转控制// 正转控制示例 MOS1 ON; // 左上管导通 MOS4 ON; // 右下管导通 MOS2 OFF; // 右上管关闭 MOS3 OFF; // 左下管关闭 // 电流路径电源 → MOS1 → 电机 → MOS4 → 电源-实际应用中我们常用集成驱动芯片如DRV8871代替分立元件。这类芯片内部集成了MOSFET和保护电路大大简化了设计难度。我实测过DRV8871的驱动能力在12V/3A条件下连续工作2小时温升仅28℃。2.2 关键保护机制H桥设计必须考虑三个致命问题直通短路同侧开关管意外同时导通会导致电源短路反电动势电机突然停止时会产生高压反冲续流回路电感电流需要释放路径成熟的方案是加入死区时间和续流二极管。以IR2104驱动芯片为例它自带520ns的死区时间能有效防止直通。我在PCB布局时会在电机端口并联100nF电容和肖特基二极管如1N5822用于吸收反峰电压。3. STM32高级定时器配置3.1 TIM1/TIM8特性解析STM32F4系列的高级定时器支持互补PWM输出特别适合电机控制。与通用定时器相比它有三大独特功能刹车输入紧急情况下快速切断PWM输出死区插入防止上下管直通的硬件保护重复计数器减少中断频率的高效设计配置时需要注意时钟源的选择。以168MHz主频的F407为例高级定时器挂在APB2总线上经过预分频后的时钟计算如下// 典型配置代码 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); TIM_TimeBaseStructure.TIM_Prescaler 0; // 无分频 TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period 8399; // 20kHz PWM TIM_TimeBaseStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_RepetitionCounter 0;3.2 互补PWM配置实战带死区的互补PWM配置流程比较复杂我总结出五个关键步骤GPIO复用配置注意CHxN通道的复用功能映射时基初始化设置ARR和PSC决定PWM频率输出比较配置选择PWM模式1/2死区参数设置根据MOSFET开关速度调整刹车功能使能配置OSSR/OSSI状态具体到代码实现这里给出一个经过项目验证的配置模板void TIM1_PWM_Init(void) { TIM_OC_InitTypeDef sConfigOC; TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; // 时基配置 htim1.Instance TIM1; htim1.Init.Prescaler 0; htim1.Init.CounterMode TIM_COUNTERMODE_UP; htim1.Init.Period 8399; // 20kHz 168MHz htim1.Init.RepetitionCounter 0; HAL_TIM_PWM_Init(htim1); // PWM通道配置 sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 4200; // 50%占空比 sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity TIM_OCNPOLARITY_HIGH; sConfigOC.OCFastMode TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(htim1, sConfigOC, TIM_CHANNEL_1); // 死区时间计算tDTS1/168MHz, DeadTime0xF→1.28μs sBreakDeadTimeConfig.DeadTime 0x0F; sBreakDeadTimeConfig.BreakState TIM_BREAK_DISABLE; sBreakDeadTimeConfig.BreakPolarity TIM_BREAKPOLARITY_HIGH; HAL_TIMEx_ConfigBreakDeadTime(htim1, sBreakDeadTimeConfig); }4. 完整驱动系统实现4.1 硬件架构设计一个完整的电机驱动系统通常包含功率部分H桥MOSFET驱动芯片控制部分STM32高级定时器检测部分电流采样电阻运放保护电路TVS管自恢复保险丝我在最近的一个AGV项目中使用的硬件方案模块型号关键参数驱动ICDRV88713.6A峰值电流电流检测INA24080V共模电压电源管理TPS54303A降压DCDC4.2 软件控制逻辑电机控制的核心状态机包含以下几个状态初始化GPIO、定时器、ADC初始化待机PWM输出关闭电机刹车运行根据指令输出PWM故障处理过流/过热保护一个实用的速度控制函数实现如下void Motor_SetSpeed(int16_t speed) { // 限幅处理 speed constrain(speed, -MAX_SPEED, MAX_SPEED); // 方向控制 if(speed 0) { HAL_TIMEx_PWMN_Stop(htim1, TIM_CHANNEL_1); HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_1); } else { HAL_TIM_PWM_Stop(htim1, TIM_CHANNEL_1); HAL_TIMEx_PWMN_Start(htim1, TIM_CHANNEL_1); } // PWM占空比设置 __HAL_TIM_SET_COMPARE(htim1, TIM_CHANNEL_1, abs(speed)); }4.3 保护机制实现可靠的驱动系统必须包含三重保护硬件保护快熔保险丝MOSFET栅极下拉软件保护ADC实时电流监测定时器硬件保护刹车信号直接切断PWM电流保护的典型实现代码#define OVER_CURRENT_THRESHOLD 3000 // 3A void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { static uint32_t over_current_count 0; float current ADC_Value * 3.3 / 4096 / 0.05; // 50mΩ采样电阻 if(current OVER_CURRENT_THRESHOLD) { over_current_count; if(over_current_count 5) { HAL_TIMEx_PWMN_Stop(htim1, TIM_CHANNEL_1); HAL_TIM_PWM_Stop(htim1, TIM_CHANNEL_1); // 触发硬件刹车 HAL_TIM_GenerateEvent(htim1, TIM_EVENTSOURCE_BREAK); } } else { over_current_count 0; } }

更多文章