ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

模拟PID控制器实战:从运放电路到参数整定

模拟PID控制器实战:从运放电路到参数整定 1. 为什么模拟PID到现在还有市场一个真实项目带来的启发前年帮实验室搭一台小型温度箱我本来笃定要上STM32做数字PID。采样周期从2ms一路调上去积分限幅、微分滤波、前馈补偿全试了一遍还是被那个两分钟的滞后环节折磨得够呛。后来一位前辈看不过眼从抽屉里翻出几颗NE5532和一堆电阻电容一个下午焊了一块模拟PID板子接上铂电阻桥和功率管反而干净利落地把温度稳在了正负0.1度以内。从那以后我对“运放搭PID控制器”这件事彻底改观了。这篇文章不是考古是实打实的手把手教程。我从最基础的反相比例放大电路、同相比例放大电路讲起一点点引出积分支路和微分支路最后拼成完整的模拟PID控制器。全程会讲清楚运放虚短虚断的用法、GBW和压摆率这些选型指标如何影响电路也会附上电容电阻取值的计算过程以及我在CircuitJS仿真和实物调试里踩过的坑。这套知识适合谁正在做电子竞赛、自动化仪表、电机伺服或电源闭环的人都值得看一眼。你可能最后还是会用单片机但模拟PID能让你对比例、积分、微分的物理含义有非常直观的感觉——那种“眼见为实”的理解是调参界面给不了的。2. 一切的基础运放的虚短、虚断和真实运放给理论挖的坑2.1 两个“虚”抓住之后所有放大电路都能画成简单数学式子想搭运放PID先过虚短虚断这一关。虚短是运放工作在深度负反馈时两个输入端的电压几乎相等V约等于V-。理论计算里我会直接当它相等。虚断则是运放输入端几乎不取电流输入阻抗极高计算时当作开路。这两个“虚”有多好用拿反相比例放大器举例反相输入端因为虚短被“钉”在地电位附近这叫虚地。输入电流就是Vin/R1又因为虚断这个电流不能进运放内部只能流过反馈电阻Rf于是Vout直接就等于负的Vin乘以Rf/R1。一个签名就完成了放大倍数的推导。整个过程不需要背任何复杂公式只要抓住“电流从电阻网络里走不往运放里漏”这一条逻辑。PID控制器到了后面会更复杂误差放大器、积分电容、微分电容混在一起但只要每个运放节点能套用虚短虚断整个电路就能拆成若干条简单的一次方程联立。我在文章后面推导积分器和微分器时还会反复用到这套规则现在务必把这两个概念焊进脑子里。2.2 GBW、压摆率和失调电压理论之外的三个刺客如果只看虚短虚断你会以为运放只要一接反馈就永远正确。实际项目里三件事会跳出来打脸GBW不足导致高频增益坍塌压摆率不够导致输出波形变梯形失调电压导致积分器本身偷偷漂移。GBW是增益带宽积单位是Hz。它意味着运放开环增益和可用带宽的乘积是个定值。比如一颗GBW为10MHz的运放闭环放大10倍时理论带宽就降到了1MHz左右。在PID控制器里比例级和微分级往往需要中高增益如果被控对象的误差信号还叠着几kHz的噪声分量普通运放可能在到达有用频率前就先掉了增益控制器实际表现就会大打折扣。失调电压Vos的影响更隐蔽。它相当于在运放输入端串联了一个微小电池。做比例放大时输出端也会多出一点偏置电压你加大反馈电阻后甚至能把几十毫伏的误差放大成明显的直流偏移。在积分器里它更致命因为积分器是对时间累积的哪怕只有1mV失调积分电容也会被这1mV持续充电导致输出不断往电源轨上漂。所以这部分我会在后面各节反复强调同一件事理论推导用理想运放选型号、定电阻时必须给GBW、SR和失调电压留出余量。这不是洁癖是实物能不能用的分界线。3. 先从“比例”下手反相与同相比例放大电路从推导到元件值3.1 反相比例电路推导与阻抗问题先搭P这一路。反相比例放大电路是最常见的一种比例电路结构很简单输入信号经R1接到反相输入端反馈电阻Rf从输出接回反相输入端同相输入端接地或者接参考电位。利用虚短反相输入端的电位就是0V这地方叫虚地。利用虚断R1电流就等于Rf电流。电流方程是Vin除以R1等于负的Vout除以Rf整理得到Vout等于负的Rf除以R1再乘Vin。这里的负号表示反相输入为正时输出为负。放大倍数只用电阻比决定跟运放本身的开环参数无关这是深度负反馈的威力。但反相电路有个实际缺点输入阻抗约等于R1。如果你前级是一个高阻抗的传感器或者上一个运放的输出问题不大。可如果Vin直接来自一个内阻很大的铂电阻桥等于你的R1串上了一个不确定的源内阻增益就会出现偏差。这种情况下我会优先考虑同相结构或者先在前面加一个缓冲器。3.2 同相比例放大电路和控制器配合的“主选身份”同相比例放大电路在PID里我更常用。它的输入接到运放同相端反馈电阻Rf从输出接回反相端反相端再经过电阻R1接地。因为虚短反相端电位等于输入信号Vin。又因为Rf和R1串联分压反相端电压等于Vout乘以R1除以R1加Rf于是Vout等于Vin乘以1加Rf除以R1。关键好处是输入阻抗极高对前级基本不会造成负载影响。在PID系统中我通常先用差分放大电路把设定值和反馈值做差得到误差信号Verr然后这个误差信号直接送给同相比例放大电路作为P支路。同相电路不会把信号翻转误差极性和控制量极性容易保持直观这在调试阶段能省下很多判断符号的时间。同相放大倍数永远是大于1的。如果你需要小于1的P增益就在输入前加一个可调电阻的分压网络或者改用反相结构。我习惯在同相输入端前面接一个10k电位器加20k电阻的分压结构这样Kp可以从零点几连续调到几十倍非常方便现场调试。3.3 比例级实操参数怎么定比例级的电阻取值我一般让输入电阻选在10k到100k之间。太小了前级驱动电流会比较大太大了运放偏置电流在电阻上产生的压降会被放大造成额外漂移。比如我要一个同相比例放大电路目标增益Kp等于5可以直接取R1等于10kRf等于40k。验算一下1加40k除以10k等于5。如果目标是Kp等于3.5就取R1等于10kRf等于25k再用电位器微调。输出接近满幅时还要核对一下增益带宽积GBW。假设系统误差信号里需要处理到10kHz的分量Kp为10那么这颗运放的GBW最好不低于1MHz留下10倍余量就是10MHz。NE5532在这里就很合适。还要提醒一句同相和反相电路的放大倍数推导过程虽然简单但很多人实际焊板时容易把反馈电阻和接地电阻的位置搞反接完发现增益不对。用万用表顺着反馈环路走一遍确认是从输出端到反相输入端的那个电阻就不会错。4. 积分这一路积分器、积分漂移和泄放电阻的取舍4.1 从反相放大器变成积分器只要一个电容积分项的作用是消除静差。单靠比例放大系统总会有稳态误差因为必须误差存在才能维持输出。积分器则把误差随时间累积起来只要误差不消失积分输出就一直变化最终把误差压到零。积分电路本质上就是从反相放大器演化来的把反馈电阻Rf换成电容C。仍然是虚短虚断反相输入端虚地输入电流为Vin除以R这个电流流向反馈电容给电容充电。电容上电压变化率等于电流除以电容于是Vout对时间的导数等于负的Vin除以R再除以C。两边积分后得到Vout等于负的1除以R乘C再对Vin做定积分。这里的R乘C就是积分时间常数单位是秒。数值越大积分越慢输出变化越温和。数值越小积分作用越强系统越容易超调甚至震荡。比如R等于100kC等于1微法时间常数就是0.1秒当输入误差为1V时积分输出斜率为每秒10V。这个换算关系在调参时非常有用。4.2 零漂问题跟失调电压的关系所有第一次实际搭建积分器的人都会被同一种现象惊吓输入接地输出却慢慢往正轨或负轨上爬。这不是幻觉是失调电压在给积分电容“偷偷充电”。根据公式漂移速率大约是失调电压除以输入电阻再除以电容。一颗失调电压为1mV的运放配合100k输入电阻和1微法电容漂移率算出来是0.01V每秒看起来不大但一分钟后就漂了0.6V足够让后级电路饱和了。解决办法有几个方向。第一是选择低失调运放比如OP07这类低失调型号在积分级使用就非常合适。第二是给反馈电容并联一个大阻值的泄放电阻比如10兆欧到几十兆欧。这个电阻把积分器从理想积分变成了低频惯性环节直流增益从无穷大降为有限的负的RF除以R但这个增益通常还有几千倍不会明显影响静差消除能力。第三是加入手动复位开关比如用模拟开关并联在积分电容两端上电初期或者系统启动时把积分器清零。务必注意泄放电阻不能取得太小否则积分器在低频段的相位特性会提前被扭弯。我给出的经验是泄放电阻至少要比输入电阻大100倍甚至更多。这样对正常工作频率的积分行为影响几乎可以忽略但又能把失调电压引起的漂移抑制在可接受范围。4.3 积分支路的实际布局搭建积分支路时我会在输入电阻前再加一个20k左右的平衡电阻到同相输入端。这个电阻的作用是补偿偏置电流的影响如果同相端直接接地偏置电流会单独从反相端流过输入电阻产生额外误差在同相端串一个等效电阻可以让两条输入臂对偏置电流的阻抗对称把偏置电流误差压下去。虽然低失调运放对偏置电流本身已经处理得不错这个习惯仍然值得保留。积分支路的电容也很讲究。普通电解电容漏电大而且误差大不适合当积分电容。我一般选CBB电容或者聚丙烯薄膜电容温漂小绝缘电阻高积分稳定性好得多。容值在微法级就足够满足大多数PID应用不必追求大容量。5. 微分这一路理想微分器的噪声、稳定性及限带处理5.1 理想微分器的增益曲线为什么不能直接用理想微分电路的公式很简单把比例电路中的输入电阻换成电容反馈电阻保留输出就等于负的Rf乘C再对输入电压求导。频域上看它的增益随频率线性上升每一倍频程增加6dB。这个特性听起来正好能预测变化趋势、提供阻尼但实际应用时往往是最让人头痛的一路。问题在于增益随频率无限上升意味着高频噪声被无限放大。测温热电偶、电位器电刷噪声、运放自身噪声这些高频分量在微分器输出端会盖过真正的误差变化信号。很多PID实物板子一接上微分支路就开始高频振荡、啸叫大概率就是这个原因。频率升高后微分器增益会越来越大同时运放的GBW又限制不了这个开环通道最后可能会让运放在比较高的频率上发生不稳定。所以理想微分器基本只能存在于教科书里实物电路必须给它加限带。5.2 串联电阻改变的一切最常见的限带办法是在输入电容前面串联一个电阻R1。这样输入通道不再是纯电容而是电阻和电容串联。低频时电容阻抗远大于R1微分作用基本保留高频时R1成为主导通道增益被限制在负的RF除以R1这个有限值不再无限上升。这个串联电阻同时引入了零点等于给微分支路加了一个低通上限。上限频率大约是1除以2π乘R1乘C。当实际信号频率低于这个上限时电路表现接近理想微分器高于这个上限后电路退化为一个固定增益放大级。噪声经固定增益放大不再是无限放大振荡问题基本就解决了。如果还想进一步压制残余噪声可以在反馈电阻Rf上并联一个小电容Cf构成一个再高一些的低通极点。但这个电容要选得很小否则它会把微分作用本身也滤掉。我一般先不加Cf若输出还有轻微高频毛刺再从几皮法到几十皮法慢慢试。5.3 微分支路参数选择公式微分时间常数由Rf乘C决定。假设我们需要Kd等于0.05秒取Rf等于100k那么C应为0.5微法。限带频率由R1乘C决定。若希望微分作用可靠覆盖到1kHz的信号那就让R1乘C远小于1除以2π乘1000取R1等于1kC等于0.5微法时R1乘C等于0.5毫秒对应限带频率约为318Hz这个值略低可以再调小R1到510欧。一个更顺手的经验是先定微分时间常数再定R1。R1取Rf的百分之一到十分之一之间就能保证噪声增益不超过几十倍到几百倍。以Rf等于100k为例R1取1k到10k记下这个范围后面的调试表里还会用到。还有一个容易被忽略的常识微分器对开关电源的纹波和地弹噪声相当敏感。给微分运放电源脚加上100nF和10微法两级去耦电容并把电阻电容引脚尽量缩短比任何额外滤波都有效。按照拓朴来看D支路永远是第一个被噪声打穿的通道。6. 把P、I、D三兄弟焊到一张板上完整拓扑与参数映射6.1 误差检测、三路并行与求和级完整模拟PID需要先有一级误差检测。最简单做法是直接用差分放大电路把设定值Vset接到同相输入把反馈量Vfb接到反相输入四个电阻都取相同值比如10k输出就是Vset减去Vfb。注意这种经典差分电路的输入阻抗不算太高如果前级信号源较弱先加电压跟随器缓冲一下。差分放大电路输出Verr后分成三路并行。P路用同相比例放大电路得到Vp等于Kp乘Vin。I路用反相积分器得到Vi等于负的Ki对Vin积分。D路用限带微分器得到Vd等于负的Kd乘Vin的导数。这三路信号需要合成一路控制量这就轮到运放加法器出场了。运放加法器本质上是一只反相放大器有多个输入电阻并联在反相端。第一路输入经过Ra第二路经过Rb第三路经过Rc反馈电阻为RF输出就等于负的RF除以Ra乘Va负的RF除以Rb乘Vb负的RF除以Rc乘Vc加和。如果让Ra、Rb、Rc都取相同值那么加法器就是对三路信号做等权相加并反相。由于P路是同相输出I路和D路是反相输出加法器合成后再加一个反相缓冲器就把整体极性整理成正向控制。整个链条是误差信号经差分级生成P路不加符号翻转I、D路先翻转最后加法器与输出缓冲两次翻转最终控制量和误差方向一致。若你的执行器需要反向极性直接把末尾缓冲器去掉或把差分级的两个输入交换即可。6.2 电路元件值到PID参数的换算建议先把每一路的独立参数定清楚再考虑求和级的公共缩放。P路的Kp由同相放大电路决定I路的Ki等于1除以输入电阻再乘积分电容D路的Kd等于反馈电阻乘输入电容。求和级的公共电阻比例会对三路信号同时缩放相当于整体控制器增益一般我放在最后调整。举一个具体的电机转速控制例子。设定转速对应的电压和测速反馈电压范围都是0到5V先期望Kp约3.5。P路取R1等于10kRf等于25k在同相输入端前加一个分压电位器备用Kp约为3.5。期望Ki约到1.2每秒取积分电容为10微法那么输入电阻R应该等于1除以1.2乘10e-6约83k取标称82k后Ki约1.22每秒。期望Kd约0.04秒取反馈电阻Rf等于100k输入电容C为0.4微法可用标称0.39微法。限带电阻R1取1k限带频率约408Hz够了。最后把Vp、Vi、Vd接到加法器三路输入电阻都取10k反馈电阻也取10k再进行一次输出反相。这样接线时每路增益都没被额外改变参数换算完全清晰。以后想微调整机增益单独调整加法器反馈电阻即可。7. 上电之前先仿真CircuitJS摸拟过程与增益设置7.1 CircuitJS中把运放增益“拉成无穷大”建议任何人在焊板前先在电路仿真软件里把整个PID链路跑通我用得最多的是网页版CircuitJS。它加载快拖拽方便非常适合验证拓扑和粗调参数。很多人第一次在CircuitJS里放运放时会发现仿真结果和课本上的理想运放差距不小原因是这个软件里的运放默认增益不是无穷大而是一个有限数值通常在100000左右。虽然是很大但对某些闭环增益极高、环路敏感的场景依然会产生可见误差尤其积分器长时间仿真时。想要更接近理想运放双击运放元件本体把增益设置里的值改成1e9之类的极大数就行。它不会真的“无穷大”但效果上已经完全可以视作理想运放。同时留意运放的输出范围和电源电压。双电源仿真就设正负15V单电源仿真就设正5V或12V输出范围会自然限制在电源轨之间。积分器输出撞轨这种经典问题在仿真里反而能提前暴露比实物烧完再查要省心太多。7.2 用临界比例法标定PID参数仿真搭好后只靠拍脑袋调参效率极低。我习惯用经典的临界比例法。先把积分支路断开、微分支路短路掉只保留P路。然后从很小的Kp开始增大增益观察输出波形直到系统出现等幅振荡。这时的增益叫临界增益Ku振荡周期记为Tu。根据齐格勒-尼克尔斯经验表P控制器取Kp等于0.5KuPI控制器取Kp等于0.45Ku积分时间Ti等于Tu除以1.2PID控制器取Kp等于0.6KuTi等于Tu除以2微分时间Td等于Tu除以8。注意Ti和Td还需要再换算成电路参数Ki等于Kp除以TiKd等于Kp乘以Td。再结合第6节的公式反推电阻电容值就能得到一组有依据的初始参数。这个表给出的参数偏激进实际系统如果执行器饱和或者存在较大死区还需要手动把积分系数略微调低。但作为起点它确实比我以前从头盲调到半夜高效得多。7.3 调参时看哪些波形在CircuitJS里调试时我习惯同时挂几个虚拟示波器一个是系统输出一个是误差信号一个是三个支路的独立输出。这样能很直观地看出系统处于欠阻尼还是过阻尼也能分辨当前的振荡到底来自D支路的噪声放大还是真实环路的临界振荡。如果系统响应慢吞吞、稳态误差迟迟不消除基本是比例增益太低或者积分太弱对应波形是误差曲线拖着长尾巴。如果超调大、来回摆动则要把比例增益降下来或者增大积分时间常数。如果输出出现密密麻麻的高频毛刺多半是微分支路在处理噪声先把R1调大或者减小Rf乘C这个微分时间常数。别迷信数据先看波形再动手改元件这样才谈得上手把手。8. 上真实硬件前必须检查的细节GBW、压摆率、布线与寄生8.1 GBW与SR的提前预留光在仿真里跑通还不够实物选型必须验证两颗硬指标的余量。第一颗是GBW闭环增益越大可用带宽越小要求GBW至少等于最高信号频率乘以闭环增益再留5到10倍余量。拿前面的P路为例Kp为10信号里有10kHz的分量那么GBW至少要有10乘10k乘5约500kHzNE5532这种10MHz级别绰绰有余LM358这种1.1MHz也够用但如果换成把Kp做到100倍LM358就明显偏紧了。第二颗是压摆率SR。输出信号斜率不能超过运放SR否则输出会变成梯形波控住了幅值却控不住相位。估算公式为SR约等于2π乘以最高频率再乘以输出峰值。若最高频率为10kHz输出峰值为5V算出来约0.31V每微秒看起来很低但若把频率提高到100kHz就变成3.14V每微秒再留3倍余量要求约9.4V每微秒这时NE5532的9V每微秒就很紧张TL072的13V每微秒反而更稳。选型前花两分钟算这笔账能避免板子焊完发现输出波形发圆。我习惯把积分级用低失调精密运放比如OP07。比例级和微分级追求带宽和SR选NE5532或TL072。为什么微分级特别挑SR因为微分器输出本身就含着输入信号的斜率斜率越大输出摆幅越大SR不够时先饱和的原件一定是它。8.2 失调电压计算与偏置电阻补偿做实物前务必估算整条链路的失调电压。反相放大器的输出失调大约是1加Rf除R1再乘Vos再加上偏置电流在电阻上造成的误差。假如放大倍数为51倍运放Vos为2mV仅失调电压就会在输出带来约102mV的直流偏移。PID环如果对静态精度要求高这个偏移会被积分器当成真实误差继续累积结果是控制量和设定点之间始终隐藏着一个直流偏差。补偿手段有两个。一个是在同相输入端串入阻值等于R1和Rf并联值的电阻让两个输入端的偏置电流压降对称抵消。另一个是在积分器输入级前加入调零电位器但温漂还是存在所以核心还是选低失调运放。失调电压计算公式并不复杂却是我见过最多人跳过的一步结果就是“模拟PID上电后输出飘得离谱”最后只能靠积分器硬抗。8.3 双电源单电源的处理与布线心得运放PID控制器里积分器必须处理正负两个方向的误差所以最好用双电源供电正负12V或正负15V都很合理。单电源下想实现真正的双向积分必须把参考点抬到电源电压一半比如做成单电源5V时把“地”变成2.5V虚地然后所有输入输出都相对这个虚地工作。这个做法可行但很麻烦给整套电路加一个2.5V虚地发生器后还要重新整理所有参考电平不如直接上一组双电源稳压来得干净。布线方面运放电路最怕电源内阻和长引线引入的高频寄生。每颗运放电源脚旁都要就近放100nF陶瓷电容再在电路板电源入口放一个10到100微法的电解电容做低频退耦。积分电容和微分电容远离发热元件因为电容温漂也会直接影响时间常数。电位器最好用多圈型的PID调试时单圈电位器旋转一点就让增益翻倍很容易跳过临界点。我在实际调试中最常重蹈的覆辙是微分支路一接上就振荡最后发现不是参数问题而是示波器探头地线夹得过长等效于给微分器额外注入了一个大噪声源。把探头改成弹簧接地针后波形立刻干净。做模拟PID就是不断跟这些藏在电路细节里的“实际”打交道多绕几次你自然就会在画板之初给运放留出该有的退耦和屏蔽位。
返回列表