开篇先聊个我这些年做项目经常遇到的场景:某个电机调速系统,空载时转速还挺匀,一带上负载转速就往下掉;某个恒温箱,加热时温度冲到目标值以上好几度才慢慢回来;某个四轮小车走直线,一有偏差就左右来回画龙。这些问题看着五花八门,根子其实都指向同一个控制问题:系统有了偏离目标的偏差,该怎么快速、平稳、不折腾地把偏差压回去。而绝大多数现场采用的方案,就是今天要说的PID控制基础。
PID控制这三个字母,估计搞过自动化、嵌入式、机器人、电气、过程控制的兄弟都见过,它由比例(Proportional)、积分(Integral)、微分(Derivative)三个环节组成。说它基础,是因为它是所有自动控制入门的必修课;说它有用,是因为在绝大多数现场应用里,一个调好参数的PID已经能解决80%以上的闭环控制需求,不需要一上来就上什么模型预测、自适应控制那些复杂东西。
这篇内容我打算用我自己从零到一搭建一个闭环控制的小项目来展开,把PID的每个环节掰开揉碎讲清楚,再把手动整定参数、代码实现、现场调参踩过的坑一并整理出来。适合刚入门自动控制的学生、搞嵌入式开发的工程师,或者想把自己的加热、调速、温控系统做稳定的爱好者参考。文章里我不会堆一堆晦涩的传递函数公式,尽量用大白话和实际案例把逻辑讲透。
1. PID控制到底在解决什么问题
1.1 开环控制的最大矛盾:只管给指令,不管结果
先说个简单的场景:我想让一个直流电机以每分钟300转的速度旋转,直接给电机控制板一个固定占空比的PWM信号,比如60%占空比。电机空载时实测转速可能刚好是300转,但要是用手轻轻捏住电机轴,转速立刻掉到200转甚至更低。这个过程中,我给出去的PWM信号始终是60%,压根不知道转速已经掉了,更不会主动去补偿——这就是开环控制。
开环控制的本质是“只下指令,不看结果”。它在系统模型精确、外部干扰小、执行机构状态稳定的情况下可以用,比如步进电机在不过载、不失步的前提下,给多少脉冲走多少角度,基本不用反馈也能凑合。可一旦负载变化、电源电压波动、机构摩擦变大,开环系统的输出就跟着飘,而且飘到哪算哪,没有任何纠正机制。
我调试这个电机转速项目时,最直观的感受就是:风速、轴摩擦、电池电压这些外部因素全在干扰转速,开环根本稳不住。想用开环把转速稳定在目标值附近,唯一的办法是把系统模型算到足够精细、反复校正控制量,可现实中模型总会有偏差,干扰也不可预测。所以闭环控制就成了绕不开的选择。
1.2 闭环控制的本质:让系统自己跟目标做比较
闭环控制的核心思路说穿了很简单:不断测量当前的实际值,跟目标值比较,算出偏差,然后根据偏差大小和变化趋势决定控制量。还是那个电机,如果加了编码器测转速,控制器发现当前转速掉到250转、目标300转,偏差50转,那它就会增大力矩让转速回升,直到偏差消失。
PID控制器就是闭环控制里那个“根据偏差决定控制量”的算法环节。它把偏差喂进去,一顿计算后输出一个控制量(比如PWM占空比),系统执行这个控制量后改变被控对象的状态,再通过传感器测回新的实际值,形成一整条信息回路。
我习惯把PID拆成三个视角来看:比例环节看“现在偏了多少”,积分环节看“过去累计偏了多少”,微分环节看“现在正在朝哪个方向偏、偏的速度有多快”。这三个视角合在一起,控制器就能像一个有经验的操作员那样兼顾当前、过去和趋势来做出判断。
1.3 PID控制为什么在各行各业都吃得开
PID之所以这么普及,除了算法直观、调参不需要精确数学模型之外,还有几个很现实的原因:一是它的计算量小,在简单的单片机、PLC上都能以非常高的频率运行;二是它对传感器和执行机构的适应性强,温控、液位、转速、角度、流量、压力几乎都能用同一套逻辑套进去;三是工程实践经验非常充足,各种整定方法、经验公式、现场调试套路都成熟到可以直接抄作业。
我做过的一个恒温箱项目,加热盘是纯阻性负载,温度传感器是一个热电偶,在只用一个普通继电器的条件下,就可以通过PID输出按一定周期开断继电器,把温度稳定在目标值上下0.5度范围内。这种看似“简陋”的组合,PID照样能控制得很好。这也是为什么很多工业现场控制柜里,最常见的控制器就是一块带PID程序的仪表或者小型PLC。
2. P、I、D三个环节到底各自在干什么
2.1 P是定盘星:偏差越大,动作越猛
比例环节的公式是Kp * e(t),Kp是比例系数,e(t)是当前时刻的目标值与实际值之差。它的逻辑非常直白:偏差大,控制量就大;偏差小,控制量就小;没有偏差,控制量就是零(在纯比例控制下)。
用一个生活化的比喻来理解:你开车想保持跟前面车的距离,如果前车突然急刹导致距离拉近,你就会猛地踩一脚刹车;如果距离只是稍微近了一点点,你轻轻松一点油门就能修正。这个“距离偏差越大、脚下动作越猛”的对应关系,就是比例环节在做的事。
但纯比例控制有个天生短板:系统带了负载、摩擦或者散热这些外部因素后,光靠比例往往压不到精确目标。拿前面那个电机调速项目举例,如果只靠P环节,当系统达到某个稳态时,控制量正好能抵消干扰,这时候偏差就不再减小了,但偏差也不会为零,会留一个固定残差——这个残差就是我们常说的“稳态误差”。
经验上记住一条:加大Kp能让系统反应更快、稳态误差更小,但Kp过大会导致超调变大、系统振荡,甚至直接发散。
2.2 I是补漏王:历史亏欠,还是要还的
积分环节的公式是Ki * ∫e(t)dt,也就是偏差对时间的累计值乘以积分系数。它的存在就是为了消灭纯P控制留下的稳态误差。只要偏差不为零,积分项就会一直累计;偏差为正,积分越来越大,增加控制量;偏差为负,积分越来越小甚至反向;偏差为零,积分值保持住不再增。
继续用开车的例子:前面说的“保持车距”场景,如果路面是上坡,车不踩油门就会越来越慢、车距越拉越大。纯比例控制踩的那点油门不够克服重力,于是车距偏差会稳定在一个固定值。这时候如果加一个积分作用:只要车距大于目标,就慢慢把油门往上加,直到车距越来越接近目标,最后稳稳保持住。积分环节相当于在持续地把“欠下的账”一件件还清。
积分环节的参数整定很容易踩坑。Ki太大会让系统“记账记太猛”,输出快速冲到饱和,造成超调和振荡;Ki太小又会让消除稳态误差的过程拖得很慢。在温度控制这类惯性大的系统里,如果Ki设置不当,最典型的症状就是温度过冲好几度,然后花很长时间拉锯。
2.3 D是前瞻者:提前刹车,别等撞上了才反应
微分环节的公式是Kd * de(t)/dt,它看的是偏差的变化速度,也就是偏差在往哪个方向变、变得有多快。微分项在偏差快速增大时提前输出反向校正,在偏差快速缩小时也会反向作用,起到“阻尼”效果。
回到开车的比喻:你离前车距离只剩一点,同时前车还在急刹车、相对速度快速下降,这时候你不能等到马上就要撞上了才猛踩刹车,而是要根据相对速度的变化趋势提前重刹。微分项做的就是这件事——它不关心你现在偏了多少,而是关心你正在以多快的速度偏离或者回归。
微分项的引入能有效抑制超调,让系统更快、更平稳地冲到目标位置。但它有个致命弱点:对噪声极度敏感。传感器信号稍微有点毛刺,或者被控对象本身就有高频抖动,微分项就会被这些噪声放大,导致控制量剧烈跳变,执行机构跟着哆哆嗦嗦。所以工程上要么加低通滤波,要么干脆少用甚至不用D环节。
2.4 三个环节合在一起时的“话事权”分配
实际工程里,PID的三个环节很少是平均分配的。我调试过的项目大概有个经验规律:温度、液位这类大惯性慢系统,通常P为主、I为辅,D可以少加一点点或者不加;电机转速系统,P和I都要用,D在编码器信号质量好的情况下可以加一点;角度平衡这类快系统,P和D是主力,I要很谨慎地用小值,不然很容易振荡。
参数之间的配合也很微妙。增大Kp后可能需要小幅增大Kd来压超调,增大Ki后往往也需要加大Kd来抵消积分带来的振荡。调参的本质就是在这三个“话事人”之间找到一个平衡点,而这个平衡点必须是结合具体被控对象来摸索的。下面我用一个实际项目的调试过程把这种配合讲透。
| 环节 | 主要作用 | 直观表现 | 参数过大时的典型症状 |
|---|---|---|---|
| 比例P | 按当前偏差比例输出 | 偏差大出力大、偏差小出力小 | 超调大、持续振荡 |
| 积分I | 消除稳态误差 | 持续补偿历史偏差 | 过冲严重、收敛慢 |
| 微分D | 抑制趋势性变化 | 提前反向加阻尼 | 对噪声敏感、输出颤抖 |
3. 实操:一个直流电机稳速项目从零到稳
3.1 项目背景与硬件构成
这个模拟项目X的任务是让一个带编码器的直流减速电机稳定在指定转速,负载会随时变化(比如用手捏一下轴或者加个纸片做的风轮)。硬件上我用了一块常见的STM32单片机、一个电机驱动模块、一个带霍尔编码器的直流减速电机,再加一个电源模块。整个系统的采集与控制流程是:编码器每转一圈输出若干脉冲,单片机通过外部中断或定时器捕获脉冲数,计算出当前转速,然后把目标转速和当前转速的偏差送给PID算法,输出一个PWM占空比给驱动模块,驱动模块再控制电机两端电压。
选择单片机而不是直接用PLC,主要是为了把整个底层逻辑摸透。PID的代码没有多少行,但把它跑在单片机上,采样、计算、滤波这些细节都能暴露出来,特别适合学习。如果有人想把这套方案搬去Linux嵌入式或者ROS机器人平台,核心PID算法和调参思路完全通用。
3.2 如何确定采样周期和转速计算
PID是离散化运行的,每隔一个固定的采样周期执行一次:测一次转速、算一次偏差、算一次控制量、更新一次输出。采样周期怎么选?电机转速系统的经验值一般取控制回路的1/10到1/20。如果电机时间常数是几十毫秒量级,那采样周期选1到5毫秒比较合适。我实际项目里用了2毫秒,也就是每秒执行500次PID计算,这个频率对转速控制足够。
转速计算我用的方法是“定时器计数”:每2毫秒进一次定时器中断,读取编码器在这段时间内的脉冲计数,然后除以减速比和编码器线数换算成每秒多少转。用这种方式要注意,在转速很低的时候,2毫秒内的脉冲数可能只有几个甚至一两个,转速分辨率会变得很差。这时可以考虑用“脉冲间隔定时法”,也就是测两个脉冲之间的时间间隔来推算转速,低速时分辨率高得多。
3.3 PID代码的最小实现
PID的实现方式有很多,最常用的是位置式PID和增量式PID。位置式直接计算输出占空比的绝对值,增量式计算输出占空比的变化量,然后累加上一次输出。两种在电机调速里都常见,我用增量式比较多,因为它的输出变化是平滑叠加的,不容易在设定值突变时产生过大的控制量冲击。
下面贴一段我在这个项目里用过的位置式PID核心代码(C语言),去掉了硬件层,只保留算法主干:
typedef struct { float target; // 目标值 float actual; // 当前实际值 float err; // 当前偏差 float err_last; // 上一次偏差 float integral; // 积分累计值 float kp; float ki; float kd; float out; float out_max; // 输出限幅上限 float out_min; // 输出限幅下限 } PID_TypeDef; void PID_Calc(PID_TypeDef *pid) { pid->err = pid->target - pid->actual; // 积分项累加,带限幅 pid->integral += pid->ki * pid->err; if (pid->integral > pid->out_max) pid->integral = pid->out_max; if (pid->integral < pid->out_min) pid->integral = pid->out_min; // 比例项 float p_out = pid->kp * pid->err; // 微分项 float d_out = pid->kd * (pid->err - pid->err_last); pid->out = p_out + pid->integral + d_out; // 输出限幅 if (pid->out > pid->out_max) pid->out = pid->out_max; if (pid->out < pid->out_min) pid->out = pid->out_min; pid->err_last = pid->err; }这个实现虽然简单,但已经把几个关键点都覆盖了:积分限幅、输出限幅、偏差存储。实际使用中我还会在初始化时把integral和err_last清零,避免上电瞬间的误动作。
还有一点需要注意:PID输出的物理量要和执行机构匹配。电机调速里,PWM占空比的范围是0到100%,PID输出的正负号代表方向,输出大小可以归一化成占空比。如果目标转速小于当前转速,偏差为负,PID输出就会变为负方向,这时要判断电机是否需要反转,如果只是单向调速,就应该把负值截为0,或者用方向引脚来切换。
3.4 手动整定:从P开始一步步逼近稳定
我手动整定的思路遵循一套很实用的流程,适合新手直接照抄:
第一步:把所有积分系数和微分系数都设为0,只保留比例系数。从一个很小的Kp开始,增大到系统开始出现振荡为止,再把Kp退回振荡点的50%左右,得到一个基础比例系数。
第二步:加入积分环节。把Ki设成一个很小的值,一边观察稳态误差是否被消除,一边慢慢增大。如果发现转速冲到目标值之后有明显的过冲,说明Ki增太快了,退回一点。积分系数一般比比例系数小一个数量级以上,但具体要看采样周期,我用2毫秒采样时,合理Ki通常只有Kp的几分之一到几十分之一。
第三步:如果超调仍然偏大、系统收敛偏慢,再考虑加入微分项。Kd从非常小的值开始加,直到超调被明显抑制为止。注意观察电机声音和输出波形,如果输出开始高频抖动,说明Kd太大或者编码器噪声被放大。
在调试中,我习惯把目标转速设计成阶梯信号,让目标从0跳到300再跳到600,观察系统在设定值变化时的响应。一个调好的PID应该具备三个特征:上升过程没有明显过冲、稳态误差在允许范围内、对外部干扰能在几秒内快速修正。
3.5 调参过程中的几个关键参数记录
我把这个项目中不同阶段整定的参数记在了表里,方便对照理解:
| 阶段 | Kp | Ki | Kd | 系统表现 |
|---|---|---|---|---|
| 纯P | 0.8 | 0 | 0 | 转速在负载变化后回不到目标,稳态误差明显 |
| P+I | 0.8 | 0.03 | 0 | 稳态误差消除,但带负载切换时有轻微过冲 |
| P+I+D | 0.8 | 0.03 | 0.05 | 超冲明显减小,系统稳定时间缩短 |
| 参数再加大 | 1.5 | 0.08 | 0.1 | 出现周期性振荡,声音异常,必须回调 |
这套参数只对这个项目有效,参考的意义在于参数变化的趋势:P决定灵敏程度,I决定稳态精度,D决定抑制超调。真正的参数数值必须通过实验来标定。
4. 常见问题与排查技巧实录
4.1 问题一:输出一直顶在最大值,转速就是上不去
现象:电机启动后PWM占空比立刻顶到100%,转速还是达不到目标值,而且持续很长时间。
原因:这种症状最典型的是积分饱和。偏差持续存在时,积分项不断累加,PID的输出被限幅到最大,但已经没有进一步增大的空间了。当转速终于接近目标值时,积分项已经累计到了很高的值,需要花很长时间才能“放下来”,于是出现很大的超调和长时间的振荡。
处理:我已经在代码里加了积分限幅,这是第一道防线。更有效的办法是“积分分离”或者“抗积分饱和”。积分分离的思路是:当偏差绝对值大于某个阈值时,暂停积分累加;偏差缩小到阈值以内后,再恢复积分。相当于偏差大的时候不让它“记账”,偏差小的时候才让它消除稳态误差。
我实际操作中,把积分分离阈值设成目标转速的10%左右,效果比较理想。这样在电机加速阶段积分不会疯狂累计,到达目标附近的修正动作就会干净利落得多。
4.2 问题二:PWM输出高频抖动,电机声音发尖
现象:电机转动时声音明显刺耳,用示波器看PWM输出,发现控制量在小幅高频变动。
原因:微分环节对噪声的放大是首要嫌疑。编码器信号在高速时如果抖动,或者采样数据没有做滤波,微分项会把这种高频噪声乘以Kd后直接反映到输出上。另外,采样周期太短、PID计算频率太高也可能导致控制量在量化精度边缘抖动。
处理:先把Kd降到0,看抖动是否小时。如果抖动消失,说明问题出在微分噪声,需要对编码器读数做低通滤波或者均值滤波。我用的是一阶低通滤波:filtered = alpha * raw + (1 - alpha) * filtered_old,alpha取0.3左右,滤波后微分项稳定很多。抖动问题如果还残留,就检查PWM频率设置,电机驱动的PWM频率最好设在15kHz以上,避免开关频率落在人耳可听范围,同时也让电流纹波更小。
4.3 问题三:转速在目标值附近来回振荡,无法收敛
现象:转速波动范围大,甚至出现类似正弦波的周期性摆动,不管怎么调参数都压不住。
原因:几个可能混合在一起。一是Kp太大加上系统本身有滞后,控制动作总是“晚半步”,形成振荡;二是PID采样周期和系统惯量不匹配,采样太慢导致控制不连续;三是执行机构(电机驱动模块)非线性严重,死区附近控制量落地不稳。
处理:先降Kp,再检查采样周期。如果系统时间常数很小,采样周期就必须足够短。我用了一个经验公式:采样周期取被控对象纯迟延时间的1/4到1/10。电机系统虽然迟延很小,但如果PWM更新频率太低,控制量的更新滞后也一样会导致振荡,所以我把PWM更新和PID计算放在同一个定时器中断里,频率一致,从底层避免这个问题。
关于死区,工业阀门、液压系统里特别常见,就是控制量很小的时候执行机构根本不动。在PID算法里加一个输出死区判断:当偏差小于某个阈值时,直接把控制量清零或保持上次值,可以避免系统在小偏差处“一来一回”地反复动作。
4.4 问题四:目标值突变时系统猛烈超调
现象:把目标转速从100直接调到600,电机转速冲过600后反弹过大,甚至接近700才慢慢回来。
原因:目标值突变带来的本质问题是偏差突变。比例项瞬间变大,积分项也开始大幅累计,输出容易直接进入饱和。而且PID的微分项算的是偏差的变化量,目标突变那一刻的变化量会特别大,产生一个很大的反向校正,实际系统中这个校正要么来不及要么过度。
处理:一方面用前面说的积分分离,另一方面可以给目标值做个斜坡生成或者一阶滤波。也就是让目标值不是瞬间跳到600,而是从100以每毫秒几个单位的速度爬升到600,PID实际追逐的是一个缓变目标,冲击自然小很多。这个方法在工业仪表里也叫“设定值斜坡”,现场很实用。
4.5 调参顺序总结与避坑清单
我整理了一个调参顺序速查,适合拿来当日常checklist:
- 先把I和D置零,单独整定P,让系统不振荡。
- 加入I,从很小的值开始,每次增大后至少等系统稳定5到10秒再判断效果。
- 若超调偏大,再增加D,但先确认传感器信号足够干净。
- 每次只改一个参数,记录改动前后的阶跃响应曲线。
- 目标值和干扰都要测试,只调响应速度不测试抗干扰,到了现场多半要返工。
避坑方面,我反复提醒自己:不要一次性把三个参数同时调大,不要看到振荡就一味减小P,因为振荡也可能是I或D造成的,先锁定来源再动手。还有就是不要迷信网上抄来的参数,就算同一个电机型号、同一个驱动模块,机械装上负载之后惯量和摩擦力都不一样,参数必须现场重调。
5. 整定方法补充:不靠手感也能起步
5.1 用Z-N整定法拿到一套能用参数
手动按经验调参是基本功,但有时候项目赶时间、系统又不方便反复试,这时候可以用一些经典整定公式。比较经典的是Ziegler-Nichols开环阶跃响应法,流程是:先把PID全部关掉,只让系统开环,然后给执行器一个固定的阶跃输入,记录被控量的输出曲线。
从曲线上可以读出两个关键量:等效纯迟延时间τ和等效惯性时间常数T,然后按公式计算初始PID参数。这个方法在温控、流量、液位这类慢系统里特别出名,算出来的参数虽然不是最优,但通常已经能稳定工作,再手动微调一点就能收敛到不错的控制质量。
这个方法有个必要前提:一定要做开环阶跃实验,而且输入幅度要合适,让输出变化足够明显但又不至于触发保护或者进入非线性区。我实操时会在记录前确保系统处于稳定初态,阶跃开始后持续记录到输出到达新的稳态附近为止。
5.2 在MATLAB/Simulink里预仿真再下现场
如果系统能做精确建模或者有传递函数,我建议先在上位机软件里用工具包仿真一遍。为什么这么做?因为现场调参的风险成本高,错一次就可能烧驱动器或者撞限位。仿真里可以把P、I、D的参数随意试探,看看响应曲线变化趋势,形成直觉之后再回现场实测。
但仿真结果只能提供参考,不能完全照搬。我自己的经验是:仿真里参数普遍偏“理想”,到了现场要衰减到原来的60%到80%起步,因为仿真模型没有把电机死区、驱动模块非线性、传感器噪声、时序延迟这些实际因素全部include进去。
5.3 自适应和自整定概念要了解一下,但别迷信
现在不少控制器号称带“自整定”功能,一键自动算出PID参数。原理通常是系统自动施加一个扰动,测量响应曲线,然后用内置公式计算参数。用在新项目上确实能省不少事,但我的建议是:自整定出来的参数可以作为初始值,最终还是要人工微调,特别是负载特性变化大的场合,自整定结果往往过冲偏保守。
更进一步的自适应PID,会在线调整PID参数来应对系统特性的变化,实现复杂度高,工业现场一般也要建立在可靠的在线辨识基础上。对于绝大多数入门项目、常规工业回路,固定参数PID在做好抗饱和、滤波、采样时序之后已经足够稳。
6. 从PID基础到实际落地之间的最后一公里
6.1 别忽略执行机构和传感器的现实约束
PID算法只是一段代码,真正决定控制质量上限的往往是执行机构和传感器的性能。电机驱动模块的供电电压波动,会让同样的PWM占空比对应不同的输出力矩;热电偶测温的滞后,会让控制器以为温度还很低而继续加热,结果过冲;编码器安装在电机轴和非负载轴上的差异,会导致测得的转速跟真实负载转速不一致。
我在这方面吃过亏:某次恒温控制项目里,温度传感器离加热片太近,PID显示温度已经到达目标并回调了,可水箱中心温度其实还差很远。后来把传感器位置改到靠近出口的位置,同时把系统的纯迟延时间算清楚再重新整定参数,问题才解决。做PID项目,一定要先搞清楚“测到的量”和“想控制的量”之间的对应关系。
6.2 离散化采样的一些隐藏坑
PID在单片机里是离散运行的,这就带来一些连续PID没有的麻烦。比如微分项的数值微分在采样周期不稳定的情况下会产生很大的误差,所以工程上很少直接用差值做微分,而是一阶滤波后再微分,或者直接就不用D。又比如积分项的累加在长时间开启时会出现数值漂移,如果PID代码里的变量是float,运行几天后可能误差越来越大,需要定期对积分项做重置或小幅度衰减。
另外就是控制器频率和控制量更新频率必须匹配。如果你在定时器里以2毫秒周期计算PID,但PWM模块的寄存器要10毫秒才更新一次,那计算再快也没用,输出还是按10毫秒的节奏变。这个细节在调试时最容易忽视,问题表现又是那种“参数怎么调都不对”的怪症状。
6.3 我的个人体会:先把调试环境搭好,再去碰参数
这几年调PID,我最深的体会是:参数本身不难,难的是搭出一个能观察系统真实行为的调试环境。在PID项目里,如果只能通过肉眼看看转速表指针来分辨好坏,那调参效率会非常低。我建议在系统里留一个串口调试通道,把目标值、实际值、PID输出、积分值、误差实时打印出来,再用上位机软件画成曲线。有了曲线,调参就像换了双眼睛:超调多少、收敛快慢、稳态误差多大,一眼就能看清楚,不用靠猜。
还有个小技巧:把每次调参后的曲线截图存档,标注当时的参数组合。时间久了你会发现自己已经积累出一套“参数和曲线对应关系”的经验库,下次接手新系统时,光靠看曲线特征就能猜出参数到底是哪里不对,直接省掉一半的试错时间。
6.4 PID以外的东西:现在也需要了解
PID基础可以解决大多数常规控制问题,但有些场景它确实不够用。比如控制对象有很强的非线性,或者系统状态会快速切换,或者要求极高的动态响应,这时候可能需要用串级PID、前馈PID、模糊PID甚至更现代的控制方法。串级PID我在温控项目中用过,外环控制温度、内环控制加热功率,响应比单级PID快很多,抗扰动能力也更强。
但不管是哪种高级方案,底层的反馈思想、稳定性概念、参数整定直觉,都是从PID这里打下的。把PID基础搞扎实了,后面学什么控制方法都会顺很多。我建议各位无论是做毕设还是做工程项目,都亲手从一个最朴素的PID闭环开始搭一遍,别直接用现成库或者模块了事,那点调试过程的积累,是任何现成算法都给不了的。