STM32实战:用TB6612驱动模块控制直流电机(附完整代码)
STM32实战用TB6612驱动模块控制直流电机附完整代码在智能小车、机械臂等嵌入式开发项目中直流电机控制是最基础也最关键的环节之一。对于刚接触STM32的开发者来说如何通过单片机精准控制电机转速和转向往往成为项目推进的第一个技术门槛。本文将手把手带你完成从硬件连接到代码编写的全流程实战使用TB6612这款高性价比驱动模块配合STM32的PWM功能实现直流电机的双向调速控制。1. 硬件选型与电路设计1.1 TB6612模块核心特性TB6612FNG是东芝推出的双通道H桥驱动芯片相比传统的L298N具有明显优势参数TB6612FNGL298N工作电流1.2A1A峰值电流3.2A2A待机电流0μA2mA工作电压2.5-10V4.8-46V效率92%60%关键引脚说明VM电机供电建议4.5-10VVCC逻辑电平输入2.7-5.5VAIN1/AIN2电机A控制输入PWMA电机A PWM输入STBY使能引脚高电平工作1.2 典型接线方案// STM32与TB6612连接示例 TB6612_STBY - PA0 // 使能控制 TB6612_AIN1 - PA1 // 方向控制1 TB6612_AIN2 - PA2 // 方向控制2 TB6612_PWMA - PA3 // PWM速度控制 TB6612_VM - 7.4V锂电池 TB6612_GND - 共地注意电机供电与逻辑供电必须共地PWM频率建议在1kHz-10kHz之间。大电流场景下务必在VM端并联100μF以上电容。2. STM32 PWM配置详解2.1 定时器基础配置使用TIM3的通道1生成PWM波关键参数计算// 时钟树配置示例72MHz主频 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseInitTypeDef TIM_InitStruct; TIM_InitStruct.TIM_Period 999; // ARR值 TIM_InitStruct.TIM_Prescaler 71; // 预分频 // 输出PWM频率 72MHz / (711) / (9991) 1kHz2.2 PWM输出配置技巧TIM_OCInitTypeDef PWM_OCInit; PWM_OCInit.TIM_OCMode TIM_OCMode_PWM1; PWM_OCInit.TIM_OutputState TIM_OutputState_Enable; PWM_OCInit.TIM_Pulse 500; // 初始占空比50% TIM_OC1Init(TIM3, PWM_OCInit); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);常见问题排查无PWM输出检查GPIO是否配置为复用推挽输出波形畸变降低预分频系数提高计数器时钟控制不灵敏调整ARR值改变分辨率3. 电机驱动层实现3.1 方向控制逻辑通过AIN1/AIN2的组合决定电机转向AIN1AIN2电机状态00刹车01反转10正转11刹车3.2 完整驱动代码// motor.h typedef enum { MOTOR_STOP, MOTOR_CW, // 顺时针 MOTOR_CCW // 逆时针 } MotorDir; void Motor_Init(void); void Motor_Set(MotorDir dir, uint8_t speed);// motor.c #include stm32f10x_gpio.h #include stm32f10x_tim.h #define MOTOR_AIN1_PIN GPIO_Pin_1 #define MOTOR_AIN2_PIN GPIO_Pin_2 #define MOTOR_PWMA_PIN GPIO_Pin_3 void Motor_Init() { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 方向控制引脚 GPIO_InitStruct.GPIO_Pin MOTOR_AIN1_PIN | MOTOR_AIN2_PIN; GPIO_InitStruct.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStruct); // PWM初始化略 } void Motor_Set(MotorDir dir, uint8_t speed) { switch(dir) { case MOTOR_CW: GPIO_SetBits(GPIOA, MOTOR_AIN1_PIN); GPIO_ResetBits(GPIOA, MOTOR_AIN2_PIN); break; case MOTOR_CCW: GPIO_ResetBits(GPIOA, MOTOR_AIN1_PIN); GPIO_SetBits(GPIOA, MOTOR_AIN2_PIN); break; default: GPIO_ResetBits(GPIOA, MOTOR_AIN1_PIN); GPIO_ResetBits(GPIOA, MOTOR_AIN2_PIN); } TIM_SetCompare1(TIM3, speed); // 更新PWM占空比 }4. 应用层开发实例4.1 按键调速实现// main.c #include motor.h #include key.h int main() { uint8_t speed 0; Motor_Init(); Key_Init(); while(1) { if(Key_Pressed(KEY_UP)) { speed (speed 100) ? speed 10 : 100; Motor_Set(MOTOR_CW, speed); } else if(Key_Pressed(KEY_DOWN)) { speed (speed 0) ? speed - 10 : 0; Motor_Set(speed ? MOTOR_CW : MOTOR_STOP, speed); } Delay_ms(100); } }4.2 PID速度闭环控制对于需要精确调速的场景可以引入编码器反馈// pid.c typedef struct { float Kp, Ki, Kd; float error, lastError; float integral; } PID; float PID_Update(PID* pid, float setpoint, float feedback) { pid-error setpoint - feedback; pid-integral pid-error; float output pid-Kp * pid-error pid-Ki * pid-integral pid-Kd * (pid-error - pid-lastError); pid-lastError pid-error; return output; }实际调试中发现当电机负载突变时单纯的比例控制会出现明显抖动。加入微分项后系统响应更平稳但需要注意避免高频噪声带来的干扰。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2438250.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!