STM32与TB6593FNG实现直流电机PID控制方案

1. 项目背景与核心需求

在工业自动化、机器人控制和小型家电领域,直流电机因其结构简单、控制方便、成本低廉等优势,仍然是运动控制系统的首选执行机构。但传统基于L298N等通用驱动芯片的方案存在效率低、发热大、控制精度不足等问题,这促使我们探索更专业的驱动方案。

TB6593FNG是东芝公司推出的一款三相PWM驱动IC,专为无刷直流电机(BLDC)和有刷直流电机设计。其内置的预驱动电路和MOSFET能够提供高达2.5A的持续输出电流,PWM频率可调范围宽(5kHz-100kHz),支持正向/反向/制动/停止四种工作模式。与STM32F091RC这款Cortex-M0内核微控制器的组合,可以实现从简单开环控制到复杂闭环算法的完整解决方案。

2. 硬件系统设计与关键器件选型

2.1 TB6593FNG驱动芯片详解

这款驱动IC采用HSSOP36封装,内部集成三个半桥电路,每个桥臂的上下管都内置了死区时间控制(典型值1.2μs),有效防止直通短路。其关键特性包括:

  • 工作电压范围:VM=6.5-42V,VCC=5.5-7V
  • 输出电流能力:峰值3.5A(持续2.5A)
  • 内置温度保护(TSD)和欠压锁定(UVLO)
  • 支持3.3V/5V逻辑电平输入

在实际PCB布局时需要注意:

  1. VM电源引脚必须就近放置100μF以上的电解电容
  2. 每个输出相位应串联0.1Ω左右的电流检测电阻
  3. 芯片底部散热焊盘需通过多个过孔连接至大面积铜箔

2.2 STM32F091RC控制器配置

这款48MHz主频的ARM Cortex-M0微控制器具有丰富的外设资源:

  • 16通道DMA控制器减轻CPU负担
  • 多达12个定时器,其中TIM1/TIM3支持6路互补PWM输出
  • 12位ADC采样速率可达1MSPS
  • USART/I2C/SPI等多种通信接口

特别适合电机控制的配置方式:

// 定时器PWM初始化示例 TIM1->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; // PWM模式1 TIM1->CCER |= TIM_CCER_CC1E; // 输出使能 TIM1->BDTR |= TIM_BDTR_MOE; // 主输出使能 TIM1->CR1 |= TIM_CR1_CEN; // 计数器使能

3. 电机控制算法实现

3.1 基础PWM调速方案

最简单的开环速度控制可通过调节PWM占空比实现:

