嵌入式 PID 调参实战:增量式速度环 + 位置式转向环怎么调到能用
竞赛车里 PID 不是背公式就够,而是 选对环 → 定周期 → 加保护 → 在线改参。 本文按智能车 / 电赛常见分工整理一套可复用流程,文末附检查单与开源工程对应关系。
📖 目录
CSDN 跳转说明:目录链接为 #s1~#s10,对应正文中各章标题前的 <a id="sN"></a>。请整篇保持普通正文(不要包进引用块 >),否则标题 ID 会丢失、目录点不动。
1. 先分清:你调的是哪一个环
很多车一上来改一个全局 Kp 就抖,根因往往是 环没拆开。
| 电机速度环 | 编码器速度 | 增量式 PI / PID | PWM 增量 |
| 舵机转向(循迹) | 中线偏差 | 位置式 PD / PID | 绝对打角 |
| GPS 航向环 | 方位角误差 | 位置式 PID | 舵机角 |
| 摆杆钢球(视觉) | 像素偏差 | 位置式 PID | 步进 / 摆角 |
| 平衡类 | 角度 + 角速度 | 串级 PID | 内外环分工 |
一句话原则 能拆两环就不要糊成一个 PID:内环要快,外环要稳。
2. 位置式 vs 增量式
2.1 位置式 PID
u
(
k
)
=
K
p
e
(
k
)
+
K
i
∑
e
+
K
d
[
e
(
k
)
−
e
(
k
−
1
)
]
u(k) = K_p e(k) + K_i \\sum e + K_d [e(k)-e(k-1)]
u(k)=Kpe(k)+Ki∑e+Kd[e(k)−e(k−1)]
| 输出含义 | 当前应有的控制量(如舵机目标角) |
| 适用 | 转向、角度、目标位置类环路 |
| 风险 | 积分累积 → 需要积分限幅 / 积分分离 |
2.2 增量式 PID
Δ
u
(
k
)
=
K
p
[
e
(
k
)
−
e
(
k
−
1
)
]
+
K
i
e
(
k
)
+
K
d
[
e
(
k
)
−
2
e
(
k
−
1
)
+
e
(
k
−
2
)
]
\\Delta u(k) = K_p [e(k)-e(k-1)] + K_i e(k) + K_d [e(k)-2e(k-1)+e(k-2)]
Δu(k)=Kp[e(k)−e(k−1)]+Kie(k)+Kd[e(k)−2e(k−1)+e(k−2)]
u
(
k
)
=
u
(
k
−
1
)
+
Δ
u
(
k
)
u(k) = u(k-1) + \\Delta u(k)
u(k)=u(k−1)+Δu(k)
| 输出含义 | 这一次控制量变多少 |
| 适用 | 电机速度环等,PWM 变化量场景 |
| 优点 | 限幅直观,模式切换冲击相对好控 |
2.3 什么时候少用 I / D
- 循迹转向:噪声大,常用 PD,I 很小或为 0
- 速度有稳态差:补 I,并做积分限幅
- 视觉钢球:D 容易放大检测噪声,先 P+I,D 从 0 往上试
3. 控制周期比参数更重要
改 Kp 之前,先确认下面三件事:
| 1 | 周期是否固定 | 定时中断 / vTaskDelayUntil / 硬件定时器 |
| 2 | 采样与控制频率是否一致 | 不要在 A 频率采样、B 频率当同一套参数用 |
| 3 | 中断里有没有重活 | 避免菜单刷新、大段 printf 塞进控制节拍 |
工程量级参考(非教条)
- 电机速度环:常见约 5~10 ms
- 视觉闭环:受检测帧率限制,必须按 真实 dt 理解参数
- 周期抖动时,同一组 Kp 会「时好时坏」——先修调度,再调参
4. 可复用的调参顺序
4.1 电机速度环(增量式)
调参前
- 编码器方向正确,正反转读数合理
- 开环给 PWM,轮子能稳定转、无机械卡死
步骤
| ① | Ki=0,Kd=0,增大 Kp | 阶跃目标能明显「咬住」,允许轻度超调 |
| ② | 逐步加 Ki | 稳态速度靠向目标,无明显慢漂 |
| ③ | Ki 过大 | 冲击变猛、震荡 → 积分限幅 或降 Ki |
| ④ | Kd | 速度环通常很小或 0,无明确振荡可不加 |
| ⑤ | PWM 限幅 | 防止起步满占空比、堵转过流 |
合格怎么看
- 阶跃后在数个控制周期内靠拢目标
- 稳态误差可接受(曲线或测速都行)
- 正反转 / 启停切换不「顶死」
4.2 循迹转向环(位置式 PD)
调参前
- 中线符号约定全车统一(左偏为正还是为负)
- 只开 P,低速跑直线与大弯
步骤
| ① | Kd=0,Ki=0,增大 Kp | 弯道能跟;直道持续抖 → P 偏大 |
| ② | 直道微抖、弯道不够跟 | 略增 P,补一点 Kd |
| ③ | 弯道外甩 | 查中线权重、舵机中值、P 是否不足 |
| ④ | 高速发飘 | 先降噪(二值化 / 中线低通),再谈参数 |
| ⑤ | 固定偏差 | 查舵机中值与机械安装,不要全靠 I 硬扳 |
中线噪声 图像跳变会让误差 e 突变,D 会「尖叫」。 先做:加权中线 + 一阶低通,然后再动 Kd。
4.3 GPS 航向环
- 误差用 方位角差,并做 ±180° 归一化
- 到点判定(距离阈值)与航向环解耦
- 丢星 / 漂移时:冻结目标或切 IMU 航向保持,不要用脏 GPS 继续闭环
4.4 视觉钢球 / 摆臂环
e = ball_x – target_x (像素域)
e → PID → 步进 / 摆杆角度
- 目标点可切换:中心、±偏移、赛题任意点
- 先静止调 PID,再整车运动
- 视觉丢帧:保持上次输出或停车,避免目标跳变导致猛打
5. 必须加的工程保护
这些往往比「再挪 0.05 的 Kp」更能决定能不能稳跑完赛题。
| PWM / 输出限幅 | 防饱和、堵转过流 |
| 积分限幅 | 防 I 冲顶 |
| 积分分离 | 大误差先不用 I,减小超调 |
| 死区 | 执行器小信号不抖 |
| 误差滤波 | 编码器 / 视觉 / IMU 均适用 |
| 异常策略 | 低压、丢帧超时、编码器异常时停机或降级 |
6. 在线调参怎么做
智能车里常见屏上菜单方案(IPS200 等):
参数表:{名称, 变量地址, 步进, 上限, 下限}
按键: 上下选参,左右加减
确认: 写入 Flash,掉电保留
为什么值得做
| 改宏定义 → 编译 → 烧录 | 改完立刻跑 |
| 很容易放弃微调 | 可连续迭代 |
| 参数只在代码里 | 可分模式存多组 |
日志打什么
低频率输出即可(避免占用控制周期):
e, u, target, measure
用虚拟示波器 / 上位机看曲线,比只感觉「抖不抖」准得多。
7. 现象 → 原因 速查表
| 一给目标就猛冲超调 | P 或 Ki 过大 | 降 P;I 限幅 |
| 很慢才到、总差一点 | P 偏小 / 无 I | 适当加 P,补小 I |
| 匀速小幅抖 | P 略大或噪声大 | 降 P + 滤波 |
| 越跑越偏 | 符号反 / 中值偏 / 编码器方向 | 先查方向,再调参 |
| 弯道过冲甩尾 | P 大、D 不足或车速过高 | 降 P、补 D、降速验证 |
| 直道画龙 | 中线抖或 D 过大 | 滤波,减 D |
| 静止仍抖 | 死区、噪声、舵机抖 | 死区 + 低通 + 检查机械 |
| 换电池后变样 | 供电 / 驱动死区变化 | 重标死区与限幅 |
| 参数和别人一样效果差 | 周期、负载、摩擦不同 | 先对齐周期与机械 |
8. 开源工程对应关系
文内分工可在下列仓库找到对应代码(以仓库源码为准)。
智能车 TC264
🔗 https://github.com/shuifanyu/TC264-GPS-Vision-Car
| code/Agorithm.c | 位置式 / 增量式 PID |
| code/Image.c | 循迹中线 → 转向误差 |
| code/GPS.c | 航点方位误差 |
| code/Menu.c | 在线改参菜单 |
电赛 H 题
🔗 https://github.com/shuifanyu/NUEDC-2026-H-Balance-Rolling-Ball
| firmware/chassis_stm32f407/BALANCE/ | 编码器速度环 |
| firmware/steel_ball_stm32f103/ | 视觉偏差 PID |
| vision/k230_ball_detector/ | 像素 offset 下发 |
9. 调参检查单
可直接对照打勾:
[ ] 编码器 / 舵机 / 中线符号方向正确
[ ] 控制周期固定,dt 与参数假设一致
[ ] 输出限幅、积分限幅已打开
[ ] 先单环调稳,再双环联调
[ ] 先低速稳,再提速
[ ] 视觉 / 传感链路有滤波
[ ] 具备在线改参 + 简单曲线/日志
[ ] 丢帧、低压、超时等异常有策略
10. 小结
PID 真正拉开差距的,通常不是「神秘数字」,而是下面四条:
① 环拆对 速度 / 转向 / 航向 / 视觉,职责清晰
② 周期稳 中断与任务不乱抢节拍
③ 保护全 限幅、死区、滤波、故障策略
④ 改参快 菜单 + Flash + 适量日志
公式谁都会背;把这四条做实,车才会从「偶尔能跑」变成「赛题能交卷」。
系列文章
| 1 | AURIX TC264 智能车实战 | GPS + 摄像头循迹总览 |
| 2 | 电赛 H 题多模块协同 | 底盘 + 摆臂 + K230 |
| 3 | 本文:PID 调参实战 | 环路分工 + 调参流程 |
作者:shuifanyu
CSDN 标签建议 PID 增量式PID 位置式PID 智能车 嵌入式 STM32 电赛 调参
