从0到1带你打电赛·小车电控篇(七):PID 进阶——方向环、串级双环,和「不做就翻车」的工程补丁

上一篇《PID 入门》里,我们把一个单电机的速度环从只有 P 开始,一步步调到能稳稳跟住目标速度。如果你已经跑通了那一步,恭喜——你已经摸到了控制的门。但单环只能让”一个量”听话,真正上赛道的车要同时管两件事:跑多快往哪拐。这一篇,我们把单环升级成能上场的完整控制:先讲方向环,再讲串级双环,最后讲一套”不打就翻车”的工程补丁。

先说一句大实话:很多人调车调到崩溃,以为是 Kp/Ki/Kd 没拧到位,其实十有八九是少打了某个补丁。这些补丁往往比纠结那三个参数更决定成败。 这篇就是带你把它们一次配齐。

方向环:偏差怎么变成”左右轮速度差”

小车靠两个轮子转向。想右转,就让右轮慢一点、左轮快一点,车头自然就偏过去了——跟划船一个道理。

💡 大白话比喻

差速转向像划船:想往右转,就右手轻划(右轮慢)、左手猛划(左轮快),船头就往右偏。方向环要算的,就是”该往哪边偏、偏多少力气”,然后左桨减、右桨加。

那”该偏多少”从哪来?来自一个偏差。这个偏差可以是: – 循迹题:摄像头看到的赛道中线偏差,或灰度/电感传感器的左右差(差比和); – 方向保持题:陀螺仪测到的偏航角(Yaw)误差,比如”我想走直线,结果车头偏了 5 度”。

把这个偏差喂给一个 PID(方向环实际上多数只用 PD,下面会解释),算出一个转向量 turn,再分配到左右轮:

$$\text{左轮目标} = \text{base} – \text{turn}, \qquad \text{右轮目标} = \text{base} + \text{turn}$$

base 是直行基础速度。这个加减号谁正谁负,取决于你电机和传感器的安装方向,调的时候试一下就知道。

它背后是差速车的运动学(给定线速度 $v$、角速度 $w$、轮距 $L$):

$$v_R = v + \tfrac{1}{2} w L, \qquad v_L = v – \tfrac{1}{2} w L$$

📝 别把轮距搞混

这里的 $L$ 是轮距(左右轮中心间距),不是前后轴距。代公式时别拿错尺寸。

平衡车里有个更直接的经典写法,是在 PWM 层直接把几路输出叠加,可以借鉴它的”共模/差模”思路:

// 直立项 + 速度项(共模,左右一样) ± 转向项(差模,左右相反)
Moto_Left  = Balance_Pwm + Velocity_Pwm - Turn_Pwm;   // 左轮
Moto_Right = Balance_Pwm + Velocity_Pwm + Turn_Pwm;   // 右轮

// 纯差速循迹小车去掉 Balance,在"目标速度层"做混合:
// Left_Speed_Goal  = base_speed - turn;
// Right_Speed_Goal = base_speed + turn;

方向环为什么常常只用 PD,不加 I?

方向环里那个 turn 一般用位置式 PD(位置式、增量式的区别《PID 入门》讲过了)。入弯时偏差会突然变大,这一下主要靠 D 项来响应——D 看的是”偏差变化率”,偏差一跳它最敏感,能让车提前打方向。

那 I 呢?社区里有很强的共识:方向环通常弱化甚至不加 I。原因有两个:陀螺仪有零飘、车轮会打滑,数据本身就不太准,靠 I 去”消静差”意义不大;而且 I 会引入延迟,过弯后车身”拖泥带水”半天回不到中线。

⚠️ 这条不要绝对化

“方向环绝对不能加 I”是个偏教条的说法。准确讲:方向环以 PD 为主导;但如果你的车存在固定的机械/装配偏置——比如装得不正、走直线总是恒定地偏一点点角度——这时加一个很小、并且带积分分离和限幅的 I 来纠正这个恒定偏角,是合理且有用的(自动驾驶 PID 理论里,I 项正是用来消除转向系统的恒定偏置/steering drift)。结论是:默认 PD,需要纠恒定偏置时再谨慎补一点小 I;但高速动态循迹下 I 过大确实会带来滞后和超调。

这里有个真实的坑:有人调方向环手痒加了积分,结果回正迟钝、过弯后车身拖泥带水回不到中线;去掉 I 只留 PD 后转向立刻干脆了。(来源)

