从0到1带你打电赛·小车电控篇(八):PID 调参实战——一套能照抄的调参流程 + 看波形治百病

到这里,前面几篇我们已经把单环、串级、还有那一堆”不做就翻车”的工程补丁都讲过了。但你大概率会有个困惑:道理我都懂,可参数到底怎么调出来?P 设多少?I 加到哪算够?车在地上画龙的时候,我该动哪个数?

这一篇就是来解决”动手”这件事的。它是整个系列里最该被你打印出来贴在调试桌上的一篇——一套从简单到难、可以照抄的调参流程,外加一张”看波形治百病”的诊断表。调参这事说穿了不玄学,它有固定套路,也有趁手工具。我们一步步来。

先把心态摆正:调参是”有顺序地试出来”,不是”算出来”

很多新手一上来就想找一组”标准参数”抄进去,结果发现别人的 Kp=500 抄到自己车上直接飞出去。

⚠️ 第一条铁律:别人的 PID 数值不能直接抄

Kp/Ki/Kd 的具体数值,强依赖你的车模、编码器线数、减速比、供电电压、控制周期,还有”偏差用什么单位算的”。同样是方向环,偏差用像素算 Kp 可能要 500~900,偏差归一化到小范围 Kp 可能就是个位数——能差好几个数量级。所以网上任何参数(包括本篇后面给的表)都只能当起点量级,必须在你自己的车上现场重调。

那调参靠什么?靠一套固定的顺序,配上眼睛看波形。这就像考驾照练科目二:不是背一个”方向盘打几圈”的万能数字,而是练出”看到库角到哪个位置就开始回方向”的手感。手感从哪来?从一遍遍试、一遍遍看结果来。我们要做的,就是把”试”这件事变得有章法、不瞎试。

整套流程可以浓缩成一句口诀:先内环后外环,先 P 后 I 后 D,参数从小往大加。 下面拆开讲。

调参总流程:四步走,照着做

电赛小车电控 · 示意图

第 0 步:先验机械和极性,别让控制环背锅

这一步最容易被跳过,但跳过它你后面会调到怀疑人生。

很多”PID 怎么调都不对”的情况,根子根本不在参数上,而在机械和反馈信号本身就是错的:编码器联轴器松了导致测速跳变、电机没固定牢一加速就晃、舵机中值没标定导致你以为在走直线其实车在跑偏。还有一种很坑的情况——低速时一切正常,一提速或者一换地面,机械松动才暴露出来。所以宁可一开始就把它排查干净。

💡 这就像配眼镜前先验光

微分项怕噪声,就像近视眼盯着一行抖动的字看——传感器一抖,D 项就以为出大事了猛踩刹车。你得先把”眼镜擦干净”(机械稳、信号干净),再让 PID 上岗。

还有一个必做动作:确认反馈极性。方法很土但极其有效——用手去转车(或拨动轮子),如果你给的是正 Kp,车应该”反抗”你这个动作(这才是负反馈);如果车顺着你的手越转越欢,说明极性反了,那就是正反馈,再怎么调参数车都会原地打转或直接失控。极性反了,把符号取反,或者把电机两根线对调即可。

🔥 极性接反 = 正反馈 = 必然失控

这是新手最隐蔽的坑。换了电机接线、或者改了陀螺仪的安装方向之后,一定要重新验一遍极性。极性不对,参数调得再漂亮都没用。

舵机车还要先标定中值、左右极限并限幅(脉宽夹在安全范围内)。标准 RC 舵机周期 20ms(50Hz),脉宽常用范围约 0.5~2.5ms,1.5ms 附近是中位。机械没装好、舵机没标好,PID 再准也救不回来。

💡 闭环之前,先把开环标定做完

在套闭环之前,先开环测一遍:电机的中值和死区在哪、占空比和转速大致是什么关系、左右两个电机是不是不一致。这些零点附近的特性如果没摸清,闭环时车会在零点附近来回跳变,看起来像 PID 没调好,其实是机械/标定的锅。左右电机往往不完全一样,最好左右各一套速度环参数分别整定。

