电机驱动解决“怎样施加输出”,编码器解决“车轮实际怎样运动”。当前工程使用 MSPM0G35XX 的硬件 QEI 统计左右正交编码器,周期性转换为 RPM,并累加为左右轮距离。
| 文档属性 | 内容 |
|---|---|
| 文档编号 | TI-CAR-04 |
| 硬件外设 | 左轮 TIMG8、右轮 TIMG9 的 QEI |
| 底层实现 | Motor_GetSpeed() |
| 调度入口 | Task_Encoder(),周期 10 ms |
| 消费者 | 速度 PID、位置控制、循迹阶段与停稳判断 |
1. 为什么使用 A/B 两相信号
正交编码器输出相位错开的 A、B 两路脉冲。QEI 外设不仅能统计边沿,还能根据相位顺序判断方向。相比在 GPIO 中断里手工计数,硬件 QEI 把高频边沿处理交给定时器,更适合稳定获取车轮位移。
empty.syscfg 中可以确认:
QEI_LEFT使用 TIMG8。QEI_RIGHT使用 TIMG9。- 每侧各配置 PHA 与 PHB 两个输入。
这些属于“已由配置确认”。轮径、减速比与每圈计数则是软件换算参数,仍需与实际机械结构保持一致。
2. 底层驱动怎样得到增量
Motor_Start() 启动 QEI,并保存左右计数器的初始值。每次 Motor_GetSpeed() 调用时读取当前 16 位计数,再计算:
本周期增量 = 当前计数 - 上次计数代码把差值转换为有符号 16 位数,因此能够在正常采样间隔下处理计数器回绕,并保留方向。随后应用编码器极性修正,把“车体前进”统一为正反馈。
3. 从脉冲到 RPM
驱动使用本周期脉冲增量、总分辨率和真实经过时间计算转速:
RPM = 增量计数 × 60000 ───────────────── 每圈总计数 × 周期毫秒数Task_Encoder() 不固定假设每次都恰好相隔 10 ms,而是用系统 tick 计算实际间隔,并在异常零值时回退到控制周期。这样能降低调度抖动对速度换算的直接影响。
结果分别写入 Encoder_Actual_Val[MOTOR_LEFT_INDEX] 和 Encoder_Actual_Val[MOTOR_RIGHT_INDEX],成为两个独立速度环的反馈。
4. 从累计计数到距离
单周期增量还会累加到 MotorEncoder_Sum[]。Encoder 任务再用左右各自的距离换算系数得到:
左轮距离 = 左轮累计计数 × 左轮每计数距离右轮距离 = 右轮累计计数 × 右轮每计数距离工程为左右轮保留独立系数,而不是强迫两轮完全相同。这能容纳轮径、装配和传动差异。源码注释说明系数来自重复距离测试拟合,但当前文档没有原始测量表,因此只能标为“代码中已有标定结果”,不能进一步声称误差范围。
5. 反馈数据被谁使用
| 数据 | 生产位置 | 主要用途 |
|---|---|---|
| 单周期增量 | Motor_GetSpeed() | 诊断与累计 |
| 左右 RPM | Encoder_Actual_Val[] | 速度 PID、停稳判定 |
| 左右累计计数 | MotorEncoder_Sum[] | 里程基础量 |
| 左右距离 | Param.Distance_Motor*Curret | 位置环、减速点、任务阶段 |
编码器层只提供测量,不决定任务目标。位置控制和循迹状态机读取这些数据后再生成目标速度,保持“测量”和“决策”分离。
6. 为什么左右轮必须分别保留
只看平均速度会掩盖单轮故障。例如左轮堵转、右轮继续转动时,平均值可能仍非零。当前工程保留左右两套 RPM、累计计数、距离和 PID 状态,因此可以分别控制、分别限速,并要求双轮都满足停稳条件。
这种数据模型也支持差速转向:
左目标 RPM = 基础速度 - 转向修正右目标 RPM = 基础速度 + 转向修正如果只有一个平均反馈,左右不一致就无法被速度环分别补偿。
7. 编码器极性与电机极性不是一回事
电机输出极性决定“正命令让轮子向哪转”,编码器极性决定“正向转动得到什么符号”。两者必须分别验证:
- 先断开闭环,以小幅命令确认物理方向。
- 手动或低速转动车轮,确认前进时 RPM 为正。
- 再启用速度闭环。
如果输出极性和反馈极性只有一个错误,闭环可能变成正反馈并迅速饱和。不能用调换 PID 正负号掩盖底层方向定义错误。
8. 数据质量与滤波边界
编码器 BSP 输出原始周期 RPM,不在 Motor_GetSpeed() 中做低通。实际速度滤波位于 SpeedPID_Update() 内部,这样底层保留原始测量,控制器可以维护自己的滤波状态。
调试时应同时观察:
- 原始左右 RPM;
- PID 内部滤波后的左右 RPM;
- 左右目标 RPM;
- 左右 PWM;
- 任务实际周期。
只看滤波值可能隐藏脉冲抖动,只看原始值又可能误判控制器实际使用的反馈。
9. 异常现象与定位
| 现象 | 可能层级 |
|---|---|
| 计数始终为零 | QEI 引脚、供电、编码器接线、定时器启动 |
| 前进时 RPM 为负 | 编码器极性或 A/B 相序 |
| RPM 周期性跳变 | 采样周期、接触不良、计数分辨率或机械振动 |
| 距离越跑误差越大 | 每计数距离、轮径、打滑、左右机械差 |
| 停止后仍有速度 | 采样滞后、噪声或车轮未真正停稳 |
本篇总结
- 当前工程用 TIMG8/TIMG9 硬件 QEI 获取左右编码器的方向与计数。
- Encoder 任务按真实经过时间把计数差换成 RPM,并把累计计数换成左右距离。
- 原始反馈、控制滤波和应用决策分层保存,便于诊断和替换算法。
- 输出极性与反馈极性必须分别验证,之后才能安全闭环。
上一篇:03|TB6612 电机驱动
下一篇:05|速度环与位置环