调方向环之前,先验极性!

这是新手最容易栽的地方,而且一栽就是”参数怎么调都没用”。

🔥 极性接反 = 正反馈 = 直接失控

方向环极性接反,就像方向盘装反了:你想往左打,车却往右拐,而且越打越歪。这是正反馈,再完美的参数也救不了。

验极性的方法极简单:给一个正的 Kp,然后用手去转车。 – 车反抗你、想转回来 → 负反馈,极性对 ✅ – 车顺着你越转越欢 → 正反馈,极性反了 ❌,把符号取反,或交换电机线/陀螺仪安装方向

❗ 极性和增益要分两步调

先确认极性(符号)对,调大小(增益)。把这两件事混在一起,你会把”符号错”当成”参数不对”在那瞎拧。换了电机接线或陀螺仪安装方向后,必须重新验一遍极性。

调 P 和 D 的口诀和单环一样:从 D=0、只加 P 开始,P 加到走直线/循迹基本能跟线、但弯道略冲;再加 D 抑制过冲和振荡。P 太大直道会画龙(蛇形摆),D 太大对噪声敏感会高频抖舵。 一套能照抄的完整方向环调参步骤,留到《PID 调参实战》一篇细讲。

串级双环:老板与员工

单环 PID 自稳性还凑合,但一遇到负载变化——上坡、打滑、电池掉压——跟随就会滞后甚至失稳。串级(双反馈)PID 是控制赛道的标准答案,它的核心思想一句话:

💡 串级 PID 像老板和员工

外环是老板,只说”这个月业绩做到 100 万”(定目标),不亲自跑业务;内环是员工,负责”今天这一单怎么签下来”(快速执行)。老板看大方向(慢、稳),员工干具体活(快、勤)。老板的指令,就是员工的工作目标——这就是”外环输出 = 内环目标值”。

具体到小车: – 外环(方向/位置/角度):负责”对不对得准、到没到位”。它的输出不直接驱动电机,而是作为内环的目标值。 – 内环(速度/角速度):负责让实际转速快速精确跟上外环给的目标,输出才真正变成 PWM。

偏差大时,外环给一个大目标速度让车快速逼近;快到了,外环把目标速度收小,避免冲过头。

为什么这样就更抗造?举个上坡的例子:上坡瞬间电机实际转速被拖下来,内环立刻发现”我没跟上目标”,马上加大 PWM 顶上去(粗调、快),外环再慢慢保证最终到位(细调)。所以串级在变负载、高速时明显比单环稳,提速时不甩尾。(来源)

电赛小车电控 · 示意图

分工:速度内环用增量式 PI,方向外环用位置式 PD

多数车队的搭配是: – 速度内环 → 增量式 PI:输出是增量累加,电机不容易在正反转之间突跳,天然好处理饱和,只需输出限幅。 – 方向外环 → 位置式 PD:偏差直观、响应快,不加(或只加极小)I。

速度内环的标准写法(左轮为例,偏差 = 目标 − 编码器):

void Left_Speed_Control(void)
{
    float erro = Speed_Goal - Left_Encoder;            // 偏差 = 目标 - 编码器读数
    // 增量式: Δu = P*(e-e1) + I*e + D*(e-2*e1+e2)
    Left_Speed_PID.OUT += ( Left_Speed_PID.P * (erro - Left_Speed_Lasterro)
                          + Left_Speed_PID.I *  erro
                          + Left_Speed_PID.D * (erro - 2*Left_Speed_Lasterro + Left_Speed_Preverro) );
    Left_Speed_OUT = Range_protect((int)Left_Speed_PID.OUT, -9000, 9000); // 输出限幅
    Left_Speed_Preverro = Left_Speed_Lasterro;
    Left_Speed_Lasterro = erro;
}

📝 一个省事的小技巧

速度内环的反馈直接用编码器原始计数就行,不必费劲换算成”米/秒”这种真实物理速度——中间只差一个固定比例系数,会被 Kp 自动吸收掉。别为换算真实速度浪费精力。

⚠️ 上面代码里的 ±9000 不是"万能经验值"

这个限幅值强依赖你的定时器满量程(ARR)。正确的姿势是:输出限幅取 PWM 满量程的某个比例(比如 90%),具体数字随你的 ARR 而定。同理,网上各种”方向环 Kp = 0.6″之类的数字,都和反馈量纲、陀螺量程(±250/500/2000 dps)强相关,只能当某次实现的参考,不能跨平台照搬。换了平台必须从小到大重新整定。