第 1 步:先单独调好速度内环

串级系统里,永远先调内环。原因很直白:外环(方向/位置)看到的”被控对象”其实是”内环 + 电机”这个整体。如果内环本身就晃晃悠悠不稳定,你在它外面套外环,调出来的参数换个工况就废了。

🧩 串级双环像公司管理

外环(方向/位置)是老板,定目标”到那个位置去”;内环(速度/电流)是员工,负责执行”踩多大油门”。老板不能管太细,得先让员工把执行这件事做稳——所以先调内环(员工),再调外环(老板)。员工还毛手毛脚的时候,老板定再清晰的目标也落不了地。

具体怎么调(速度环一般用增量式 PID):

  1. 把车架空或低速直线跑,给一个固定的目标速度。
  2. 先给一个很小的 I,让车能慢慢爬到目标速度(增量式里乘当前误差 $e$ 的那个系数承担”积分”角色,它负责消除稳态转速误差)。
  3. 再缓慢加 P,让响应变快——目标速度一变,实际速度要快速跟上去。
  4. P 一直加到编码器波形开始出现小幅高频抖动,就回退一点点
  5. D 一般很小或者干脆不加(编码器测速本身就有噪声,D 会把它放大成抖动)。

⚠️ 增量式的系数不能照搬位置式

位置式是 $u = K_p e + K_i \sum e + K_d \Delta e$,增量式是 $\Delta u = K_p \Delta e + K_i e + K_d \Delta^2 e$。两者里 $K_i$、$K_d$ 的量纲完全不同:增量式里乘 $e$ 的那个系数对应的是连续 $K_i$ 再乘上采样周期,跟位置式那个直接累加的 $K_i$ 不是一回事,数值能差好几个数量级。很多博客把两种式子的系数混着贴,你照抄必崩。换算要么自己推,要么干脆重新整定。

增量式速度环只需要做输出限幅(不像位置式还得专门做积分限幅),因为它本身不显式累加积分,天然抗积分饱和、误动作影响小——算错一次只是微微抖一下,而不是猛地一窜。

🧩 增量式 vs 位置式像踩油门

位置式是每次直接报”油门踩到几成”(绝对量),算错一次车就猛地一冲;增量式是每次说”油门多给一点 / 少给一点”(增量),算错一次只是轻轻一颤,更安全。这就是电机速度环爱用增量式的原因。

第 2 步:再调方向 / 位置外环

内环稳了,外环此时看到的就是一个”快速、稳定”的等效环节,可以像调普通单环 PID 那样慢慢来。

方向环一般用位置式 PD(多数情况不加 I):

  1. 从 D=0、只加 P 开始。P 慢慢加大到车能基本跟住线 / 跟住目标方向,但过弯时略冲、直道有点画龙。
  2. 再加 D,压住过冲和直道的蛇形抖动。

💡 方向环口诀:入弯靠 D,弯中靠 P

入弯的瞬间,偏差变化率很大,主要靠 D 项产生”预判性打角”,提前把方向打出去;车进入弯道中段后偏差基本不变,D 项失效,由 P 项维持住位置。所以 P 决定”跟得准不准”,D 决定”打得圆不圆滑、抖不抖”。

关于方向环要不要加 I,这里要说句更准确的话:

📝 方向环以 PD 为主,但"绝不加 I"说得太满

高速动态循迹时,I 项容易引起入弯滞后、过弯后画龙摆尾,所以常常弱化或省略。但如果你的车存在固定的机械/装配偏置(比如直道上总是恒定地偏一点点),加一个很小、且带积分分离和限幅的 I 来纠正这个系统性偏差,反而是有道理的——自动驾驶里的转向 PID 也常用一个小 I 去吃掉这种 steering drift。结论:以 PD 为主导,I 看场景按需加一点点,别一概而论。

第 3 步:提速,然后到赛场复调

低速时系统更宽容、容易看清振荡,所以前面都是先慢速调通。调稳之后再逐步把基础速度提上去。

⚠️ 提速后参数往往要回调

