STM32F103C8T6驱动直流电机:DRV8833的两种PWM接线方案详解与代码实战
STM32F103C8T6驱动直流电机DRV8833的两种PWM接线方案详解与代码实战在智能车、机器人等嵌入式项目中直流电机的驱动控制往往是核心环节之一。DRV8833作为一款性价比较高的双H桥电机驱动芯片能够同时驱动两个直流电机或一个步进电机非常适合资源有限的STM32F103C8T6等Cortex-M3内核单片机。本文将深入探讨DRV8833的两种典型PWM控制方案从硬件连接到代码实现帮助开发者根据项目需求做出合理选择。1. DRV8833基础与两种控制方案概述DRV8833是德州仪器TI推出的一款低压双H桥电机驱动器工作电压范围2.7V-10.8V持续输出电流1.5A峰值2A。其内部包含两个全H桥电路每个H桥可独立控制一个直流电机。芯片的主要特性包括低导通电阻典型值305mΩ内置欠压锁定UVLO和过流保护OCP热关断保护TSDPWM频率支持高达250kHz针对直流电机控制DRV8833提供了两种典型的输入信号配置方式四路PWM模式四个输入引脚(IN1-IN4)全部连接MCU的PWM输出引脚混合模式两路PWM配合两路GPIO如IN1/IN2接PWMGPIOIN3/IN4接PWMGPIO这两种方案在硬件连接、代码实现和控制灵活性上各有特点开发者需要根据具体应用场景选择。下面我们将分别详细解析这两种方案。2. 四路PWM模式详解2.1 硬件连接方案在四路PWM模式下DRV8833的四个输入引脚全部连接到STM32的PWM输出引脚。以STM32F103C8T6为例典型连接方式如下DRV8833引脚STM32连接定时器通道IN1PB0TIM3_CH3IN2PB1TIM3_CH4IN3PA2TIM2_CH3IN4PA3TIM2_CH4VCC电机电源(2.7-10.8V)-GND共同地-OUT1/OUT2电机1-OUT3/OUT4电机2-注意STM32F103C8T6只有TIM1-TIM4四个通用定时器其中TIM1是高级定时器TIM2-TIM4是通用定时器。每个定时器通常有4个通道但具体可用通道需参考芯片数据手册。2.2 代码实现在STM32CubeIDE或Keil环境下需要配置定时器产生PWM信号。以下是使用标准外设库的初始化代码示例// PWM初始化函数 void PWM_Init(void) { // 启用时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); // 配置GPIO为复用推挽输出 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed GPIO_Speed_50MHz; // PA2(IN3), PA3(IN4) - TIM2 GPIO_InitStruct.GPIO_Pin GPIO_Pin_2 | GPIO_Pin_3; GPIO_Init(GPIOA, GPIO_InitStruct); // PB0(IN1), PB1(IN2) - TIM3 GPIO_InitStruct.GPIO_Pin GPIO_Pin_0 | GPIO_Pin_1; GPIO_Init(GPIOB, GPIO_InitStruct); // 定时器基础配置 TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; TIM_TimeBaseStruct.TIM_Period 1000 - 1; // ARR值决定PWM频率 TIM_TimeBaseStruct.TIM_Prescaler 72 - 1; // 时钟预分频72MHz/721MHz TIM_TimeBaseStruct.TIM_ClockDivision 0; TIM_TimeBaseStruct.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, TIM_TimeBaseStruct); TIM_TimeBaseInit(TIM3, TIM_TimeBaseStruct); // PWM模式配置 TIM_OCInitTypeDef TIM_OCStruct; TIM_OCStruct.TIM_OCMode TIM_OCMode_PWM1; TIM_OCStruct.TIM_OutputState TIM_OutputState_Enable; TIM_OCStruct.TIM_OCPolarity TIM_OCPolarity_High; TIM_OCStruct.TIM_Pulse 0; // 初始占空比0% // 配置TIM2通道3(PA2)和通道4(PA3) TIM_OC3Init(TIM2, TIM_OCStruct); TIM_OC4Init(TIM2, TIM_OCStruct); // 配置TIM3通道3(PB0)和通道4(PB1) TIM_OC3Init(TIM3, TIM_OCStruct); TIM_OC4Init(TIM3, TIM_OCStruct); // 启用定时器 TIM_Cmd(TIM2, ENABLE); TIM_Cmd(TIM3, ENABLE); }2.3 控制逻辑与优缺点分析四路PWM模式下电机的控制逻辑如下电机1控制IN1 PWM占空比 IN2 PWM占空比正转速度由差值决定IN1 PWM占空比 IN2 PWM占空比反转速度由差值决定IN1 IN2电机停止实际应用中建议设置完全相同或都为0电机2控制IN3 PWM占空比 IN4 PWM占空比正转IN3 PWM占空比 IN4 PWM占空比反转IN3 IN4电机停止这种方案的优点包括控制灵活可以独立调节每个电机的正反转速度可以实现更平滑的速度过渡编程接口统一全部使用PWM控制缺点主要是占用更多的PWM资源四个通道对定时器资源要求较高在复杂项目中可能造成资源紧张代码稍复杂需要同时管理多个PWM通道3. 两路PWM两路GPIO混合模式详解3.1 硬件连接方案在混合模式下每个电机使用一路PWM和一路GPIO控制。典型连接方式如下DRV8833引脚STM32连接功能IN1PA4GPIO方向控制IN2PB1TIM3_CH4 PWM速度IN3PA5GPIO方向控制IN4PB0TIM3_CH3 PWM速度VCC电机电源-GND共同地-OUT1/OUT2电机1-OUT3/OUT4电机2-3.2 代码实现混合模式需要配置PWM和GPIO两部分// GPIO和PWM初始化 void Motor_Init(void) { // 启用时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); // 配置方向控制GPIO(PA4, PA5) GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Pin GPIO_Pin_4 | GPIO_Pin_5; GPIO_Init(GPIOA, GPIO_InitStruct); // 配置PWM引脚(PB0, PB1) GPIO_InitStruct.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Pin GPIO_Pin_0 | GPIO_Pin_1; GPIO_Init(GPIOB, GPIO_InitStruct); // 定时器基础配置 TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; TIM_TimeBaseStruct.TIM_Period 1000 - 1; TIM_TimeBaseStruct.TIM_Prescaler 72 - 1; TIM_TimeBaseStruct.TIM_ClockDivision 0; TIM_TimeBaseStruct.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, TIM_TimeBaseStruct); // PWM模式配置 TIM_OCInitTypeDef TIM_OCStruct; TIM_OCStruct.TIM_OCMode TIM_OCMode_PWM1; TIM_OCStruct.TIM_OutputState TIM_OutputState_Enable; TIM_OCStruct.TIM_OCPolarity TIM_OCPolarity_High; TIM_OCStruct.TIM_Pulse 0; TIM_OC3Init(TIM3, TIM_OCStruct); // PB0 TIM_OC4Init(TIM3, TIM_OCStruct); // PB1 TIM_Cmd(TIM3, ENABLE); }3.3 控制逻辑与优缺点分析混合模式下的控制逻辑电机1控制PA40, PB1 PWM正转速度由PWM占空比决定PA41, PB1 PWM反转速度由PWM占空比决定PB1 PWM0电机停止无论PA4状态电机2控制PA50, PB0 PWM正转PA51, PB0 PWM反转PB0 PWM0电机停止这种方案的优点包括节省PWM资源只需要两个PWM通道方向控制简单直观代码实现相对简单主要缺点是速度控制精度略低方向切换时可能需要短暂延时无法实现某些高级控制算法4. 方案选择与实际应用建议4.1 两种方案的对比总结对比项四路PWM模式两路PWMGPIO模式PWM资源占用4通道2通道GPIO资源占用02控制灵活性高中速度控制精度高中代码复杂度较高较低适用场景需要精确控制的项目资源紧张或简单控制项目4.2 实际应用中的选择建议选择四路PWM模式的情况需要独立精确控制每个电机的正反转速度项目对电机控制平滑性要求高系统有足够的定时器资源可用需要实现复杂的运动控制算法选择混合模式的情况MCU的PWM资源紧张只需要简单的正反转和速度控制项目对电机控制精度要求不高需要保留定时器资源用于其他功能4.3 性能优化与注意事项无论选择哪种方案以下几点都值得注意PWM频率选择对于直流电机通常选择5kHz-20kHz的PWM频率。频率太低可能产生可闻噪声太高则可能增加驱动损耗。死区时间在四路PWM模式下应确保不会出现同一H桥上下管同时导通的情况。虽然DRV8833内置了死区时间保护但在软件中也应避免设置冲突的PWM值。电源设计确保电机电源与MCU电源共地在电机电源端添加足够容量的滤波电容如100μF电解电容并联0.1μF陶瓷电容考虑添加电流检测电阻和电路用于过流保护散热处理DRV8833在驱动大电流时会产生热量建议添加散热片或保持良好通风可以监测芯片温度或实现热关断保护// 示例安全控制函数四路PWM模式 void SetMotorSpeed(uint8_t motorNum, int16_t speed) { // 限制速度范围(-1000到1000) speed (speed 1000) ? 1000 : ((speed -1000) ? -1000 : speed); if(motorNum 1) { // 电机1 if(speed 0) { TIM_SetCompare3(TIM3, 0); // IN1 TIM_SetCompare4(TIM3, speed); // IN2 } else { TIM_SetCompare3(TIM3, -speed); // IN1 TIM_SetCompare4(TIM3, 0); // IN2 } } else { // 电机2 if(speed 0) { TIM_SetCompare3(TIM2, 0); // IN3 TIM_SetCompare4(TIM2, speed); // IN4 } else { TIM_SetCompare3(TIM2, -speed); // IN3 TIM_SetCompare4(TIM2, 0); // IN4 } } }在实际机器人项目中混合模式可能是更实用的选择因为它节省了宝贵的PWM资源可以用于其他传感器或执行器。而对于需要精确运动控制的应用如3D打印机或CNC机床四路PWM模式提供的更高控制精度可能更为重要。