void SetMotorSpeed(uint8_t percent) { uint16_t pulse = (TIM1->ARR * percent) / 100; TIM1->CCR1 = pulse; // 更新比较值 }

但这种方法存在明显缺点:

  • 负载变化时转速不稳定
  • 启动/停止时容易产生电流冲击
  • 低速时转矩脉动明显

3.2 增量式PID闭环控制

引入编码器反馈后,可实现更精确的速度控制。增量式PID算法实现如下:

typedef struct { float Kp, Ki, Kd; float last_error, prev_error; float output; } PID_Controller; void PID_Update(PID_Controller* pid, float error) { float delta = error - pid->last_error; pid->output += pid->Kp * delta + pid->Ki * error + pid->Kd * (delta - (pid->last_error - pid->prev_error)); pid->prev_error = pid->last_error; pid->last_error = error; }

参数整定经验:

  1. 先设Ki=Kd=0,逐渐增大Kp直到系统开始振荡
  2. 取振荡时Kp值的60%作为最终比例系数
  3. Ki值设为0.1*Kp开始调试
  4. Kd值通常为Kp的1/10到1/5

3.3 电流环保护设计

通过0.1Ω采样电阻检测电机电流,ADC配置要点:

ADC1->CHSELR = ADC_CHSELR_CHSEL1; // 选择通道1 ADC1->SMPR = ADC_SMPR_SMP_7; // 239.5周期采样时间 ADC1->CFGR1 |= ADC_CFGR1_CONT; // 连续转换模式 ADC1->CR |= ADC_CR_ADEN; // 使能ADC

过流保护逻辑:

#define CURRENT_LIMIT 2.0 // 2A限流值 if(ADC_Value * 3.3 / 4096 / 0.1 > CURRENT_LIMIT) { TIM1->BDTR &= ~TIM_BDTR_MOE; // 立即关闭输出 Fault_Handler(); }

4. 系统集成与性能优化

4.1 硬件布局关键点

  1. 功率回路与信号回路严格分离
  2. 电机相位线采用双绞线减少辐射干扰
  3. 在VM电源入口处放置TVS二极管抑制电压尖峰
  4. 所有数字信号线串联33Ω电阻抑制振铃

4.2 软件架构设计

推荐采用状态机模式组织控制逻辑:

typedef enum { MOTOR_STOP, MOTOR_STARTUP, MOTOR_RUN, MOTOR_BRAKE, MOTOR_FAULT } MotorState; void Motor_StateMachine(MotorState* state) { static uint32_t timer; switch(*state) { case MOTOR_STOP: if(Start_Cmd) { *state = MOTOR_STARTUP; timer = HAL_GetTick(); } break; case MOTOR_STARTUP: if(HAL_GetTick() - timer > 500) { *state = MOTOR_RUN; } break; // 其他状态处理... } }

4.3 实测性能指标

在24V供电、负载惯量0.01kg·m²条件下测试:

  • 速度响应时间:<100ms(0-3000rpm)
  • 稳态速度误差:<±5rpm
  • 效率:85%@2A负载
  • 温升:<30℃(连续工作2小时)

5. 典型问题排查与解决

5.1 电机启动困难

现象:上电后电机抖动但不旋转 可能原因及解决方案:

  1. PWM死区时间不足 → 调整TIMx_BDTR寄存器DTCFG位
  2. 霍尔传感器相位错误 → 检查接线顺序
  3. 启动电流不足 → 增加启动阶段的PWM占空比斜率

5.2 高频噪声问题

现象:电机运行时伴随刺耳啸叫 解决方法:

  1. 调整PWM频率至18kHz以上(超出人耳范围)
  2. 在电机端子并联0.1μF陶瓷电容
  3. 检查MOSFET栅极驱动电阻(推荐10-22Ω)

5.3 通信干扰

现象:UART数据在电机运行时出现误码 抗干扰措施:

  1. 采用差分信号传输(如RS485)
  2. 在通信线上加装磁环
  3. 软件上增加CRC校验和重传机制

6. 进阶功能扩展

6.1 能量回馈制动

通过检测母线电压实现:

if(BusVoltage > 28.0f) { // 24V系统允许10%过压 TIM1->CCMR1 |= TIM_CCMR1_OC1M_0; // 强制低电平 TIM1->CCMR1 &= ~TIM_CCMR1_OC1M_1; }

6.2 CAN总线通信集成

STM32F091RC内置CAN控制器,配置示例:

CAN->MCR |= CAN_MCR_INRQ; // 进入初始化模式 CAN->BTR = (5 << CAN_BTR_TS1_Pos) | (6 << CAN_BTR_TS2_Pos) | (4 << CAN_BTR_BRP_Pos); // 500kbps @48MHz CAN->MCR &= ~CAN_MCR_INRQ; // 退出初始化

6.3 参数自动整定

通过频率响应法自动计算PID参数:

  1. 施加阶跃信号并记录响应曲线
  2. 根据Ziegler-Nichols法则计算参数
  3. 写入Flash保存用户设置

在完成基础功能后,建议使用J-Scope等工具实时监控关键变量,进一步优化控制参数。实际项目中,电机参数识别(如电阻、电感测量)功能的加入可以显著提升系统适应性。