速度和转向是耦合的:提速后原来的方向环参数常常偏大,需要回调;高速过弯还得配合弯道减速策略(按曲率或偏差大小压低基础速度)。这也是为什么很多队伍会准备两套甚至三套参数:直线一套(快)、弯道一套(稳),现场用按键 + OLED 切换。

实战里就有人这么干:某 2024 电赛 H 题循迹分享里,直线用 Kp=500 / Kd=0,弯道单独用 Kp=900 / Kd=200,两套动态参数切换跑(来源)。

🔥 实验室调好 ≠ 赛场能跑

赛场的光照、地面摩擦、电池电量都和你实验室不一样。灰度/电感的阈值受环境光影响极大,PID 也会跟着变。一定要赶到现场,用赛道真实材质和光照重新标定阈值、复调参数,并且留大约 20% 的参数余量。满电调好的车,亏电时同一个 PWM 转速会掉,赛前务必在”比赛会用到的电量水平”下再复测一遍。

从临界振荡起步:试凑法标准步骤

上面是”流程顺序”,那每一个环具体怎么把 P 加上去?这里有个经典的标准动作。

试凑法(先 P 后 I 后 D):

  1. 把 I、D 都去掉(只留 P)。
  2. 把 Kp 从小往大加,一直加到系统出现等幅振荡(不收敛也不发散,匀速来回晃)。
  3. 把 Kp 减小到振荡刚好消失,再取这个值的 60%~70%(或者干脆乘 0.6)作为最终 P。
  4. 需要消静差就加 I:积分时间 Ti 先设一个大初值,逐步往小减,减到出现振荡,再回头把它加大到 150%~180%
  5. 需要压超调就加 D:Td 一般取 0,或者取不振荡时的约 30%

🧩 "先 P 到振荡再退一点"像调水龙头水温

先把热水开到烫手(临界振荡点),确认这是上限,再往回拧一点点到刚好舒服(退到 60%~70%)。临界点是稳定边界,退一档是为了在”反应快”和”不失稳”之间留余量。

🔥 找"等幅振荡"时小心车冲出去

把 Kp 往上加到振荡的过程中,车随时可能失控冲出赛道甚至翻车。建议先低速、把轮子架空、或者用手扶着测。另外电机有死区——Kp 太小时电机可能压根不转,表现为”调不动”,这时要先克服死区(做死区补偿)。

想要个起步估计:Ziegler-Nichols 临界比例度法

试凑法靠手感,如果你想要一个能”算出起点”的方法,可以用经典的 Ziegler-Nichols(临界比例度法)。

做法:把 I、D 去掉,逐渐加大 Kp 到系统首次出现等幅振荡,记下此时的临界增益 $K_u$临界振荡周期 $T_u$,然后查表。

标准版(最常用,会产生约 25% 超调、四分之一衰减):

$$K_p = 0.6 K_u, \quad T_i = 0.5 T_u, \quad T_d = 0.125 T_u$$

换算成常见的并联形式就是 $K_i = 1.2 K_u / T_u$、$K_d = 0.075 K_u T_u$。

野火文档里给的查表版本(数值上和标准版接近):

控制器 Kp Ki / Kd
仅 P $K_u/2$
PI $K_u/2.2$ $K_i = K_p/(0.833\,T_u)$
PID $K_u/1.7$ $K_i = K_p/(0.5\,T_u)$,$K_d = 0.125\,T_u\,K_p$

⚠️ 几个容易被网上资料带歪的点,务必记清楚

  • $K_p = 0.45 K_u$ 是 PI 控制器的 Kp,不是什么”PID 降超调版”。真正的 PID 低超调变体是 $K_p = 0.2 K_u$、$T_d = 0.333 T_u$(no overshoot),或 $K_p = 0.333 K_u$(some overshoot)。
  • 网上有种说法是”PI 段把 Kp 设成临界 Kp 的 5/6″,这是错的。5/6 指的是 PI 的积分时间 $T_i \approx 0.833\,T_u$(临界周期的 5/6),不是比例系数。相对 PID 的 Kp,PI 的 Kp 其实是 $0.45/0.6 = 3/4$。别把积分时间的系数张冠李戴安到 Kp 上。
  • Z-N 整定结果普遍偏激进(约 25% 超调)。实战常需要在它给的起点上再保守化;要小超调就直接用上面的 no-overshoot 变体。对那种滞后大、特别容易振荡的对象,还可以换成更稳健的 Tyreus-Luyben 整定($K_p = K_u/3.2$、$T_i = 2.2\,T_u$、$T_d = T_u/6.3$)。

