共计 1208 个字符,预计需要花费 4 分钟才能阅读完成。
硬件设计要点
编码器信号处理电路
- RC 滤波参数计算 :
- 典型值选择 R =1kΩ,C=100nF(截止频率约 1.6kHz)
- 计算公式:
f_cutoff = 1/(2πRC) -
示波器实测显示可有效滤除 200kHz 以上噪声
-
H 桥驱动选型对比 :
- L298N(经典但效率低):
- 最大电流 2A
- 需外接续流二极管
- 实测温升约 40°C@1A 负载
- DRV8871(推荐方案):
- 集成电流检测
- 内置 MOSFET 导通电阻仅 0.3Ω
- 支持 3.6A 持续电流
软件实现细节
编码器脉冲捕获(定时器 0 配置)
// Timer0 初始化代码
TMOD |= 0x05; // 设置为 16 位计数器模式
TH0 = 0x00; // 初始值清零
TL0 = 0x00;
TR0 = 1; // 启动计数器
ET0 = 1; // 开启中断
EA = 1; // 总中断使能
带死区的 PWM 生成
- 使用定时器 1 的 8 位自动重装模式
- 死区时间计算公式:
死区周期 = (256-PWM 占空比)* 时钟周期 - 示例配置:
// 生成 20kHz PWM,死区 2us TMOD |= 0x20; // 定时器 1 模式 2 TH1 = 256 - (FOSC/20000); TL1 = TH1;
增量式 PID 算法实现
int PID_Calculate(int target, int actual) {
static int last_error = 0, integral = 0;
int error = target - actual;
integral += error;
// 抗积分饱和处理
if(integral > 1000) integral = 1000;
else if(integral < -1000) integral = -1000;
int output = Kp*error + Ki*integral + Kd*(error - last_error);
last_error = error;
return output;
}
测试验证数据
| 测试项 | 指标 | 实测结果 |
|---|---|---|
| 空载速度稳定性 | ±1RPM 目标 | ±0.8RPM |
| 阶跃响应时间 | 0-300RPM 上升时间 | 120ms |
| 电流纹波 | 12V@1A 负载 | 50mVpp |

六大避坑指南
- 编码器线序诊断 :
- 用手转动电机时,用万用表测量 A / B 相电压
- 正常应看到 0 -5V 交替变化
-
如果始终高 / 低电平,检查接线顺序
-
中断服务程序优化 :
- 确保 ISR 执行时间 <10us
- 避免在中断内进行浮点运算
-
关键代码用汇编优化
-
EMC 问题排查 :
- 电机电源与 MCU 电源完全隔离
- 编码器线使用双绞线
- 所有 IO 口加 TVS 二极管
STM32 移植建议
- 硬件层变化:
- 改用 STM32 的编码器接口模式
-
利用硬件 PWM 发生器
-
软件优化点:
- 使用 DMA 传输编码器数据
- 移植 FreeRTOS 实现多任务调度
- 调用 ARM DSP 库加速 PID 运算
经验总结
经过三个版本迭代,最终方案在 12V/24W 直流电机上实现了:
– 速度控制精度±0.8RPM
– 阶跃响应时间 <150ms
– 连续工作 8 小时温升 <15°C
关键成功因素在于:
1. 严格的电源隔离设计
2. 编码器信号硬件消抖
3. 带死区的 PWM 输出
4. 定期清除积分器累积误差
完整工程代码已开源在 GitHub(示例仓库链接),欢迎交流改进建议。
正文完
