| name | stm32-pid-tuning |
| description | PID 参数调试和优化技能。Use when: 小车速度跟不上/电机抖动/过冲/响应太慢、通过 UART3 热调 PID 参数、增量式速度环 PID 的 P/I/D 参数优化、转向 PD 的 Kp/Kd 调优、编码器速度反馈异常排查。适用于 STM32 智能车竞速场景。 |
| argument-hint | 描述 PID 问题或调参需求 |
STM32 PID 调试与调参
系统架构速查
main() 循环 (~12.5Hz) TIM3 中断 (10Hz)
track() → 计算目标速度 读取编码器 → pid_control()
→ motor_target_set(L,R) → pid_cal(&motorA/B) [增量式]
↓ → PWM 输出到 TB6612
motorA.target/B.target ────→ motorA.now/B.now ← encoder_count
- 速度环 PID:增量式 DELTA_PID,作用在 TIM3 中断中,周期 100ms
- 转向 PD:在
track() 中计算,无 I 项,输出限幅 ±60
- 编码器:EXTI 下降沿计数,每个 PID 周期清零 →
motorA.now = Encoder_count1(单位:脉冲/100ms)
- ⚠️
motor_target_set() 不直接输出 PWM。它只写 target,实际 PWM 在下一次 TIM3 中断才更新
调参入口
方式一:UART3 实时热调(推荐)
接线:PB10(TX) + PB11(RX) + GND,波特率 115200。无需重新编译。
| 命令 | 作用 | 默认值 | 建议范围 |
|---|
P<值> | 双电机 P | 200 | 100~400 |
I<值> | 双电机 I | 88 | 20~150 |
D<值> | 双电机 D | 15 | 5~50 |
PA<值> / IA<值> / DA<值> | 仅电机A | — | — |
PB<值> / IB<值> / DB<值> | 仅电机B | — | — |
KP<值> | 转向 P | 3.0 | 2~6 |
KD<值> | 转向 D | 4.0 | 2~8 |
S<值> | 直道基准速度,其余档位自动缩放 | 30 | 15~50 |
? | 打印全部参数 | — | — |
HELP | 打印命令列表 | — | — |
典型调参流程:? → S30 → KP4 → KD5 → P250 → ?
方式二:编辑源码
- 速度环 PID:
user/main.c 中 pid_init(&motorA, DELTA_PID, P, I, D)
- 转向 PD:
code/gray_track.c 中 float g_track_kp 和 g_track_kd
- 速度档位:
code/gray_track.c 中 TRACK_SPEED_FAST/SLOW/MIN 宏
调试步骤
1. 诊断当前状态(5 分钟)
先发 ? 确认所有当前参数。让用户在 OLED 上观察:
| OLED 行 | 内容 | 看什么 |
|---|
| 第 3 行 | E1/E2 编码器实际速度 | 与 A/B target 差异大 → 速度环跟不上 |
| 第 4 行 | PID 实时 P/I 值 | 波动剧烈 → D 太小;长时间不到 target → I 太小 |
| 第 2 行 | 巡线状态 | GO/R1R3/L1L3/FIND/CROSS |
2. 速度环 P-I-D 调优顺序
- 先调 P:把 I、D 临时设 0,逐步加大 P 直到小车接近抖动但还未抖。观察
E1/E2 是否跟上 target
- 现象:
E1=5, target=25 差距大 → P 太小
- 现象:电机嗡嗡响、车身抖 → P 太大
- 再加 D:加入 D 抑制 P 引起的抖动。D 太大 → 电机变"肉"
- 最后加 I:I 消除稳态误差。I 太大 → 来回摆动不收敛
3. 转向 PD 调优
转向 PD 在 track() 中,调整后立即生效:
- 现象:转弯拐不过去(冲出赛道) → 加大
KP(转向更猛)或提高 S(保持速度)
- 现象:车身左右摆动(S 形走线) → 加大
KD(增加阻尼)
- 现象:弯道速度太慢 → 增大
S 或 TRACK_SPEED_FAST;弯道自动降速 70%
4. 编码器验证
如果 E1/E2 始终为 0 或正反转同号:
- 检查编码器 B 相接线(PA2/Enc1B、PB5/Enc2B)
- 检查
motorA_dir 和 motorB_dir 与编码器计数方向一致(见 AGENTS.md「编码器符号陷阱」)
常见故障排查
| 现象 | 优先级 | 检查 |
|---|
| 电机完全不动 | 硬件 | TB6612 供电、STBY 拉高、PWM 引脚 PA0/PA1 |
| 电机只朝一个方向转 | 硬件 | AIN1/AIN2/BIN1/BIN2 方向引脚 |
| E1/E2 始终为 0 | 硬件/中断 | 编码器 EXTI PA6/PB4 中断使能、B 相接线 |
| PWM 输出正常但速度不匹配 | PID | P 太小→加 P;电池电压低→充满再调 |
| 调参命令无响应 | 接线 | UART3 PB10/PB11 通断、波特率 115200 |
| printf 和 datavision 冲突 | 配置 | 二选一,不能同时开 |
相关文件
- PID 控制:
code/pid.c, code/pid.h
- UART3 调参:
code/uart_tune.c, code/uart_tune.h, code/uart_tune_速查卡.txt
- 巡线转向:
code/gray_track.c, code/gray_track.h
- 电机驱动/编码器:
code/motor.c, code/motor.h
- 项目架构:
AGENTS.md