重头戏:看波形治百病

如果说前面是”流程”,那这一节是这一篇的灵魂。你能不能调好 PID,很大程度取决于你能不能把车的状态”看见”。 盲调和看着波形调,效率差一个数量级。

工具:VOFA+ 串口示波器

最主流、免费的工具是 VOFA+。思路非常简单:在控制环里用 printf 同时发出”目标值”和”实际值”两路数据,VOFA+ 把字节流翻译成实时曲线画出来。你一眼就能看到实际值是怎么去追目标值的——是慢慢爬上去、还是冲过头来回荡、还是死活差一截。需要的话还能多发几路(比如 PID 的分项、PWM 输出)一起看。

VOFA+ 有三种数据协议,按你的通道数和频率选:

协议 格式 适用 注意
FireWater 逗号分隔的文本 + 换行 通道少、频率低(3~4 路、<100Hz) 末尾必须有换行,否则不解析、画不出波形
JustFloat 小端 float 数组 + 帧尾 多通道高频首选 帧尾固定 0x00 0x00 0x80 0x7F;接收区必须勾”十六进制”;缺帧尾会卡死
RawData 原始字节按通道切 特殊场景

💡 通道多、频率高就用 JustFloat

JustFloat 那个帧尾 0x00 0x00 0x80 0x7F 其实就是单精度浮点的正无穷(+inf),正常数据不会出现这个值,所以拿它当帧的分隔标志最稳。波特率常用 115200,要发很多通道高频数据时上 460800 / 921600。注意 51 单片机的 float 是大端,用 JustFloat 要先翻转字节序。

带宽够不够可以粗算一下:JustFloat 每通道每帧 4 字节,加 4 字节帧尾,n 通道、f Hz 大约需要 $(4n+4)\cdot f$ 字节/秒。比如 6 通道、1kHz 约 28 KB/s,而 115200 波特(8N1)只有约 11.5 KB/s,根本不够——这时要么提波特率,要么降通道、降回传频率。

诊断表:波形长什么样 → 该动哪个参数

这是最可操作的产出,建议直接背下来:

波形症状 病因 处方
实际值上得很慢,半天追不上目标 响应不够 加大 P(或加 I 作用)
频繁来回振荡、等幅晃 P 太大 减小 P
一下子冲过头、超调大 阻尼不够 加 D(或减小 P/I)
稳定后总差一截、贴不到目标线 静差 加 I
波形发散、越晃越大 P 严重过大 立刻减小 P
加了 I 之后新出现超调 I 太猛 加 D 或减 I
高频毛刺、整体其实跟得上 噪声 / D 太大 减 D 或加滤波(别误当振荡去减 P!)

一句口诀帮你记住分工:P 主管响应、I 消除静差、D 抑制振荡。

理想的响应曲线长什么样?老一辈工控人有个判据叫”两个波,前高后低四比一“——也就是超调后回落,相邻两个波峰幅值约 4:1 衰减比,既反应快又稳得住。

🧩 D 项怕噪声,像近视眼盯着抖动的字

表里那条”高频毛刺别误当振荡”特别重要。微分看的是”变化快不快”,传感器信号稍微一抖,D 就以为出大事了猛打方向。所以遇到高频抖,第一反应应该是减 D 或给反馈加低通滤波,而不是去减 P。这也是为什么工程上常用”不完全微分”(给 D 串一个一阶低通)和”微分先行”(只对反馈测量值求导、不对误差求导,避免目标突变时产生微分冲击)。具体这些补丁怎么写,《PID 进阶:串级+工程补丁》一篇里都给过代码,这里就不重复了。

