STM32实战:基于TB6612与编码器实现电机精准调速与闭环控制

张开发
2026/4/4 5:09:23 15 分钟阅读
STM32实战:基于TB6612与编码器实现电机精准调速与闭环控制
1. 硬件选型与连接指南TB6612电机驱动模块是控制直流电机的理想选择相比传统的L298N它具有更低的发热量和更高的效率。我在多个机器人项目中实测发现TB6612在12V电压下连续工作2小时模块表面温度仅升高约15℃而L298N在同样条件下温度会飙升到烫手的程度。模块上的VM引脚接电机电源建议12VVCC接STM32的3.3V三个GND都需要可靠接地。编码器电机通常有6根线最容易搞混的是电源线相序。去年调试智能车时我曾因接反编码器电源导致信号异常后来用彩色标签做了永久标记红色/黑色电机动力线最外侧棕色/蓝色编码器供电线中间黄色/白色AB相输出线最内侧STM32的引脚分配需要特别注意PWMA/PWMB必须连接到定时器的PWM输出通道如TIM1_CH1AIN1/AIN2等方向控制脚接普通GPIO即可。建议在CubeMX中预先规划好引脚避免与后续要用的编码器接口冲突。我常用的配置方案是// PWM输出配置示例TIM3通道1 TIM_OC_InitTypeDef sConfigOC {0}; sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 0; // 初始占空比0% sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(htim3, sConfigOC, TIM_CHANNEL_1);2. PWM驱动配置实战要让电机转起来PWM信号的频率选择很关键。通过示波器实测发现当频率低于1kHz时电机会有明显啸叫高于20kHz时驱动效率下降。我的经验值是8-10kHz既能保证静音又兼顾效率。在CubeMX中配置定时器时时钟树设置要注意假设主频72MHz预分频值设为72-1则计数器时钟为1MHz。若设置自动重载值ARR100-1则PWM频率1MHz/10010kHz。占空比通过修改CCR寄存器实现比如CCR30对应30%占空比。方向控制逻辑有四种组合新手最容易混淆AIN11, AIN20 → 正转AIN10, AIN21 → 反转AIN10, AIN20 → 刹车电机快速停止AIN11, AIN21 → 滑行电机惯性停止实际项目中遇到过因IO口初始化顺序导致电机异常启动的情况后来养成了先配置PWM再设置方向引脚的习惯HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_1); // 先启动PWM HAL_Delay(10); // 短暂延时 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, 1); // 再设置方向 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, 0);3. 编码器接口深度解析STM32的编码器模式堪称硬件级的神助攻。去年做平衡车时尝试过用外部中断软件计数结果在高速旋转时丢脉冲严重。改用TIM2的编码器接口后即使电机3000RPM也计数精准。关键配置点时钟配置确保定时器时钟使能GPIO设置AB相引脚配置为浮空输入不用上拉编码器模式选择模式3TI1和TI2边沿都计数TIM_Encoder_InitTypeDef sConfig {0}; sConfig.EncoderMode TIM_ENCODERMODE_TI12; sConfig.IC1Polarity TIM_ICPOLARITY_RISING; sConfig.IC1Selection TIM_ICSELECTION_DIRECTTI; sConfig.IC1Prescaler TIM_ICPSC_DIV1; sConfig.IC1Filter 0; sConfig.IC2Polarity TIM_ICPOLARITY_RISING; sConfig.IC2Selection TIM_ICSELECTION_DIRECTTI; sConfig.IC2Prescaler TIM_ICPSC_DIV1; sConfig.IC2Filter 0; HAL_TIM_Encoder_Init(htim2, sConfig);脉冲计算陷阱编码器线数×减速比×4才是真实脉冲数。曾因漏乘减速比导致速度计算错误10倍建议定义宏#define ENCODER_LINES 11 // 编码器线数 #define GEAR_RATIO 30 // 减速比 #define PULSE_PER_ROUND (ENCODER_LINES * GEAR_RATIO * 4) // 13204. 闭环控制实现技巧速度测量算法的精度取决于采样周期。在智能车竞赛中我们发现10ms采样周期既能快速响应又不会给CPU带来太大负担。速度计算公式速度(RPM) (ΔCNT × 60) / (PULSE_PER_ROUND × T0)其中ΔCNT是两次采样的计数器差值T0是采样周期秒。PID参数整定的实用技巧先调P直到出现振荡然后加入D抑制振荡最后用I消除静差。分享一个实测可用的初始参数float Kp 0.5, Ki 0.01, Kd 0.05; // 适用于12V减速电机 int16_t PID_Control(int16_t target, int16_t feedback) { static int16_t last_error 0; static int32_t integral 0; int16_t error target - feedback; integral error; if(integral 1000) integral 1000; // 抗积分饱和 else if(integral -1000) integral -1000; int16_t output Kp*error Ki*integral Kd*(error-last_error); last_error error; return output; }调试时建议用串口实时输出速度曲线我常用的打印格式printf(T:%d,F:%d,O:%d\n, target_speed, actual_speed, pwm_output);

更多文章