基于STM32和TB6593FNG的直流电机PID控制方案

发布时间:2026/7/9 13:19:29

基于STM32和TB6593FNG的直流电机PID控制方案 1. 项目背景与核心组件选型在工业自动化和嵌入式控制领域直流电机因其结构简单、控制方便等优势被广泛应用。但如何实现精确的转速控制和性能优化一直是工程师面临的挑战。本次项目基于东芝半导体TB6593FNG驱动芯片和STMicroelectronics的STM32F302R8微控制器构建了一套高性价比的直流电机控制系统。TB6593FNG是一款采用LD MOS结构的全桥驱动器具有0.35Ω的低导通电阻5V供电时工作电压范围2.5-13V最大持续输出电流1A。其内置热关断和欠压锁定保护功能特别适合中小功率直流电机驱动。与普通L298N等驱动芯片相比它的PWM控制频率可达100kHz支持更精细的速度调节。STM32F302R8属于STM32F3系列搭载Cortex-M4内核主频72MHz具备硬件FPU和DSP指令集。其高级定时器如TIM1支持互补PWM输出死区时间可编程正好匹配TB6593FNG的控制需求。我们选用这款MCU的另一个重要原因是其内置的运放和比较器可以方便实现电流检测等电机控制关键功能。2. 硬件系统设计与接口配置2.1 电机驱动电路设计TB6593FNG的典型应用电路如图1所示。关键设计要点包括VM电源端子接7.4V锂电池组为电机提供动力电源VCC逻辑电源由STM32开发板的3.3V输出供电OUT1/OUT2连接直流电机两端PWM输入接STM32的PA8TIM1_CH1IN1/IN2方向控制分别接PA11和PA12重要提示在VM电源端必须并联100μF电解电容和0.1μF陶瓷电容位置尽量靠近芯片引脚以抑制电机启停时的电压波动。2.2 STM32外围电路设计STM32F302R8的最小系统包括电源电路AMS1117-3.3稳压芯片输入范围4.5-12V调试接口SWD四线制SWDIO、SWCLK、GND、VCC保护电路电机电源与逻辑电源之间加入光耦隔离电流检测0.1Ω采样电阻STM32内置运放特别要注意TIM1定时器的配置TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; TIM_OCInitTypeDef TIM_OCInitStruct; // 72MHz/72 1MHz计数频率 TIM_TimeBaseStruct.TIM_Prescaler 71; TIM_TimeBaseStruct.TIM_Period 999; // 1MHz/(9991)1kHz PWM频率 TIM_TimeBaseStruct.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, TIM_TimeBaseStruct); // PWM模式1占空比可调 TIM_OCInitStruct.TIM_OCMode TIM_OCMode_PWM1; TIM_OCInitStruct.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStruct.TIM_Pulse 0; // 初始占空比0% TIM_OC1Init(TIM1, TIM_OCInitStruct);3. 电机控制算法实现3.1 基础PWM调速通过调节PWM占空比实现开环速度控制是最基础的方法。实测某JGA25-370电机的转速-占空比关系如下表占空比(%)空载转速(RPM)负载转速(RPM)电流(A)2010506800.1540210014500.2860315021000.4280420028500.55100520035000.703.2 转速单闭环PID控制在开环控制基础上增加编码器反馈构成闭环系统。我们采用200线光电编码器通过STM32的TIM2编码器接口模式进行四倍频得到800脉冲/转的分辨率。PID算法实现关键代码typedef struct { float Kp, Ki, Kd; float integral; float prev_error; } PIDController; float PID_Update(PIDController* pid, float setpoint, float measurement) { float error setpoint - measurement; pid-integral error * dt; if(pid-integral INTEGRAL_MAX) pid-integral INTEGRAL_MAX; if(pid-integral -INTEGRAL_MAX) pid-integral -INTEGRAL_MAX; float derivative (error - pid-prev_error) / dt; pid-prev_error error; return pid-Kp*error pid-Ki*pid-integral pid-Kd*derivative; } // 定时中断中调用 void TIM3_IRQHandler() { static uint32_t last_count 0; uint32_t current_count TIM2-CNT; int32_t delta current_count - last_count; // 计算转速 (RPM) float rpm (delta * 60.0f) / (800 * dt); // PID计算 float output PID_Update(pid, target_rpm, rpm); output constrain(output, 0, 100); // 限制到0-100% // 更新PWM TIM1-CCR1 (uint16_t)(output * 10); last_count current_count; }3.3 动态刹车控制TB6593FNG支持两种刹车模式滑行停止IN1IN20电机自由停止停止时间长快速刹车IN1IN21电机两端短路产生制动力矩实测对比数据刹车方式从3000RPM到停止时间(ms)能量回收效率滑行停止12000%快速刹车300约30%刹车控制代码示例void brake_motor(uint8_t mode) { if(mode COAST) { GPIO_WriteBit(GPIOA, GPIO_Pin_11, 0); // IN10 GPIO_WriteBit(GPIOA, GPIO_Pin_12, 0); // IN20 } else if(mode BRAKE) { GPIO_WriteBit(GPIOA, GPIO_Pin_11, 1); // IN11 GPIO_WriteBit(GPIOA, GPIO_Pin_12, 1); // IN21 } }4. 系统优化与性能测试4.1 PWM频率优化通过实验对比不同PWM频率下的电机性能频率(kHz)电机噪音温升(℃)低速平稳性1明显12差5中等8一般10轻微5好20很小3很好50无感2优秀实际测试发现当频率超过20kHz后TB6593FNG的开关损耗会明显增加。建议在10-20kHz之间选择折中值。4.2 电流限制保护利用STM32的ADC监测采样电阻电压实现过流保护#define CURRENT_LIMIT 1.0f // 1A限流 void check_current() { float voltage ADC_Read(ADC1, ADC_Channel_1) * 3.3f / 4096.0f; float current voltage / 0.1f; // 0.1Ω采样电阻 if(current CURRENT_LIMIT) { brake_motor(BRAKE); // 紧急刹车 Error_Handler(); // 进入错误处理 } }4.3 完整性能测试数据在额定负载下测试系统性能指标参数测试值转速控制精度±5 RPM响应时间(10%-90%)0.8s效率(额定负载)85%待机电流2.1mA最大持续输出功率7.4WPWM分辨率0.1%5. 常见问题与解决方案5.1 电机启动困难现象高占空比下电机抖动但不转原因启动电流不足解决采用软启动策略初始给50%占空比20ms后升至目标值修改电机启动代码void start_motor(uint8_t dir, uint16_t target_duty) { // 初始50%占空比 uint16_t init_duty target_duty 500 ? 500 : target_duty; set_motor_speed(dir, init_duty); delay_ms(20); set_motor_speed(dir, target_duty); // 升至目标值 }5.2 转速波动大现象闭环控制时转速周期性波动原因PID参数不合适或编码器信号干扰解决步骤检查编码器接线是否使用双绞线在编码器电源端加0.1μF去耦电容重新整定PID参数先设KiKd0增大Kp直到出现小幅振荡取此时Kp值的50%作为最终Kp增大Ki直到静差消除最后加入少量Kd抑制超调5.3 TB6593FNG过热保护现象工作一段时间后电机突然停止诊断测量芯片温度可用红外测温仪检查VM电压是否在规格范围内确认电机电流是否超限优化方案增加散热片面积降低PWM频率至10kHz检查PCB布局电源走线宽度≥1mm大电流路径尽量短避免90度转角走线6. 进阶功能扩展6.1 双闭环控制实现在速度环基础上增加电流环进一步提升动态性能。电流环采样频率建议≥10kHz使用STM32的ADC定时触发模式void ADC1_2_IRQHandler() { static uint32_t raw_current; raw_current ADC_GetConversionValue(ADC1); // 低通滤波 static float filtered_current 0; filtered_current 0.9*filtered_current 0.1*(raw_current*3.3f/4096.0f/0.1f); // 电流环PI计算 current_error current_ref - filtered_current; current_integral current_error * current_Ki; current_output current_Kp * current_error current_integral; // 限制输出范围 current_output constrain(current_output, 0, 1000); TIM1-CCR1 (uint16_t)current_output; }6.2 能量回馈制动通过修改电路实现刹车能量回收在VM端增加超级电容储能使用MOSFET构建同步整流电路检测母线电压超过阈值时启动能量回收关键电路改动增加IRF3205 MOSFET作为反向导通开关采用LM393比较器监控VM电压储能电容选用16V/1F超级电容6.3 无线监控接口通过蓝牙或Wi-Fi添加远程监控功能HC-05蓝牙模块连接USART2定义简单通信协议S转速设置目标转速G获取当前转速B模式设置刹车模式示例代码框架void USART2_IRQHandler() { static char cmd[10]; static uint8_t idx 0; char c USART_ReceiveData(USART2); if(c \n) { process_command(cmd); idx 0; memset(cmd, 0, 10); } else { cmd[idx] c; } } void process_command(char* cmd) { switch(cmd[0]) { case S: target_rpm atoi(cmd1); break; case G: send_status(); break; case B: brake_mode atoi(cmd1); break; } }

相关新闻