内环要比外环跑得快得多

这是串级的命门:内环周期必须远小于外环周期。

💡 比喻:手速要快,战略可以慢

内环快外环慢,像打游戏:微操(补刀、走位)必须每秒几十次;大局观(什么时候推塔)几秒决策一次就够。要是战略也每秒变几十次,只会自己乱了阵脚。

经验上,内环周期取外环的 1/3 到 1/10(等价于内环带宽是外环的 3~10 倍)。这是跨多个来源一致的核心规律——量级上把握住就行,不必死抠精确数字。代码实现很简单,用一个计数器分频:内环每次中断都算,外环每隔 N 次才算一次。

// 在同一个定时器中断(周期 T)里:
current_loop();                       // 最内环:每次都算
if (outer_ring_timer % 2 == 0)        // 速度环:每 2T 算一次
    speed_loop();
if (outer_ring_timer % 3 == 0)        // 位置/方向外环:每 3T 算一次
    position_loop();
outer_ring_timer++;

野火的有刷电机三环例程就是这么干的:电流内环每 T、速度环每 2T、位置环每 3T。平衡车的经典分层大致是直立/角度环最快(约 5~10ms)、速度外环为它的若干倍周期。

📝 别把这组数字背死

“平衡车一定是角速度 2ms / 角度 10ms / 速度 50~100ms”这种说法偏死板。很多实现把速度环和直立环放同一个中断、只做几倍分频。真正重要的不是这组具体数字,而是保持内环明显快于外环的频率分离。2024 电赛 H 题里很多队伍直接用一个 10ms 定时器中断(100Hz)跑完整套 PID,也照样跑得很好。

🔥 一个常见的认知混乱:控制周期 ≠ PWM 频率

这俩差着几十上百倍,初学者最容易搞混: – PWM 载波频率(电机驱动):10~20kHz,决定电机平滑度和噪声。 – PID 控制周期(定时器中断里跑 PID):1~10ms,也就是 100~1000Hz。

这里要破一个常见误解:10kHz 并没有真正”避开可听噪声”——人耳上限约 20kHz,10kHz 反而是明显的尖啸。10kHz 只是兼顾电机平滑度、开关损耗(发热)与噪声的一个够用的折中下限要真正消除可听啸叫,得把 PWM 提到 20kHz 以上(超出人耳上限),代价是开关损耗变大、对驱动 MOS 要求更高。所以更稳妥的做法是直接上 20kHz 左右。(选驱动芯片和具体频率取舍见《电机驱动与电源地基》一篇。)

调参铁律:先调内环,后调外环

❗ 这是新手最大的坑:千万别先调外环

调外环时,外环”看到”的对象其实是内环 + 电机这个整体。如果内环本身不稳,这个整体特性就是飘的,你在它上面调出来的外环参数毫无意义,一换工况就废。

💡 比喻:先教会司机开车,再规划路线

如果司机(内环)连油门刹车都控制不稳,你给他再完美的导航(外环),车也开得东倒西歪。必须先把司机训练到指哪开哪、稳准快,路线规划才有意义。

正确流程: 1. 先屏蔽外环(把外环运算注释掉,或给内环一个固定目标速度)。 2. 单独调内环:让车架空或直线低速跑,给一个突变的目标速度,看编码器波形——调到能快速、平滑、几乎不超调地跟上,受扰后不振荡。 3. 内环稳了,对外环来说它就近似成了一个”稳定快速的等效环节”。这时再像调普通 PID 那样调外环:先加 P,再加 D。

⚠️ 调某一环时,把其它环的运算先注释/置零

一个真实教训(2020 全国智能车直立组):串级”一环套一环,出了问题根本分不清是哪个环”,整定极其耗时。这位选手三次整定分别花了 5~6 小时、2~3 小时、1 小时——熟能生巧没有捷径。所以一定要分环隔离、逐个整定,绝不要三个环一起调。(来源)

工程补丁八件套:不打就翻车

终于到了这一篇真正的”硬核私货”。下面这八个补丁,每一个都对应一类”调参怎么都调不好”的诡异现象。把它们配齐,你的车才算从”实验室能跑”进化到”赛场能扛”。

补丁 1:积分限幅 + 补丁 7:输出限幅