下面这张图把整个看波形的判断逻辑串起来:

电赛小车电控 · 示意图

⚠️ 有一类"调不好",加大 D 也救不回

如果你的反馈本身有明显延迟——比如图像处理耗时、传感器采集到 PID 执行之间隔了很久——这相当于给系统加了纯滞后,会让本来稳定的 Kp 突然开始振荡。这种问题加 D 没用,得从源头缩短”采集→计算→执行”这条链路,或者上更高级的预估补偿。所以波形怎么调都不对的时候,回头看看是不是时序出了问题。

在线调参:别每改一个数就重新烧录

调参是个反复试的活。如果每改一次参数都要重新编译、烧录、复位、再跑,一天调不了几轮。高名次队伍的共同点之一,就是把”改参数”这件事做成在线的。三种手段:

1. 板载按键 + OLED(现场最稳,比赛桌上首选)

把 P/I/D 存成数组,用按键选择当前要改哪个参数、加减键步进调整,OLED 实时显示。不用连电脑、不用重新下载、抗 PC 干扰。整定满意后把参数写进 Flash 掉电保存。

💡 比赛现场优先用按键 + OLED

赛场电磁环境复杂、桌子上一堆人挤,连着电脑反而是累赘。一块板载 OLED + 几个按键,独立、稳、快,是封箱前最后整定的标配。记得改完一定要存进 Flash,否则一断电参数全丢,现场重调哭都来不及。

2. 蓝牙 / 2.4G 无线透传(跑动中调参)

平衡车、高速车这种”必须跑起来才能看出参数好坏”的场景,用 HC-05 蓝牙(或 NRF24L01 这类 2.4G)做无线串口透传。在 VOFA+ 或手机上发命令帧改参数,车继续跑,同时把波形实时回传回来。

下位机解析命令帧的通用做法:定好帧头帧尾,用 DMA + 串口空闲(IDLE)中断收变长包,收到后用 strstr 定位关键字、atof 把字符串转成 float。

⚠️ 无线调参必须同时回传波形,否则等于盲调

无线的全部价值在于”车在跑,你在看”。如果只发参数下去、不把波形传回来,你根本不知道改完变好还是变坏,那无线就白用了。还有,蓝牙带宽有限,多通道高频回传会丢包——这时候降通道数或者把回传频率降到 50~100Hz。

3. MATLAB 系统辨识(算个起点)

进阶玩法:开环给电机一个恒定 PWM,记录转速响应,拟合出传递函数,再用 PID Tuner 算出一组起步参数。拟合率(fit)大于 80% 基本就能用。注意 PID Tuner 算出的连续 I 项要乘以采样周期才是离散位置式的 Ki。这套适合给速度环找起点,但最终还是得回到车上微调。

一个能照抄的 PID 实现(含输出限幅)

理论说够了,给一份电赛 H 题国奖工程里用过的通用 PID 实现——同一个结构体支持位置式和增量式两种模式,并且带上必做的输出限幅(来源):

// 通用 PID:一个结构体两种模式(来自 2024 电赛 H 题开源工程)
void PID_Calculate(PID_Struct *pid){
    pid->error[0] = pid->target - pid->now;   // 当前偏差
    if(pid->mode == DELTA_PID){               // 增量式(电机速度环常用)
        pid->pout = pid->p * (pid->error[0] - pid->error[1]);
        pid->iout = pid->i *  pid->error[0];
        pid->dout = pid->d * (pid->error[0] - 2*pid->error[1] + pid->error[2]);
        pid->out += pid->pout + pid->iout + pid->dout;   // 注意是累加增量
    } else if(pid->mode == POSITION_PID){     // 位置式(方向/角度环常用)
        pid->pout = pid->p *  pid->error[0];
        pid->iout = pid->i *  pid->error[0];
        pid->dout = pid->d * (pid->error[0] - pid->error[1]);
        pid->out  = pid->pout + pid->iout + pid->dout;    // 直接赋值
    }
    pid->error[2] = pid->error[1];            // 历史偏差移位
    pid->error[1] = pid->error[0];
}

