1. 项目概述:为什么选择STM32控制直流有刷电机?
在工业自动化和小型设备中,直流有刷电机凭借其结构简单、成本低廉(通常比无刷电机低30%-50%)和启动转矩大的特点,仍然是许多场景的首选动力源。但传统基于555定时器或专用驱动芯片的方案存在明显短板——我在实际项目中多次遇到调速精度不足(客户反馈速度波动超过10%)、响应速度慢(急停需要200ms以上)以及缺乏智能保护功能的问题。
STM32F103系列单片机(特别是C8T6这款性价比之王)完美解决了这些痛点。它内置的高级定时器TIM1可以直接生成带死区控制的互补PWM波,72MHz的主频确保PID运算能够实时执行,12位ADC让电流电压检测分辨率达到千分之一级别。更关键的是,整套方案BOM成本可以控制在60元以内,这比市面上大多数成品驱动器便宜至少40%。
2. 硬件设计:从原理图到PCB的实战细节
2.1 主控模块选型与配置要点
STM32F103C8T6这颗芯片的选择绝非偶然。相比同价位国产替代品,它的优势在于:
- 定时器资源丰富:TIM1支持6路PWM输出(本设计只用其中两路,为多电机控制预留扩展空间)
- 编码器接口:TIM2/TIM4原生支持正交编码器模式,省去外部计数芯片
- 内存配置:64KB Flash完全够用,20KB RAM确保PID运算缓冲区充足
重要提示:购买时务必选择正品,我曾遇到过某宝上的"兼容版"芯片ADC线性度不达标导致速度检测异常的问题。建议通过正规代理商渠道采购。
2.2 驱动电路设计避坑指南
TB6612FNG驱动芯片的选择经历了三次迭代:
- 最初试用L298N:发热严重(满载时需加装5cm²散热片),效率仅70%左右
- 尝试DRV8871:单通道设计需要两颗芯片,布线面积增加
- 最终选定TB6612FNG:双通道集成,效率达90%以上,内置短路保护
关键电路设计细节:
c复制// 典型驱动电路连接方式
PWMA → TIM1_CH1N // 注意使用互补通道
PWMB → TIM1_CH2N
AIN1 → PC13 // 方向控制
AIN2 → PC14
STBY → 常接高电平
2.3 电流检测的精度提升技巧
ACS712模块的5A量程版本实际使用中存在两个痛点:
- 零点漂移:上电时输出并非精确的2.5V
- 温度影响:长时间工作后基准电压会偏移
我的解决方案是:
- 软件上电自校准:启动时记录10次ADC平均值作为基准
- 硬件上在VCC与GND之间并联100nF+10μF电容组合
- 实际测试显示,经过校准后电流检测误差可控制在±50mA以内
3. 软件架构:如何实现μs级实时控制
3.1 定时器配置的黄金参数
TIM1的PWM生成配置需要特别注意三个参数:
c复制TIM_TimeBaseStructure.TIM_Period = 720-1; // 10kHz PWM频率(72MHz/720)
TIM_OCInitStructure.TIM_Pulse = 360; // 初始50%占空比
TIM_BDTRInitStructure.TIM_DeadTime = 72; // 1μs死区时间(72MHz时钟)
死区时间设置过小会导致MOS管直通,过大则降低控制精度。经过示波器实测,1μs是最佳平衡点。
3.2 增量式PID算法的工程实现
不同于位置式PID,增量式算法更适应电机控制场景:
c复制typedef struct {
float Kp, Ki, Kd;
float last_error, prev_error;
} PID_IncTypeDef;
float PID_Inc_Calc(PID_IncTypeDef *pid, float error) {
float delta = pid->Kp * (error - pid->last_error)
+ pid->Ki * error
+ pid->Kd * (error - 2*pid->last_error + pid->prev_error);
pid->prev_error = pid->last_error;
pid->last_error = error;
return delta;
}
参数整定经验:
- 先设Ki=0,增大Kp直到出现轻微振荡
- 取振荡时Kp值的60%作为最终值
- 逐步增加Ki直到静态误差消除
- Kd一般取Kp的1/10~1/20
3.3 多控制源的无缝切换策略
系统需要同时支持按键、PWM模拟量和UART控制,我的实现方案是:
- 设置全局变量Control_Mode标记当前控制源
- 按键具有最高优先级,按下时自动切换为本地控制
- UART指令包含"Mode:X"字段可强制切换
- 每个控制源独立维护自己的目标速度值
4. 系统测试:从实验室到工业现场的挑战
4.1 标准测试流程
建立完整的测试文档非常重要,我的checklist包含:
- 空载特性测试
- 0→3000rpm阶跃响应
- 不同占空比下的转速线性度
- 负载特性测试
- 突加50%负载时的转速恢复时间
- 持续满载1小时温升监测
- 保护功能测试
- 故意短路电机线测试过流响应
- 调节电源电压测试过压/欠压保护
4.2 现场问题排查实录
在某食品包装产线部署时遇到典型问题:
现象:电机偶尔会突然降速后又恢复
排查过程:
- 检查电源电压——稳定12V无波动
- 监测PWM输出——占空比突然被修改
- 发现是UART接收缓冲区溢出导致错误指令解析
解决方案:
- 增加接收超时机制
- 添加指令CRC校验
- 限制最小速度更新间隔为100ms
5. 进阶优化:让性能更上一层楼
5.1 速度观测器设计
当编码器分辨率不足时(如只有11PPR),可以通过滑模观测器提升速度检测精度:
c复制float speed_estimator(float theta_measured) {
static float last_theta = 0;
float omega_est = (theta_measured - last_theta) / SAMPLING_TIME;
// 加入低通滤波
omega_filtered = 0.9*omega_filtered + 0.1*omega_est;
last_theta = theta_measured;
return omega_filtered;
}
5.2 参数自动整定方案
开发了一套基于极限环法的自动整定流程:
- 先给电机施加阶跃信号
- 采集振荡过程的幅值和周期
- 根据Ziegler-Nichols公式计算PID参数
- 存入Flash供下次调用
6. 生产注意事项
经过小批量(100台)生产验证,总结出以下制造要点:
- TB6612FNG焊接温度不得超过260℃(建议使用焊台而非回流焊)
- 电流检测模块与电机线至少保持3cm间距避免磁场干扰
- 每个控制器必须进行老化测试:满负载运行30分钟
- 软件烧录后需校准电流零点(可自动化完成)
这套方案目前已在3家工厂的输送带系统上稳定运行超过2000小时,期间仅出现1例因电源接反而导致的损坏,可靠性得到充分验证。对于需要更高性能的场景,可升级到STM32F4系列并采用FOC算法,但这将增加约40%的成本。