这俩是一对,一起讲。输出限幅是把最终 PWM 夹到 [-Max, Max]积分限幅是单独给积分累加项设上下界。

⚠️ 最常见的错误:只限输出,不限积分

很多人以为夹了输出就万事大吉。错。如果你只限输出不管积分,积分项还会偷偷涨到非常大,等误差反向时它迟迟泄不掉,车冲过头才肯回头。

💡 比喻

输出限幅是”限制方向盘最多打到底”,积分限幅是”限制你心里那股较劲的劲儿别攒太多”。只管方向盘、不管心里的劲,松手时车还是会猛回弹。

顺序也是固定的:先有输出限幅,anti-windup 才有”是否饱和”可判断。 国一开源 Enterprise_E 里就是电机环积分限幅 i_Max=1000、转向环 i_Max=400,和输出限幅各自独立。

补丁 2:积分分离

专治起步/大阶跃时的猛烈超调。思路:误差大时关掉积分(只用 PD 快速逼近),误差进入小范围才投入积分消静差。

💡 比喻:考试策略

离正确答案还很远时(大误差)别抠细节,先大刀阔斧往对的方向赶(只用 PD);快接近了(小误差)再用积分慢慢抠掉最后那点零头(静差)。

可以做成三段式平滑过渡:

if (pid->errABS > 50)         kiIndex = 0.000f;   // 大误差:关积分,纯 PD 冲
else if (pid->errABS > 30)    kiIndex = 0.600f;   // 中误差:半投
else                          kiIndex = 1.000f;   // 小误差:全投,消静差
pid->outPut = pid->outPutP + pid->outPutI * kiIndex + pid->outPutD;

实战反馈:智能车里积分分离比变速积分更直接好用、更干脆。(来源)

补丁 3:抗积分饱和(anti-windup)

这是积分类问题的总根源。积分饱和(windup)是指:误差长期同号 → 积分越累越大 → 输出顶到饱和 → 等误差反向时,积分要很久才泄完 → 造成大滞后、大超调。

💡 比喻:上长坡一直深踩油门

坡(误差)一直在,你脚越踩越深(积分越累越大);到了坡顶该松油门减速了(误差反向),可你脚踩得太深,要抬好久车才肯减速——这段”反应不过来”就是饱和带来的大滞后。anti-windup 就是”看到油门踩到底了,就别再使劲往下踩”。

有两大流派。

流派 A:遇限削弱(条件积分 / clamping)——输出已饱和时,只允许”会让积分往回退”的累加:

if (ABS(pid->outPutLast) > outPutLimit) {
    // 仅当积分会被"反向"削弱时才累加(误差与积分异号才累加)
    if ((pid->errSum > 0 && pid->errNow < 0)
     || (pid->errSum < 0 && pid->errNow > 0)) {
        pid->errSum += pid->errNow;
    }
    // 同号(会让积分更饱和) → 本次不累加
} else {
    pid->errSum += pid->errNow;   // 未饱和,正常累加
}

流派 B:反计算(back-calculation)——饱和时把”饱和差”按一定速率反喂给积分器,主动把它拉回来。离散实现很干脆:

# 先算未饱和输出 op
if op[i] > op_hi:        # 触上限
    op[i] = op_hi
    ie[i] = ie[i] - e[i] * delta_t    # 抵消本次积分增量
if op[i] < op_lo:        # 触下限
    op[i] = op_lo
    ie[i] = ie[i] - e[i] * delta_t

反计算有个跟踪时间常数 $T_t$,经验取 $T_t = \sqrt{T_i \cdot T_d}$,且满足 $T_d < T_t < T_i$;$T_t$ 越小,积分泄得越快。

📝 增量式 PID 算不算"天生免疫"饱和?

入门篇说过增量式”天然规避积分饱和”——这话基本对,但别理解得太绝对。增量式确实没有”显式累加 Σe 导致数值无界膨胀”那种经典 windup;但当 u(k)=u(k-1)+Δu 的输出被限幅(比如 PWM 顶到 100%)时,仍会出现类 windup 的滞后/退饱和延迟。严重时增量式照样需要反算抗饱和。准确说法是”不易/天然规避显式积分饱和”,不是”绝对不会饱和”。

补丁 4:微分先行 / 对测量值微分