// 输出限幅:位置式/增量式都必须做,否则容易烧电机或舵机
void PID_OutPutLimit(PID_Struct *pid, float duty){
    if(pid->out >=  duty) pid->out =  duty;
    if(pid->out <= -duty) pid->out = -duty;
}

🔥 限幅是必做项,不是可选项

位置式还要额外做积分限幅和积分分离(偏差超过某个阈值时干脆不累加 I),防止积分饱和。积分饱和是什么概念——上电瞬间或大偏差时误差很大,I 项会迅速攒到饱和,等误差反向了它还在用力过猛,结果就是巨大超调甚至冲出赛道。这就像憋了一肚子气:你越攒越气,等对方道歉了你还在继续发飙,所以得”积分分离”——大事化小前先别记仇。这些工程补丁的完整写法,前一篇《PID 进阶:串级+工程补丁》里成套讲过。

循迹车把方向环输出叠加到左右轮基础速度上,实现差速转向:

// 七路灰度加权求中线偏差,target=0(车正好压在中线)
track_pid.now    = weighted_sum / sum;
track_pid.target = 0;
PID_Calculate(&track_pid);
PID_OutPutLimit(&track_pid, 800);          // 方向环输出限幅 ±800
Motor_LeftCtrl (basespeed - track_pid.out); // 左轮 = 基础速度 - 转向量
Motor_RightCtrl(basespeed + track_pid.out); // 右轮 = 基础速度 + 转向量

差速运动学的本质就是这两行:左右轮一个减一个加,差出来的速度差就是转向。对应公式 $v_L = v – \frac{\omega L}{2}$、$v_R = v + \frac{\omega L}{2}$($v$ 线速度、$\omega$ 角速度、$L$ 轮距)。左右到底是加还是减,取决于你的电机安装方向,跑一下不对就互换。

各场景 PID 经验起点数值表

再强调一遍:下面全是起点量级,不是答案,必须现场重调。 给它们是为了让你不至于从零开始瞎蒙,知道”大概在哪个数量级”。

场景 控制方式 参考起点(仅量级) 备注
电机速度环 增量式 Kp ≈ 0.5~6,Ki ≈ 0.008~8.5,Kd≈0 增量式 Ki 与位置式量纲不同
方向环(偏差归一化) 位置式 PD Kp ≈ 7~8,Kd ≈ -0.1 H 题角度环量级
方向环(偏差用像素/电感差) 位置式 PD 直线 Kp≈500,弯道 Kp≈900/Kd≈200 偏差量纲大故 Kp 大
送药车速度环(串级位置式) 位置式 Kp=6.0,Ki=8.5,Kd=0 car_template 实测
送药车位置外环 位置式 Kp=0.3,Ki=0,Kd=0 car_template 实测
控制 / 采样周期 速度内环 1~10ms(100~1000Hz) 内环要快于外环
电机 PWM 频率 17~24kHz 见下方说明
舵机 PWM 50Hz / 周期 20ms,脉宽 0.5~2.5ms 1.5ms 附近中位

关于控制周期和 PWM 频率,初学者最容易混成一件事,这里务必分清:

❗ 控制周期 ≠ PWM 频率,两者差几十上百倍

  • PWM 频率(电机驱动的载波):决定电机转得平不平滑、吵不吵。
  • PID 控制周期(定时器中断里跑一次 PID 的间隔):通常 1~10ms,也就是 100~1000Hz。2024 电赛 H 题很多队伍就是 10ms 定时器中断里跑整套 PID。

串级时内环周期要明显小于外环(量级上内环带宽是外环的 3~10 倍),代码上用一个计数器实现:内环每次中断都算,外环每隔 N 次中断才算一次。

⚠️ 内外环分频,别忘了"周期"也跟着变

外环每 N 次中断才算一次,那它 PID 公式里的积分/微分用的就该是外环的真实周期 $N\cdot T$,而不是基本中断周期 $T$。很多人这里偷懒直接用 T,结果 Ki/Kd 的物理意义被分频系数悄悄改掉,调出来的参数换个分频就不对——这是很隐蔽的 bug。

