<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PID调参 &#8211; Cloudlay</title>
	<atom:link href="https://cloudlay.cn/tag/pid%e8%b0%83%e5%8f%82/feed/" rel="self" type="application/rss+xml" />
	<link>https://cloudlay.cn</link>
	<description>life</description>
	<lastBuildDate>Sun, 14 Jun 2026 17:08:33 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://cloudlay.cn/wp-content/uploads/2026/01/avatar.ico</url>
	<title>PID调参 &#8211; Cloudlay</title>
	<link>https://cloudlay.cn</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>从0到1带你打电赛·小车电控篇(八)：PID 调参实战——一套能照抄的调参流程 + 看波形治百病</title>
		<link>https://cloudlay.cn/nuedc-car-08-pid-tuning/</link>
					<comments>https://cloudlay.cn/nuedc-car-08-pid-tuning/#respond</comments>
		
		<dc:creator><![CDATA[云间辞]]></dc:creator>
		<pubDate>Sun, 14 Jun 2026 17:08:33 +0000</pubDate>
				<category><![CDATA[嵌入式]]></category>
		<category><![CDATA[PID调参]]></category>
		<category><![CDATA[VOFA]]></category>
		<category><![CDATA[Ziegler-Nichols]]></category>
		<category><![CDATA[智能小车]]></category>
		<category><![CDATA[波形诊断]]></category>
		<category><![CDATA[电赛]]></category>
		<guid isPermaLink="false">https://cloudlay.cn/nuedc-car-08-pid-tuning/</guid>

					<description><![CDATA[📚 本文是 「从 0 到 1 带你打电赛 · 小车电控篇」 系列（共 12 篇）第 8 篇。 第1篇 · 拿奖 [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="ds-series" style="border:1px solid #4488ff33;background:#4488ff0d;border-radius:8px;padding:.8em 1.1em;margin:1.2em 0">
<p style="margin:0 0 .5em"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 本文是 <strong>「从 0 到 1 带你打电赛 · 小车电控篇」</strong> 系列（共 12 篇）第 8 篇。</p>
<ol style="margin:.2em 0 0;padding-left:1.4em">
<li style="margin:.15em 0"><a href="https://cloudlay.cn/nuedc-car-01-how-to-score/">第1篇 · 拿奖逻辑：把比赛拆成小目标</a></li>
<li style="margin:.15em 0"><a href="https://cloudlay.cn/nuedc-car-02-history/">第2篇 · 赛题进化史与押题</a></li>
<li style="margin:.15em 0"><a href="https://cloudlay.cn/nuedc-car-03-build-and-architecture/">第3篇 · 整车搭建与代码框架</a></li>
<li style="margin:.15em 0"><a href="https://cloudlay.cn/nuedc-car-04-motor-power/">第4篇 · 电机驱动与电源地基</a></li>
<li style="margin:.15em 0"><a href="https://cloudlay.cn/nuedc-car-05-sensing/">第5篇 · 感知：灰度/电磁/编码器/IMU</a></li>
<li style="margin:.15em 0"><a href="https://cloudlay.cn/nuedc-car-06-pid-basics/">第6篇 · PID 入门：搞懂 P/I/D</a></li>
<li style="margin:.15em 0"><a href="https://cloudlay.cn/nuedc-car-07-pid-advanced/">第7篇 · PID 进阶：串级+工程补丁</a></li>
<li style="margin:.15em 0"><strong>第8篇 · PID 调参实战(核心)（本篇）</strong></li>
<li style="margin:.15em 0"><a href="https://cloudlay.cn/nuedc-car-09-advanced-control/">第9篇 · 进阶控制：几时该上</a></li>
<li style="margin:.15em 0"><a href="https://cloudlay.cn/nuedc-car-10-vision-comm/">第10篇 · K230 视觉与通信协议</a></li>
<li style="margin:.15em 0"><a href="https://cloudlay.cn/nuedc-car-11-architecture-fsm/">第11篇 · 状态机与整车软件</a></li>
<li style="margin:.15em 0"><a href="https://cloudlay.cn/nuedc-car-12-field-manual/">第12篇 · 现场作战+避坑+开源</a></li>
</ol>
</div>
<p>到这里，前面几篇我们已经把单环、串级、还有那一堆&#8221;不做就翻车&#8221;的工程补丁都讲过了。但你大概率会有个困惑：道理我都懂，可参数到底怎么调出来？P 设多少？I 加到哪算够？车在地上画龙的时候，我该动哪个数？</p>
<p>这一篇就是来解决&#8221;动手&#8221;这件事的。它是整个系列里最该被你打印出来贴在调试桌上的一篇——一套从简单到难、可以照抄的调参流程，外加一张&#8221;看波形治百病&#8221;的诊断表。调参这事说穿了不玄学，它有固定套路，也有趁手工具。我们一步步来。</p>
<h2>先把心态摆正：调参是&#8221;有顺序地试出来&#8221;，不是&#8221;算出来&#8221;</h2>
<p>很多新手一上来就想找一组&#8221;标准参数&#8221;抄进去，结果发现别人的 Kp=500 抄到自己车上直接飞出去。</p>
<div class="ds-callout ds-callout-warning" style="border-left:4px solid #ff9100;background:#ff910014;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#ff9100"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 第一条铁律：别人的 PID 数值不能直接抄</p>
<p>Kp/Ki/Kd 的具体数值，强依赖你的车模、编码器线数、减速比、供电电压、控制周期，还有&#8221;偏差用什么单位算的&#8221;。同样是方向环，偏差用像素算 Kp 可能要 500~900，偏差归一化到小范围 Kp 可能就是个位数——能差好几个数量级。所以网上任何参数（包括本篇后面给的表）都只能当<strong>起点量级</strong>，必须在你自己的车上现场重调。</p>
</div>
<p>那调参靠什么？靠一套固定的顺序，配上眼睛看波形。这就像考驾照练科目二：不是背一个&#8221;方向盘打几圈&#8221;的万能数字，而是练出&#8221;看到库角到哪个位置就开始回方向&#8221;的手感。手感从哪来？从一遍遍试、一遍遍看结果来。我们要做的，就是把&#8221;试&#8221;这件事变得有章法、不瞎试。</p>
<p>整套流程可以浓缩成一句口诀：<strong>先内环后外环，先 P 后 I 后 D，参数从小往大加。</strong> 下面拆开讲。</p>
<h2>调参总流程：四步走，照着做</h2>
<figure class="ds-diagram" style="text-align:center;margin:1.3em 0"><img decoding="async" src="https://cloudlay.cn/wp-content/uploads/dianseiche/8ac2a75741c5.png" alt="电赛小车电控 · 示意图" loading="lazy" style="max-width:100%;height:auto;background:#fff;border-radius:8px;padding:6px;box-shadow:0 1px 6px rgba(0,0,0,.25)"></figure>
<h3>第 0 步：先验机械和极性，别让控制环背锅</h3>
<p>这一步最容易被跳过，但跳过它你后面会调到怀疑人生。</p>
<p>很多&#8221;PID 怎么调都不对&#8221;的情况，根子根本不在参数上，而在机械和反馈信号本身就是错的：编码器联轴器松了导致测速跳变、电机没固定牢一加速就晃、舵机中值没标定导致你以为在走直线其实车在跑偏。还有一种很坑的情况——低速时一切正常，一提速或者一换地面，机械松动才暴露出来。所以宁可一开始就把它排查干净。</p>
<div class="ds-callout ds-callout-tip" style="border-left:4px solid #00bfa6;background:#00bfa614;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#00bfa6"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 这就像配眼镜前先验光</p>
<p>微分项怕噪声，就像近视眼盯着一行抖动的字看——传感器一抖，D 项就以为出大事了猛踩刹车。你得先把&#8221;眼镜擦干净&#8221;（机械稳、信号干净），再让 PID 上岗。</p>
</div>
<p>还有一个必做动作：<strong>确认反馈极性</strong>。方法很土但极其有效——用手去转车（或拨动轮子），如果你给的是正 Kp，车应该&#8221;反抗&#8221;你这个动作（这才是负反馈）；如果车顺着你的手越转越欢，说明极性反了，那就是正反馈，再怎么调参数车都会原地打转或直接失控。极性反了，把符号取反，或者把电机两根线对调即可。</p>
<div class="ds-callout ds-callout-danger" style="border-left:4px solid #ff1744;background:#ff174414;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#ff1744"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f525.png" alt="🔥" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 极性接反 = 正反馈 = 必然失控</p>
<p>这是新手最隐蔽的坑。换了电机接线、或者改了陀螺仪的安装方向之后，一定要重新验一遍极性。极性不对，参数调得再漂亮都没用。</p>
</div>
<p>舵机车还要先标定中值、左右极限并限幅（脉宽夹在安全范围内）。标准 RC 舵机周期 20ms（50Hz），脉宽常用范围约 0.5~2.5ms，1.5ms 附近是中位。机械没装好、舵机没标好，PID 再准也救不回来。</p>
<div class="ds-callout ds-callout-tip" style="border-left:4px solid #00bfa6;background:#00bfa614;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#00bfa6"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 闭环之前，先把开环标定做完</p>
<p>在套闭环之前，先开环测一遍：电机的中值和死区在哪、占空比和转速大致是什么关系、左右两个电机是不是不一致。这些零点附近的特性如果没摸清，闭环时车会在零点附近来回跳变，看起来像 PID 没调好，其实是机械/标定的锅。左右电机往往不完全一样，最好左右各一套速度环参数分别整定。</p>
</div>
<h3>第 1 步：先单独调好速度内环</h3>
<p>串级系统里，<strong>永远先调内环</strong>。原因很直白：外环（方向/位置）看到的&#8221;被控对象&#8221;其实是&#8221;内环 + 电机&#8221;这个整体。如果内环本身就晃晃悠悠不稳定，你在它外面套外环，调出来的参数换个工况就废了。</p>
<div class="ds-callout ds-callout-example" style="border-left:4px solid #7c4dff;background:#7c4dff14;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#7c4dff"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9e9.png" alt="🧩" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 串级双环像公司管理</p>
<p>外环（方向/位置）是老板，定目标&#8221;到那个位置去&#8221;；内环（速度/电流）是员工，负责执行&#8221;踩多大油门&#8221;。老板不能管太细，得先让员工把执行这件事做稳——所以先调内环（员工），再调外环（老板）。员工还毛手毛脚的时候，老板定再清晰的目标也落不了地。</p>
</div>
<p>具体怎么调（速度环一般用<strong>增量式 PID</strong>）：</p>
<ol>
<li>把车架空或低速直线跑，给一个固定的目标速度。</li>
<li><strong>先给一个很小的 I</strong>，让车能慢慢爬到目标速度（增量式里乘当前误差 $e$ 的那个系数承担&#8221;积分&#8221;角色，它负责消除稳态转速误差）。</li>
<li><strong>再缓慢加 P</strong>，让响应变快——目标速度一变，实际速度要快速跟上去。</li>
<li>P 一直加到编码器波形开始出现小幅高频抖动，就<strong>回退一点点</strong>。</li>
<li>D 一般很小或者干脆不加（编码器测速本身就有噪声，D 会把它放大成抖动）。</li>
</ol>
<div class="ds-callout ds-callout-warning" style="border-left:4px solid #ff9100;background:#ff910014;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#ff9100"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 增量式的系数不能照搬位置式</p>
<p>位置式是 $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$ 的<strong>量纲完全不同</strong>：增量式里乘 $e$ 的那个系数对应的是连续 $K_i$ 再乘上采样周期，跟位置式那个直接累加的 $K_i$ 不是一回事，数值能差好几个数量级。很多博客把两种式子的系数混着贴，你照抄必崩。换算要么自己推，要么干脆重新整定。</p>
</div>
<p>增量式速度环只需要做<strong>输出限幅</strong>（不像位置式还得专门做积分限幅），因为它本身不显式累加积分，天然抗积分饱和、误动作影响小——算错一次只是微微抖一下，而不是猛地一窜。</p>
<div class="ds-callout ds-callout-example" style="border-left:4px solid #7c4dff;background:#7c4dff14;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#7c4dff"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9e9.png" alt="🧩" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 增量式 vs 位置式像踩油门</p>
<p>位置式是每次直接报&#8221;油门踩到几成&#8221;（绝对量），算错一次车就猛地一冲；增量式是每次说&#8221;油门多给一点 / 少给一点&#8221;（增量），算错一次只是轻轻一颤，更安全。这就是电机速度环爱用增量式的原因。</p>
</div>
<h3>第 2 步：再调方向 / 位置外环</h3>
<p>内环稳了，外环此时看到的就是一个&#8221;快速、稳定&#8221;的等效环节，可以像调普通单环 PID 那样慢慢来。</p>
<p>方向环一般用<strong>位置式 PD</strong>（多数情况不加 I）：</p>
<ol>
<li>从 D=0、只加 P 开始。P 慢慢加大到车能基本跟住线 / 跟住目标方向，但过弯时略冲、直道有点画龙。</li>
<li>再加 D，压住过冲和直道的蛇形抖动。</li>
</ol>
<div class="ds-callout ds-callout-tip" style="border-left:4px solid #00bfa6;background:#00bfa614;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#00bfa6"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 方向环口诀：入弯靠 D，弯中靠 P</p>
<p>入弯的瞬间，偏差变化率很大，主要靠 D 项产生&#8221;预判性打角&#8221;，提前把方向打出去；车进入弯道中段后偏差基本不变，D 项失效，由 P 项维持住位置。所以 P 决定&#8221;跟得准不准&#8221;，D 决定&#8221;打得圆不圆滑、抖不抖&#8221;。</p>
</div>
<p>关于方向环要不要加 I，这里要说句更准确的话：</p>
<div class="ds-callout ds-callout-note" style="border-left:4px solid #448aff;background:#448aff14;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#448aff"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4dd.png" alt="📝" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 方向环以 PD 为主，但&quot;绝不加 I&quot;说得太满</p>
<p>高速动态循迹时，I 项容易引起入弯滞后、过弯后画龙摆尾，所以常常弱化或省略。但如果你的车存在固定的机械/装配偏置（比如直道上总是恒定地偏一点点），加一个<strong>很小、且带积分分离和限幅</strong>的 I 来纠正这个系统性偏差，反而是有道理的——自动驾驶里的转向 PID 也常用一个小 I 去吃掉这种 steering drift。结论：以 PD 为主导，I 看场景按需加一点点，别一概而论。</p>
</div>
<h3>第 3 步：提速，然后到赛场复调</h3>
<p>低速时系统更宽容、容易看清振荡，所以前面都是先慢速调通。调稳之后再逐步把基础速度提上去。</p>
<div class="ds-callout ds-callout-warning" style="border-left:4px solid #ff9100;background:#ff910014;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#ff9100"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 提速后参数往往要回调</p>
<p>速度和转向是耦合的：提速后原来的方向环参数常常偏大，需要回调；高速过弯还得配合弯道减速策略（按曲率或偏差大小压低基础速度）。这也是为什么很多队伍会准备<strong>两套甚至三套</strong>参数：直线一套（快）、弯道一套（稳），现场用按键 + OLED 切换。</p>
</div>
<p>实战里就有人这么干：某 2024 电赛 H 题循迹分享里，直线用 Kp=500 / Kd=0，弯道单独用 Kp=900 / Kd=200，两套动态参数切换跑（<a href="https://blog.csdn.net/AzureMeadow65/article/details/154388185" target="_blank" rel="noopener noreferrer">来源</a>）。</p>
<div class="ds-callout ds-callout-danger" style="border-left:4px solid #ff1744;background:#ff174414;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#ff1744"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f525.png" alt="🔥" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 实验室调好 ≠ 赛场能跑</p>
<p>赛场的光照、地面摩擦、电池电量都和你实验室不一样。灰度/电感的阈值受环境光影响极大，PID 也会跟着变。一定要赶到现场，用赛道真实材质和光照重新标定阈值、复调参数，并且留大约 20% 的参数余量。满电调好的车，亏电时同一个 PWM 转速会掉，赛前务必在&#8221;比赛会用到的电量水平&#8221;下再复测一遍。</p>
</div>
<h2>从临界振荡起步：试凑法标准步骤</h2>
<p>上面是&#8221;流程顺序&#8221;，那每一个环具体怎么把 P 加上去？这里有个经典的标准动作。</p>
<p><strong>试凑法（先 P 后 I 后 D）：</strong></p>
<ol>
<li>把 I、D 都去掉（只留 P）。</li>
<li>把 Kp 从小往大加，一直加到系统出现<strong>等幅振荡</strong>（不收敛也不发散，匀速来回晃）。</li>
<li>把 Kp 减小到振荡刚好消失，再取这个值的 <strong>60%~70%</strong>（或者干脆乘 0.6）作为最终 P。</li>
<li>需要消静差就加 I：积分时间 Ti 先设一个大初值，逐步往小减，减到出现振荡，再回头把它加大到 <strong>150%~180%</strong>。</li>
<li>需要压超调就加 D：Td 一般取 0，或者取不振荡时的约 <strong>30%</strong>。</li>
</ol>
<div class="ds-callout ds-callout-example" style="border-left:4px solid #7c4dff;background:#7c4dff14;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#7c4dff"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9e9.png" alt="🧩" class="wp-smiley" style="height: 1em; max-height: 1em;" /> &quot;先 P 到振荡再退一点&quot;像调水龙头水温</p>
<p>先把热水开到烫手（临界振荡点），确认这是上限，再往回拧一点点到刚好舒服（退到 60%~70%）。临界点是稳定边界，退一档是为了在&#8221;反应快&#8221;和&#8221;不失稳&#8221;之间留余量。</p>
</div>
<div class="ds-callout ds-callout-danger" style="border-left:4px solid #ff1744;background:#ff174414;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#ff1744"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f525.png" alt="🔥" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 找&quot;等幅振荡&quot;时小心车冲出去</p>
<p>把 Kp 往上加到振荡的过程中，车随时可能失控冲出赛道甚至翻车。建议先低速、把轮子架空、或者用手扶着测。另外电机有死区——Kp 太小时电机可能压根不转，表现为&#8221;调不动&#8221;，这时要先克服死区（做死区补偿）。</p>
</div>
<h2>想要个起步估计：Ziegler-Nichols 临界比例度法</h2>
<p>试凑法靠手感，如果你想要一个能&#8221;算出起点&#8221;的方法，可以用经典的 Ziegler-Nichols（临界比例度法）。</p>
<p>做法：把 I、D 去掉，逐渐加大 Kp 到系统首次出现等幅振荡，记下此时的<strong>临界增益 $K_u$</strong> 和<strong>临界振荡周期 $T_u$</strong>，然后查表。</p>
<p>标准版（最常用，会产生约 25% 超调、四分之一衰减）：</p>
<p class="ds-math" style="overflow-x:auto">$$K_p = 0.6 K_u, \quad T_i = 0.5 T_u, \quad T_d = 0.125 T_u$$</p>
<p>换算成常见的并联形式就是 $K_i = 1.2 K_u / T_u$、$K_d = 0.075 K_u T_u$。</p>
<p>野火文档里给的查表版本（数值上和标准版接近）：</p>
<table>
<thead>
<tr>
<th>控制器</th>
<th>Kp</th>
<th>Ki / Kd</th>
</tr>
</thead>
<tbody>
<tr>
<td>仅 P</td>
<td>$K_u/2$</td>
<td>—</td>
</tr>
<tr>
<td>PI</td>
<td>$K_u/2.2$</td>
<td>$K_i = K_p/(0.833\,T_u)$</td>
</tr>
<tr>
<td>PID</td>
<td>$K_u/1.7$</td>
<td>$K_i = K_p/(0.5\,T_u)$，$K_d = 0.125\,T_u\,K_p$</td>
</tr>
</tbody>
</table>
<div class="ds-callout ds-callout-warning" style="border-left:4px solid #ff9100;background:#ff910014;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#ff9100"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 几个容易被网上资料带歪的点，务必记清楚</p>
<ul>
<li>$K_p = 0.45 K_u$ 是 <strong>PI 控制器</strong>的 Kp，<strong>不是</strong>什么&#8221;PID 降超调版&#8221;。真正的 PID 低超调变体是 $K_p = 0.2 K_u$、$T_d = 0.333 T_u$（no overshoot），或 $K_p = 0.333 K_u$（some overshoot）。</li>
<li>网上有种说法是&#8221;PI 段把 Kp 设成临界 Kp 的 5/6&#8243;，<strong>这是错的</strong>。5/6 指的是 PI 的积分时间 $T_i \approx 0.833\,T_u$（临界周期的 5/6），不是比例系数。相对 PID 的 Kp，PI 的 Kp 其实是 $0.45/0.6 = 3/4$。别把积分时间的系数张冠李戴安到 Kp 上。</li>
<li>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$）。</li>
</ul>
</div>
<h2>重头戏：看波形治百病</h2>
<p>如果说前面是&#8221;流程&#8221;，那这一节是这一篇的灵魂。<strong>你能不能调好 PID，很大程度取决于你能不能把车的状态&#8221;看见&#8221;。</strong> 盲调和看着波形调，效率差一个数量级。</p>
<h3>工具：VOFA+ 串口示波器</h3>
<p>最主流、免费的工具是 <strong>VOFA+</strong>。思路非常简单：在控制环里用 printf 同时发出&#8221;目标值&#8221;和&#8221;实际值&#8221;两路数据，VOFA+ 把字节流翻译成实时曲线画出来。你一眼就能看到实际值是怎么去追目标值的——是慢慢爬上去、还是冲过头来回荡、还是死活差一截。需要的话还能多发几路（比如 PID 的分项、PWM 输出）一起看。</p>
<p>VOFA+ 有三种数据协议，按你的通道数和频率选：</p>
<table>
<thead>
<tr>
<th>协议</th>
<th>格式</th>
<th>适用</th>
<th>注意</th>
</tr>
</thead>
<tbody>
<tr>
<td>FireWater</td>
<td>逗号分隔的文本 + 换行</td>
<td>通道少、频率低（3~4 路、&lt;100Hz）</td>
<td><strong>末尾必须有换行</strong>，否则不解析、画不出波形</td>
</tr>
<tr>
<td>JustFloat</td>
<td>小端 float 数组 + 帧尾</td>
<td>多通道高频首选</td>
<td>帧尾固定 <code>0x00 0x00 0x80 0x7F</code>；接收区<strong>必须勾&#8221;十六进制&#8221;</strong>；缺帧尾会卡死</td>
</tr>
<tr>
<td>RawData</td>
<td>原始字节按通道切</td>
<td>特殊场景</td>
<td>—</td>
</tr>
</tbody>
</table>
<div class="ds-callout ds-callout-tip" style="border-left:4px solid #00bfa6;background:#00bfa614;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#00bfa6"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 通道多、频率高就用 JustFloat</p>
<p>JustFloat 那个帧尾 <code>0x00 0x00 0x80 0x7F</code> 其实就是单精度浮点的正无穷（+inf），正常数据不会出现这个值，所以拿它当帧的分隔标志最稳。波特率常用 115200，要发很多通道高频数据时上 460800 / 921600。注意 51 单片机的 float 是大端，用 JustFloat 要先翻转字节序。</p>
<p>带宽够不够可以粗算一下：JustFloat 每通道每帧 4 字节，加 4 字节帧尾，n 通道、f Hz 大约需要 $(4n+4)\cdot f$ 字节/秒。比如 6 通道、1kHz 约 28 KB/s，而 115200 波特（8N1）只有约 11.5 KB/s，根本不够——这时要么提波特率，要么降通道、降回传频率。</p>
</div>
<h3>诊断表：波形长什么样 → 该动哪个参数</h3>
<p>这是最可操作的产出，建议直接背下来：</p>
<table>
<thead>
<tr>
<th>波形症状</th>
<th>病因</th>
<th>处方</th>
</tr>
</thead>
<tbody>
<tr>
<td>实际值上得很慢，半天追不上目标</td>
<td>响应不够</td>
<td><strong>加大 P</strong>（或加 I 作用）</td>
</tr>
<tr>
<td>频繁来回振荡、等幅晃</td>
<td>P 太大</td>
<td><strong>减小 P</strong></td>
</tr>
<tr>
<td>一下子冲过头、超调大</td>
<td>阻尼不够</td>
<td><strong>加 D</strong>（或减小 P/I）</td>
</tr>
<tr>
<td>稳定后总差一截、贴不到目标线</td>
<td>静差</td>
<td><strong>加 I</strong></td>
</tr>
<tr>
<td>波形发散、越晃越大</td>
<td>P 严重过大</td>
<td><strong>立刻减小 P</strong></td>
</tr>
<tr>
<td>加了 I 之后新出现超调</td>
<td>I 太猛</td>
<td>加 D 或减 I</td>
</tr>
<tr>
<td>高频毛刺、整体其实跟得上</td>
<td>噪声 / D 太大</td>
<td><strong>减 D 或加滤波</strong>（别误当振荡去减 P！）</td>
</tr>
</tbody>
</table>
<p>一句口诀帮你记住分工：<strong>P 主管响应、I 消除静差、D 抑制振荡。</strong></p>
<p>理想的响应曲线长什么样？老一辈工控人有个判据叫&#8221;<strong>两个波，前高后低四比一</strong>&#8220;——也就是超调后回落，相邻两个波峰幅值约 4:1 衰减比，既反应快又稳得住。</p>
<div class="ds-callout ds-callout-example" style="border-left:4px solid #7c4dff;background:#7c4dff14;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#7c4dff"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9e9.png" alt="🧩" class="wp-smiley" style="height: 1em; max-height: 1em;" /> D 项怕噪声，像近视眼盯着抖动的字</p>
<p>表里那条&#8221;高频毛刺别误当振荡&#8221;特别重要。微分看的是&#8221;变化快不快&#8221;，传感器信号稍微一抖，D 就以为出大事了猛打方向。所以遇到高频抖，第一反应应该是<strong>减 D 或给反馈加低通滤波</strong>，而不是去减 P。这也是为什么工程上常用&#8221;不完全微分&#8221;（给 D 串一个一阶低通）和&#8221;微分先行&#8221;（只对反馈测量值求导、不对误差求导，避免目标突变时产生微分冲击）。具体这些补丁怎么写，《PID 进阶：串级+工程补丁》一篇里都给过代码，这里就不重复了。</p>
</div>
<p>下面这张图把整个看波形的判断逻辑串起来：</p>
<figure class="ds-diagram" style="text-align:center;margin:1.3em 0"><img decoding="async" src="https://cloudlay.cn/wp-content/uploads/dianseiche/d29647dc4dc5.png" alt="电赛小车电控 · 示意图" loading="lazy" style="max-width:100%;height:auto;background:#fff;border-radius:8px;padding:6px;box-shadow:0 1px 6px rgba(0,0,0,.25)"></figure>
<div class="ds-callout ds-callout-warning" style="border-left:4px solid #ff9100;background:#ff910014;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#ff9100"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 有一类&quot;调不好&quot;，加大 D 也救不回</p>
<p>如果你的反馈本身有明显延迟——比如图像处理耗时、传感器采集到 PID 执行之间隔了很久——这相当于给系统加了纯滞后，会让本来稳定的 Kp 突然开始振荡。这种问题加 D 没用，得从源头缩短&#8221;采集→计算→执行&#8221;这条链路，或者上更高级的预估补偿。所以波形怎么调都不对的时候，回头看看是不是时序出了问题。</p>
</div>
<h2>在线调参：别每改一个数就重新烧录</h2>
<p>调参是个反复试的活。如果每改一次参数都要重新编译、烧录、复位、再跑，一天调不了几轮。高名次队伍的共同点之一，就是把&#8221;改参数&#8221;这件事做成在线的。三种手段：</p>
<p><strong>1. 板载按键 + OLED（现场最稳，比赛桌上首选）</strong></p>
<p>把 P/I/D 存成数组，用按键选择当前要改哪个参数、加减键步进调整，OLED 实时显示。不用连电脑、不用重新下载、抗 PC 干扰。整定满意后把参数写进 Flash 掉电保存。</p>
<div class="ds-callout ds-callout-tip" style="border-left:4px solid #00bfa6;background:#00bfa614;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#00bfa6"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 比赛现场优先用按键 + OLED</p>
<p>赛场电磁环境复杂、桌子上一堆人挤，连着电脑反而是累赘。一块板载 OLED + 几个按键，独立、稳、快，是封箱前最后整定的标配。记得改完一定要存进 Flash，否则一断电参数全丢，现场重调哭都来不及。</p>
</div>
<p><strong>2. 蓝牙 / 2.4G 无线透传（跑动中调参）</strong></p>
<p>平衡车、高速车这种&#8221;必须跑起来才能看出参数好坏&#8221;的场景，用 HC-05 蓝牙（或 NRF24L01 这类 2.4G）做无线串口透传。在 VOFA+ 或手机上发命令帧改参数，车继续跑，同时把波形实时回传回来。</p>
<p>下位机解析命令帧的通用做法：定好帧头帧尾，用 DMA + 串口空闲（IDLE）中断收变长包，收到后用 <code>strstr</code> 定位关键字、<code>atof</code> 把字符串转成 float。</p>
<div class="ds-callout ds-callout-warning" style="border-left:4px solid #ff9100;background:#ff910014;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#ff9100"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 无线调参必须同时回传波形，否则等于盲调</p>
<p>无线的全部价值在于&#8221;车在跑，你在看&#8221;。如果只发参数下去、不把波形传回来，你根本不知道改完变好还是变坏，那无线就白用了。还有，蓝牙带宽有限，多通道高频回传会丢包——这时候降通道数或者把回传频率降到 50~100Hz。</p>
</div>
<p><strong>3. MATLAB 系统辨识（算个起点）</strong></p>
<p>进阶玩法：开环给电机一个恒定 PWM，记录转速响应，拟合出传递函数，再用 PID Tuner 算出一组起步参数。拟合率（fit）大于 80% 基本就能用。注意 PID Tuner 算出的连续 I 项要乘以采样周期才是离散位置式的 Ki。这套适合给速度环找起点，但最终还是得回到车上微调。</p>
<h2>一个能照抄的 PID 实现（含输出限幅）</h2>
<p>理论说够了，给一份电赛 H 题国奖工程里用过的通用 PID 实现——同一个结构体支持位置式和增量式两种模式，并且带上必做的输出限幅（<a href="https://github.com/abcuer/2024-NUEDC-H-TI_CAR" target="_blank" rel="noopener noreferrer">来源</a>）：</p>
<pre><code class="language-c">// 通用 PID：一个结构体两种模式（来自 2024 电赛 H 题开源工程）
void PID_Calculate(PID_Struct *pid){
    pid-&gt;error[0] = pid-&gt;target - pid-&gt;now;   // 当前偏差
    if(pid-&gt;mode == DELTA_PID){               // 增量式（电机速度环常用）
        pid-&gt;pout = pid-&gt;p * (pid-&gt;error[0] - pid-&gt;error[1]);
        pid-&gt;iout = pid-&gt;i *  pid-&gt;error[0];
        pid-&gt;dout = pid-&gt;d * (pid-&gt;error[0] - 2*pid-&gt;error[1] + pid-&gt;error[2]);
        pid-&gt;out += pid-&gt;pout + pid-&gt;iout + pid-&gt;dout;   // 注意是累加增量
    } else if(pid-&gt;mode == POSITION_PID){     // 位置式（方向/角度环常用）
        pid-&gt;pout = pid-&gt;p *  pid-&gt;error[0];
        pid-&gt;iout = pid-&gt;i *  pid-&gt;error[0];
        pid-&gt;dout = pid-&gt;d * (pid-&gt;error[0] - pid-&gt;error[1]);
        pid-&gt;out  = pid-&gt;pout + pid-&gt;iout + pid-&gt;dout;    // 直接赋值
    }
    pid-&gt;error[2] = pid-&gt;error[1];            // 历史偏差移位
    pid-&gt;error[1] = pid-&gt;error[0];
}

// 输出限幅：位置式/增量式都必须做，否则容易烧电机或舵机
void PID_OutPutLimit(PID_Struct *pid, float duty){
    if(pid-&gt;out &gt;=  duty) pid-&gt;out =  duty;
    if(pid-&gt;out &lt;= -duty) pid-&gt;out = -duty;
}</code></pre>
<div class="ds-callout ds-callout-danger" style="border-left:4px solid #ff1744;background:#ff174414;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#ff1744"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f525.png" alt="🔥" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 限幅是必做项，不是可选项</p>
<p>位置式还要额外做积分限幅和积分分离（偏差超过某个阈值时干脆不累加 I），防止积分饱和。积分饱和是什么概念——上电瞬间或大偏差时误差很大，I 项会迅速攒到饱和，等误差反向了它还在用力过猛，结果就是巨大超调甚至冲出赛道。这就像憋了一肚子气：你越攒越气，等对方道歉了你还在继续发飙，所以得&#8221;积分分离&#8221;——大事化小前先别记仇。这些工程补丁的完整写法，前一篇《PID 进阶：串级+工程补丁》里成套讲过。</p>
</div>
<p>循迹车把方向环输出叠加到左右轮基础速度上，实现差速转向：</p>
<pre><code class="language-c">// 七路灰度加权求中线偏差，target=0（车正好压在中线）
track_pid.now    = weighted_sum / sum;
track_pid.target = 0;
PID_Calculate(&amp;track_pid);
PID_OutPutLimit(&amp;track_pid, 800);          // 方向环输出限幅 ±800
Motor_LeftCtrl (basespeed - track_pid.out); // 左轮 = 基础速度 - 转向量
Motor_RightCtrl(basespeed + track_pid.out); // 右轮 = 基础速度 + 转向量</code></pre>
<p>差速运动学的本质就是这两行：左右轮一个减一个加，差出来的速度差就是转向。对应公式 $v_L = v &#8211; \frac{\omega L}{2}$、$v_R = v + \frac{\omega L}{2}$（$v$ 线速度、$\omega$ 角速度、$L$ 轮距）。左右到底是加还是减，取决于你的电机安装方向，跑一下不对就互换。</p>
<h2>各场景 PID 经验起点数值表</h2>
<p>再强调一遍：<strong>下面全是起点量级，不是答案，必须现场重调。</strong> 给它们是为了让你不至于从零开始瞎蒙，知道&#8221;大概在哪个数量级&#8221;。</p>
<table>
<thead>
<tr>
<th>场景</th>
<th>控制方式</th>
<th>参考起点（仅量级）</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td>电机速度环</td>
<td>增量式</td>
<td>Kp ≈ 0.5~6，Ki ≈ 0.008~8.5，Kd≈0</td>
<td>增量式 Ki 与位置式量纲不同</td>
</tr>
<tr>
<td>方向环（偏差归一化）</td>
<td>位置式 PD</td>
<td>Kp ≈ 7~8，Kd ≈ -0.1</td>
<td>H 题角度环量级</td>
</tr>
<tr>
<td>方向环（偏差用像素/电感差）</td>
<td>位置式 PD</td>
<td>直线 Kp≈500，弯道 Kp≈900/Kd≈200</td>
<td>偏差量纲大故 Kp 大</td>
</tr>
<tr>
<td>送药车速度环（串级位置式）</td>
<td>位置式</td>
<td>Kp=6.0，Ki=8.5，Kd=0</td>
<td>car_template 实测</td>
</tr>
<tr>
<td>送药车位置外环</td>
<td>位置式</td>
<td>Kp=0.3，Ki=0，Kd=0</td>
<td>car_template 实测</td>
</tr>
<tr>
<td>控制 / 采样周期</td>
<td>—</td>
<td>速度内环 1~10ms（100~1000Hz）</td>
<td>内环要快于外环</td>
</tr>
<tr>
<td>电机 PWM 频率</td>
<td>—</td>
<td>17~24kHz</td>
<td>见下方说明</td>
</tr>
<tr>
<td>舵机 PWM</td>
<td>—</td>
<td>50Hz / 周期 20ms，脉宽 0.5~2.5ms</td>
<td>1.5ms 附近中位</td>
</tr>
</tbody>
</table>
<p>关于控制周期和 PWM 频率，初学者最容易混成一件事，这里务必分清：</p>
<div class="ds-callout ds-callout-important" style="border-left:4px solid #00bcd4;background:#00bcd414;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#00bcd4"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2757.png" alt="❗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 控制周期 ≠ PWM 频率，两者差几十上百倍</p>
<ul>
<li><strong>PWM 频率</strong>（电机驱动的载波）：决定电机转得平不平滑、吵不吵。</li>
<li><strong>PID 控制周期</strong>（定时器中断里跑一次 PID 的间隔）：通常 1~10ms，也就是 100~1000Hz。2024 电赛 H 题很多队伍就是 10ms 定时器中断里跑整套 PID。</li>
</ul>
<p>串级时内环周期要明显小于外环（量级上内环带宽是外环的 3~10 倍），代码上用一个计数器实现：内环每次中断都算，外环每隔 N 次中断才算一次。</p>
</div>
<div class="ds-callout ds-callout-warning" style="border-left:4px solid #ff9100;background:#ff910014;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#ff9100"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 内外环分频，别忘了&quot;周期&quot;也跟着变</p>
<p>外环每 N 次中断才算一次，那它 PID 公式里的积分/微分用的就该是外环的真实周期 $N\cdot T$，而不是基本中断周期 $T$。很多人这里偷懒直接用 T，结果 Ki/Kd 的物理意义被分频系数悄悄改掉，调出来的参数换个分频就不对——这是很隐蔽的 bug。</p>
</div>
<p>关于 PWM 频率到底取多少，有个常被网上资料说错的点：</p>
<div class="ds-callout ds-callout-warning" style="border-left:4px solid #ff9100;background:#ff910014;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#ff9100"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> &quot;10kHz 就能避开啸叫&quot;是不准确的</p>
<p>人耳上限大约 20kHz，所以 <strong>10kHz、17kHz 其实大多数人还是听得到的</strong>（尤其年轻人，10kHz 会是明显的尖啸）。要真正做到&#8221;超声静音&#8221;，PWM 要提到 <strong>20kHz 以上</strong>。代价是开关损耗增大、对驱动 MOS 要求更高，而且在固定定时器时钟下频率越高、占空比分辨率越低。所以 17~24kHz 是&#8221;避人耳&#8221;和&#8221;保住分辨率/控制损耗&#8221;之间的折中，24kHz 更稳妥。10kHz 常被选用主要是图省开关损耗，不是因为它真的安静。</p>
</div>
<h2>串级调参顺序与现场快速整定</h2>
<p>把前面的拼起来，串级双环的完整调参顺序是：</p>
<ul>
<li>☐ <strong>第 0 步</strong>：验机械、验编码器、验极性，舵机标中值限幅，开环标定好中值/死区。</li>
<li>☐ <strong>第 1 步</strong>：屏蔽外环，单独调速度内环（增量式）。给固定目标速度，调到&#8221;目标一变实际能快速平滑跟上、受扰不振荡&#8221;。</li>
<li>☐ <strong>第 2 步</strong>：套上方向/位置外环（位置式 PD）。先加 P 到能跟线，再加 D 压超调，方向环一般不加或只加极小 I。</li>
<li>☐ <strong>第 3 步</strong>：逐步提速，弯道单独降速；准备 2~3 套参数现场切换。</li>
<li>☐ <strong>现场</strong>：到赛道真实材质/光照下重标阈值、复调参数，留 20% 余量，在比赛电量水平下复测。</li>
</ul>
<div class="ds-callout ds-callout-success" style="border-left:4px solid #00c853;background:#00c85314;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#00c853"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 现场快速整定的三个救命动作</p>
<ol>
<li>先用按键 + OLED 把当前波形/偏差显示出来，确认信号正常。</li>
<li>速度先压一半，把车调到&#8221;稳&#8221;，确认不冲出、不画龙，再慢慢提速度找&#8221;快&#8221;。</li>
<li>任何一次改参后，立刻让车在赛道上跑一遍看实际表现，并把满意的参数存进 Flash。封箱前最后一次整定，一定在比赛要用的那块电池电量下做。</li>
</ol>
</div>
<h2>几个反复要人命的坑，最后再钉一遍</h2>
<div class="ds-callout ds-callout-danger" style="border-left:4px solid #ff1744;background:#ff174414;padding:.6em 1em;margin:1.2em 0;border-radius:6px">
<p style="margin:0 0 .45em;font-weight:700;color:#ff1744"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f525.png" alt="🔥" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 调参翻车排行榜</p>
<ul>
<li><strong>忘记限幅</strong>：位置式/增量式都要做输出限幅；位置式还要积分限幅 + 积分分离。不做会积分饱和、超调冲出，甚至烧电机舵机。</li>
<li><strong>照抄别人数值</strong>：换车、换编码器、换电压、换控制周期，参数全得重调。</li>
<li><strong>改了控制周期忘重调</strong>：多数代码把采样周期 T 合进了系数里，周期一变等效增益全变。更稳的做法是把控制环放在硬件定时器中断里保证 T 恒定，或者在公式里用实测 dt 动态算积分/微分。</li>
<li><strong>增量式系数当位置式用</strong>：量纲不同，照抄差几个数量级。</li>
<li><strong>printf 阻塞主循环</strong>：高频发波形如果用阻塞式 <code>HAL_UART_Transmit</code>，发上千字节要几十毫秒，会把控制周期搅乱、车直接抖到失控。必须改 DMA + 环形缓冲非阻塞发送。</li>
<li><strong>低速测速噪声大</strong>：编码器用&#8221;单位时间计数&#8221;测速时，低速下每周期脉冲数少、量化噪声大，D 一放大就抖。这种情况低速宜改用&#8221;测脉冲间隔&#8221;的算法，并对速度反馈先滤波再进 PID，比一味减小 Kd 更治本。</li>
<li><strong>MPU6050 零飘</strong>：上电要静置校准零偏。注意一个常见误传——MPU6050 的 Yaw 漂移并没有&#8221;每秒 2 度&#8221;那么夸张，做过一次性零偏校准后裸积分大约是<strong>每分钟几度</strong>的量级，配上带零偏修正的姿态融合能压到约 0.5°/min。结论不变：航向类赛题预算允许就上 HWT101 / JY901 这类带融合的专用航向模块。</li>
</ul>
</div>
<p>调参这一关过了，你的车就有了&#8221;稳和准&#8221;的底子。但你可能还会问：前馈、模糊 PID、卡尔曼这些听起来很高级的东西，到底要不要上、什么时候上才不算本末倒置？这正是进阶控制算法那一篇要替你算的那笔性价比账。</p>
<div class="ds-series" style="border:1px solid #4488ff33;background:#4488ff0d;border-radius:8px;padding:.8em 1.1em;margin:1.2em 0">
<p style="margin:0 0 .5em"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 本文是 <strong>「从 0 到 1 带你打电赛 · 小车电控篇」</strong> 系列（共 12 篇）第 8 篇。</p>
<ol style="margin:.2em 0 0;padding-left:1.4em">
<li style="margin:.15em 0"><a href="https://cloudlay.cn/nuedc-car-01-how-to-score/">第1篇 · 拿奖逻辑：把比赛拆成小目标</a></li>
<li style="margin:.15em 0"><a href="https://cloudlay.cn/nuedc-car-02-history/">第2篇 · 赛题进化史与押题</a></li>
<li style="margin:.15em 0"><a href="https://cloudlay.cn/nuedc-car-03-build-and-architecture/">第3篇 · 整车搭建与代码框架</a></li>
<li style="margin:.15em 0"><a href="https://cloudlay.cn/nuedc-car-04-motor-power/">第4篇 · 电机驱动与电源地基</a></li>
<li style="margin:.15em 0"><a href="https://cloudlay.cn/nuedc-car-05-sensing/">第5篇 · 感知：灰度/电磁/编码器/IMU</a></li>
<li style="margin:.15em 0"><a href="https://cloudlay.cn/nuedc-car-06-pid-basics/">第6篇 · PID 入门：搞懂 P/I/D</a></li>
<li style="margin:.15em 0"><a href="https://cloudlay.cn/nuedc-car-07-pid-advanced/">第7篇 · PID 进阶：串级+工程补丁</a></li>
<li style="margin:.15em 0"><strong>第8篇 · PID 调参实战(核心)（本篇）</strong></li>
<li style="margin:.15em 0"><a href="https://cloudlay.cn/nuedc-car-09-advanced-control/">第9篇 · 进阶控制：几时该上</a></li>
<li style="margin:.15em 0"><a href="https://cloudlay.cn/nuedc-car-10-vision-comm/">第10篇 · K230 视觉与通信协议</a></li>
<li style="margin:.15em 0"><a href="https://cloudlay.cn/nuedc-car-11-architecture-fsm/">第11篇 · 状态机与整车软件</a></li>
<li style="margin:.15em 0"><a href="https://cloudlay.cn/nuedc-car-12-field-manual/">第12篇 · 现场作战+避坑+开源</a></li>
</ol>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://cloudlay.cn/nuedc-car-08-pid-tuning/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