专治”设定值突变”。如果微分项是对误差做差分,那么设定值一阶跃(比如目标速度从 0 突然变 100),误差瞬间巨变,微分项会蹦出一个巨大的尖峰冲击执行器——这就是 derivative kick(微分踢)

💡 比喻

微分踢像你正稳稳走路,突然有人把终点瞬移到很远——如果你对”目标距离的变化”做反应,会被吓得猛地一蹿。改成只盯自己脚步的变化(对测量值微分),就不会被目标瞬移惊到。

解法:微分项改用 $-(PV_k – PV_{k-1})$,作用在测量值上而非误差上:

// 微分项用 -(PV变化) 代替 (误差变化),二阶形式同时抑制噪声
u_k = u_k_1
    + KP*(e_k - e_k_1)
    + KI*e_k*dt
    - KD*(PV_k - 2*PV_k_1 + PV_k_2)/dt;

⚠️ 这只消了"微分踢",没消"比例踢"

上面这个式子里,比例项还是 KP*(e_k - e_k_1),设定值阶跃时它仍会让输出瞬间跳一下 KP*Δsp——这叫比例踢(proportional kick)。如果你的设定值会频繁大幅跳变、想把它也驯服,需要用设定值加权 / I-PD(二自由度)结构:让比例项也作用于测量值(或加权 KP*(β*sp - PV)),只让积分项作用于误差。记住:仅对 PV 微分只解决 derivative kick,比例踢得另行处理。

补丁 5:微分低通滤波(不完全微分)

专治”加大 D 就抖/啸叫”。纯微分会把编码器、陀螺仪、ADC 的高频噪声放大成抖动甚至尖啸。

💡 比喻:戴降噪耳机听节奏

不滤波时,旁边一点杂音(传感器噪声)都被你当成节拍剧烈摇头(抖动);滤波后只跟真正的鼓点(真实趋势)走。

做法是给微分项串一个一阶低通:

thisError = setpoint - processValue;
integral += thisError;
// 关键: (1-α)*新微分 + α*上次微分
thisDev = Kd*(1.0f - alpha)*(thisError - lasterror) + alpha*lastdev;
result  = Kp*thisError + Ki*integral + thisDev;
lasterror = thisError;
lastdev   = thisDev;

系数 $\alpha \in (0,1)$:$\alpha=0$ 无滤波、$\alpha=1$ 等于没微分。等价于工业界的微分滤波系数 $N$(典型 8~20,越小滤得越狠)。

❗ D 项的两大坑,要一起堵

derivative kick(对误差微分)和噪声放大(不滤波)是 D 项的两大坑,分别用对测量微分低通滤波解决。配齐这两个补丁,你的 Kd 才敢用得起来、敢加大。一个常见误判:Kd 过大引起的高频抖动,经常被当成”机械松动”——先确认是不是 D 没滤波,再去拧螺丝。

补丁 6:电机死区补偿

专治”低速/小误差时车原地哒哒抖,或干脆趴窝不动”。静摩擦加上 H 桥死区,会让占空比低于某个阈值(常见 5%~10%,或绝对值如 < 65/1000)时电机根本不转——这时控制增益在死区内突然变 0,系统就极限环抖动或卡死。

💡 比喻:太松的自行车链条

你蹬了一点(小占空比)链条还在空档没咬上,车不动;得先蹬过那段空档(死区补偿),后面才线性使上劲。

补偿就是输出非零时,叠加一个符号相关的偏置把死区”跨过去”:

if (out > 0)      out += DEAD_ZONE;   // 正向跨死区
else if (out < 0) out -= DEAD_ZONE;   // 反向跨死区
// out == 0 时保持 0,避免零点附近来回跳

⚠️ 别过补偿

死区补偿标定要准。补多了会在零点附近反复正反跳变,产生新的抖动。建议实测电机刚启动的最小占空比,再略加一点余量。另外,上闭环前先把电机中值/死区标定好——否则零点附近反复跳变,看起来像 PID 没调好,其实是死区在作怪。

补丁 8:电池电压补偿

这是”实验室调好、上场翻车”的隐形元凶。同一个占空比下,电机力矩正比于母线电压;电池从满电掉到欠压,等效 Kp 就悄悄变小了,高速时车会变软、摆头甚至失控。

💡 比喻:跑步时的体力

满电(刚出发)同样力气跑得快,没电(快到终点)同样力气跑得慢。补偿就是”累了就多使点劲”,让全程速度感一致——你练习时(满电)定的节奏,比赛后半程(亏电)也还成立。