关于 PWM 频率到底取多少,有个常被网上资料说错的点:

⚠️ "10kHz 就能避开啸叫"是不准确的

人耳上限大约 20kHz,所以 10kHz、17kHz 其实大多数人还是听得到的(尤其年轻人,10kHz 会是明显的尖啸)。要真正做到”超声静音”,PWM 要提到 20kHz 以上。代价是开关损耗增大、对驱动 MOS 要求更高,而且在固定定时器时钟下频率越高、占空比分辨率越低。所以 17~24kHz 是”避人耳”和”保住分辨率/控制损耗”之间的折中,24kHz 更稳妥。10kHz 常被选用主要是图省开关损耗,不是因为它真的安静。

串级调参顺序与现场快速整定

把前面的拼起来,串级双环的完整调参顺序是:

  • 第 0 步:验机械、验编码器、验极性,舵机标中值限幅,开环标定好中值/死区。
  • 第 1 步:屏蔽外环,单独调速度内环(增量式)。给固定目标速度,调到”目标一变实际能快速平滑跟上、受扰不振荡”。
  • 第 2 步:套上方向/位置外环(位置式 PD)。先加 P 到能跟线,再加 D 压超调,方向环一般不加或只加极小 I。
  • 第 3 步:逐步提速,弯道单独降速;准备 2~3 套参数现场切换。
  • 现场:到赛道真实材质/光照下重标阈值、复调参数,留 20% 余量,在比赛电量水平下复测。

✅ 现场快速整定的三个救命动作

  1. 先用按键 + OLED 把当前波形/偏差显示出来,确认信号正常。
  2. 速度先压一半,把车调到”稳”,确认不冲出、不画龙,再慢慢提速度找”快”。
  3. 任何一次改参后,立刻让车在赛道上跑一遍看实际表现,并把满意的参数存进 Flash。封箱前最后一次整定,一定在比赛要用的那块电池电量下做。

几个反复要人命的坑,最后再钉一遍

🔥 调参翻车排行榜

  • 忘记限幅:位置式/增量式都要做输出限幅;位置式还要积分限幅 + 积分分离。不做会积分饱和、超调冲出,甚至烧电机舵机。
  • 照抄别人数值:换车、换编码器、换电压、换控制周期,参数全得重调。
  • 改了控制周期忘重调:多数代码把采样周期 T 合进了系数里,周期一变等效增益全变。更稳的做法是把控制环放在硬件定时器中断里保证 T 恒定,或者在公式里用实测 dt 动态算积分/微分。
  • 增量式系数当位置式用:量纲不同,照抄差几个数量级。
  • printf 阻塞主循环:高频发波形如果用阻塞式 HAL_UART_Transmit,发上千字节要几十毫秒,会把控制周期搅乱、车直接抖到失控。必须改 DMA + 环形缓冲非阻塞发送。
  • 低速测速噪声大:编码器用”单位时间计数”测速时,低速下每周期脉冲数少、量化噪声大,D 一放大就抖。这种情况低速宜改用”测脉冲间隔”的算法,并对速度反馈先滤波再进 PID,比一味减小 Kd 更治本。
  • MPU6050 零飘:上电要静置校准零偏。注意一个常见误传——MPU6050 的 Yaw 漂移并没有”每秒 2 度”那么夸张,做过一次性零偏校准后裸积分大约是每分钟几度的量级,配上带零偏修正的姿态融合能压到约 0.5°/min。结论不变:航向类赛题预算允许就上 HWT101 / JY901 这类带融合的专用航向模块。

调参这一关过了,你的车就有了”稳和准”的底子。但你可能还会问:前馈、模糊 PID、卡尔曼这些听起来很高级的东西,到底要不要上、什么时候上才不算本末倒置?这正是进阶控制算法那一篇要替你算的那笔性价比账。



本文由 云间辞 原创,发布于 HBZGC 的博客

转载请保留链接: https://cloudlay.cn/nuedc-car-08-pid-tuning/

暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