补偿公式简单,但要 ADC 实测电池电压:

// V_NOMINAL 为标称/调参时电压, v_batt 由 ADC 实测
pwm_out = pid_out * (V_NOMINAL / v_batt);

📝 两个注意点

一是电压采样要滤波,否则电压噪声会反灌进 PWM;二是低于欠压保护阈值时应该限速而不是死命补偿。

一个真实战例:高速行驶时车突然失控摆头,排查半天发现是电池电量下降导致同占空比下力矩变小、等效 Kp 变软。加上电压补偿后,从满电到亏电表现终于一致了。(来源)

一张表,把八件套对号入座

你看到的症状 八成是缺了哪个补丁
起步给大目标,车猛冲过头(大超调) 积分分离 + 积分限幅 + anti-windup
误差反向后车迟迟不回头、退饱和慢 anti-windup(遇限削弱 / 反计算)
一改目标值,输出就猛地蹿一下 微分先行(对测量值微分)
一加大 Kd,车就高频抖/啸叫 微分低通滤波
低速/小误差原地哒哒抖或趴窝 死区补偿
满电调好上场,后半程变软/摆头 电池电压补偿
反向时积分泄不掉、冲过头 积分限幅(只限输出不够)
输出超过 PWM 量程 输出限幅(也是所有抗饱和的前提)

别忘了陀螺仪零飘

方向环如果用陀螺仪 Yaw 做反馈,零飘是绕不开的。一个真实战例:2024 电赛 H 题某队原计划用编码器 PID 调速,却发现两个轮子性能不一致、达到恒速的时间都不一样,被逼着改用陀螺仪 Yaw 检测偏航角控直行;结果省赛前夜先误烧了十轴模块,又发现 MPU6050 的 Yaw 在漂,最后比赛前 6 小时才把应急模块移植成功。(来源)

⚠️ 一个被广泛误传的数字

网上常说”MPU6050 的 Yaw 一秒漂 2 度”——这个严重高估了。经过一次性零偏校准后,MPU6050 的 Yaw 裸积分漂移大约是每分钟几度的量级;如果配上带零偏修正的姿态融合(如 Madgwick),能降到约 0.5°/分钟(≈0.008°/s)。”每秒 2 度”更像是完全没校零偏时的瞬时表现。

结论方向不变:Yaw 漂移确实需要处理。要么上电静止时采一次零偏并做软件纠偏,要么干脆换 HWT101/JY901 这类带磁/融合的专用航向模块。不处理的话,直行越走越偏、定角度转弯越转越不准。(零偏校准与互补滤波的具体做法见《感知:灰度/电磁/编码器/IMU》一篇。)

另外,左右电机/编码器往往天生不一致,最好左右各用一套速度 PID 参数分别整定,或在差速混合里加补偿,别指望一套参数包打天下。

收个尾:补丁配齐,参数才有意义

把这一篇捋一遍,你应该建立起这样一条心智:

电赛小车电控 · 示意图

✅ 这一篇的核心就三句话

  1. 先调内环、后调外环,分环隔离逐个整定,绝不三环一起上。
  2. 内环周期远小于外环(1/3~1/10),控制周期和 PWM 频率是两码事。
  3. 八件套补丁往往比 Kp/Ki/Kd 更决定成败——它们才是”调好了上场不翻车”的真正保险。

想看这套东西在真实比赛代码里长什么样,强烈推荐通读第十六届智能车国一开源 ittuann/Enterprise_E:它的 pid.c 把误差限幅、积分限幅、积分分离、专家 PID、前馈补偿全配齐了,注释也到位,是工程补丁落地的最佳样板;配套博客更是把抗饱和、积分分离、不完全微分讲透了。串级落地代码可以参考 STM32 的 xxpcb/stm32-motor-pid、TI MSPM0 赛道(对口 2024 H 题)的 Szturin/M0G3507-TI-CAR,原理教程则首推野火有刷电机多环控制

到这里,方向环、串级、补丁你都备齐了,但参数到底怎么从 0 一步步拧出来、波形该看哪些症状下哪些药——那才是真正的硬功夫。具体调参流程,我们留到下一篇 PID 调参实战,用一套能照抄的步骤和一张”波形症状→该调哪个参数”的诊断表,带你把这些参数一个个调到位。



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

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

暂无评论

发送评论 编辑评论


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