PID控制器

PID控制器（比例-积分-微分控制器），由比例单元（Proportional）、积分单元（Integral）和微分单元（Derivative）组成。可以透过调整这三个单元的增益$K_p$，$K_i$和$K_d$来调定其特性。PID控制器主要适用于基本上线性，且动态特性不随时间变化的系统。

<image>

PID控制器是一个在工业控制应用中常见的回授回路部件。这个控制器把收集到的数据和一个参考值进行比较，然后把这个差别用于计算新的输入值，这个新的输入值的目的是可以让系统的数据达到或者保持在参考值。PID控制器可以根据历史数据和差别的出现率来调整输入值，使系统更加准确而稳定。

PID控制器的比例单元（P）、积分单元（I）和微分单元（D）分别对应目前误差、过去累计误差及未来误差。若是不知道受控系统的特性，一般认为PID控制器是最适用的控制器。借由调整PID控制器的三个参数，可以调整控制系统，设法满足设计需求。控制器的响应可以用控制器对误差的反应快慢、控制器过冲的程度及系统震荡的程度来表示。不过使用PID控制器不一定保证可达到系统的最佳控制，也不保证系统稳定性。

有些应用只需要PID控制器的部分单元，可以将不需要单元的参数设为零即可。因此PID控制器可以变成PI控制器、PD控制器、P控制器或I控制器。其中又以PI控制器比较常用，因为D控制器对回授噪声十分敏感，而若没有I控制器的话，系统不会回到参考值，会存在一个误差量。

## 反馈回路基础

PID回路是要自动实现一个操作人员用量具和控制旋钮进行的工作，这个操作人员会用量具测系统输出的结果，然后用控制旋钮来调整这个系统的输入，直到系统的输出在量具上显示稳定的需求的结果，在旧的控制文档里，这个过程叫做“复位”行为，量具被称为“测量”，需要的结果被称为“设定值”而设定值和测量之间的差别被称为“误差”。

一个控制回路包括三个部分：

- 系统的传感器得到的测量结果
- 控制器作出决定
- 通过一个输出设备来作出反应

控制器从传感器得到测量结果，然后用需求结果减去测量结果来得到误差。然后用误差来计算出一个对系统的纠正值来作为输入结果，这样系统就可以从它的输出结果中消除误差。

在一个PID回路中，这个纠正值有三种算法，消除目前的误差，平均过去的误差，和透过误差的改变来预测将来的误差。

比如说，假如利用水箱在为植物提供水，水箱的水需要保持在一定的高度。可以用传感器来检查水箱里水的高度，这样就得到了测量结果。控制器会有一个固定的用户输入值来表示水箱需要的水面高度，假设这个值是保持65％的水量。控制器的输出设备会连在由马达控制的水阀门上。打开阀门就会给水箱注水，关上阀门就会让水箱里的水量下降。这个阀门的控制信号就是控制变量。

PID控制器可以用来控制任何可被测量及可被控制变量。比如，它可以用来控制温度、压强、流量、化学成分、速度等等。汽车上的巡航定速功能就是一个例子。

一些控制系统把数个PID控制器串联起来，或是连成网络。这样的话，一个主控制器可能会为其他控制输出结果。一个常见的例子是马达的控制。控制系统会需要马达有一个受控的速度，最后停在一个确定的位置。可由一个子控制器用来管理速度，但是这个子控制器的速度是由控制马达位置的主控制器来管理的。

连合和串联控制在化学过程控制系统中相当常见。

## 历史及应用

<image>

PID控制器可以追溯到1890年代的调速器设计。PID控制器是在船舶自动操作系统中渐渐发展。1911年Elmer Sperry开发的控制器是最早期PID型控制器的其中之一，而第一个发表PID控制器理论分析论文的是俄裔美国工程师尼古拉斯·米诺尔斯基Minorsky。米诺尔斯基当时在设计美国海军的自动操作系统，他的设计是基于对舵手的观察，控制船舶不只是依目前的误差，也考虑过去的误差以及误差的变化趋势，后来米诺尔斯基也用数学的方式加以推导。他的目的是在于稳定性，而不是泛用的控制，因此大幅的简化了问题。比例控制可以在小的扰动下有稳定性，但无法消除稳态误差，因此加入了积分项，后来也加入了微分项。

当时在新墨西哥号战舰上进行测试，利用控制器控制舵的角速度，利用PI控制器可以角度误差维持在±2°以内，若加上D控制，角度误差维持在±1/6°，比最好的舵手还要好。

不过因为海军人员的抗拒，海军那时候未使用这套系统，在1930年代也有其他人作出类似的研究。

在自动控制发展的早期，用机械设备来实现PID控制，是由杠杆、弹簧、阻尼及质量组成，多半会用压缩气体驱动。气动控制器还一度是工业上的标准。

电子的类比控制器可以用晶体管、真空管、电容器及电阻器组成。许多复杂的电子系统中常会包括PID控制，例如磁盘的读写头定位、电源供应器的电源条件、甚至是现代地震仪的运动侦测线路。现代电子控制器已大幅的被这些利用单芯片或FPGA来实现的数位控制器所取代。

现代工业使用的PID控制器多半会用PLC或有安装面板的数位控制器来实现。软件实现的好处是相对低廉，配合PID实现方式调整的灵敏度很大。在工业锅炉、塑胶射出机械、烫金机及包装行业中都会用到PID控制。

变化的电压输出可以用PWM来实现，也就是固定周期，依要输出的量去调整周期中输出高电位的时间。对于数位系统，其时间比例有可能是离散的，例如周期是二秒，高电位时间设定单位为0.1秒，表示可以分为20格，精度5%，因此存在一量化误差，但只要时间分辨率够高，就会有不错的效果。

## 理论

PID是以它的三种纠正算法而命名。受控变数是三种算法（比例、积分、微分）相加后的结果，即为其输出，其输入为误差值（设定值减去测量值后的结果）或是由误差值衍生的信号。若定义$u(t)$为控制输出，PID算法可以用下式表示：

$$\mathrm{u}(t)=\mathrm{MV}(t)=K_p{e(t)} + K_{i}\int_{0}^{t}{e(\tau)}\,{d\tau} + K_{d}\frac{d}{dt}e(t)$$

其中

- 调适参数
- $K_p$：比例增益
- $K_i$：积分增益
- $K_d$：微分增益

$e$：误差=设定值（SP）- 回授值（PV）

$t$：目前时间

$\tau$：积分变数，数值从0到目前时间$t$

用更专业的话来讲，PID控制器可以视为是频域系统的滤波器。在计算控制器最终是否会达到稳定结果时，此性质很有用。如果数值挑选不当，控制系统的输入值会反复振荡，这导致系统可能永远无法达到预设值。

PID控制器的一般转移函数是：

$H(s)=\frac{K_d s^2+K_p s+K_i}{s+C}$,

其中C是一个取决于系统带宽的常数。

### 比例控件

<image>

比例控制考虑当前误差，误差值和一个正值的常数Kp（表示比例）相乘。Kp只是在控制器的输出和系统的误差成比例的时候成立。比如说，一个电热器控制器是在目标温度和实际温度差10°C时有100%的输出，而其目标值是25°C。那么它在15°C的时候会输出100%，在20°C的时候会输出50%，在24°C的时候输出10％，注意在误差是0的时候，控制器的输出也是0。

比例控制的输出如下：

$$P_{\mathrm{out}}=K_p\,{e(t)}$$

若比例增益大，在相同误差量下，会有较大的输出，但若比例增益太大，会使系统不稳定。相反的，若比例增益小，若在相同误差量下，其输出较小，因此控制器会较不敏感的。若比例增益太小，当有干扰出现时，其控制信号可能不够大，无法修正干扰的影响。

#### 稳态误差

比例控制在误差为0时，其输出也会为0。若要让受控输出为非零的数值，就需要产生一个稳态误差或偏移量。

### 积分控件

<image>

积分控制考虑过去误差，将误差值过去一段时间和（误差和）乘以一个正值的常数Ki。Ki从过去的平均误差值来找到系统的输出结果和预定值的平均误差。一个简单的比例系统会震荡，会在预定值的附近来回变化，因为系统无法消除多余的纠正。通过加上负的平均误差值，平均系统误差值就会渐渐减少。所以，最终这个PID回路系统会在设定值稳定下来。

积分控制的输出如下：

$$I_{\mathrm{out}}=K_{i}\int_{0}^{t}{e(\tau)}\,{d\tau}$$

积分控制会加速系统趋近设定值的过程，并且消除纯比例控制器会出现的稳态误差。积分增益越大，趋近设定值的速度越快，不过因为积分控制会累计过去所有的误差，可能会使回授值出现过冲的情形。

### 微分控件

<image>

微分控制考虑将来误差，计算误差的一阶导，并和一个正值的常数Kd相乘。这个导数的控制会对系统的改变作出反应。导数的结果越大，那么控制系统就对输出结果作出更快速的反应。这个Kd参数也是PID被称为可预测的控制器的原因。Kd参数对减少控制器短期的改变很有帮助。一些实际中的速度缓慢的系统可以不需要Kd参数。

微分控制的输出如下：

$$D_{\mathrm{out}}=K_d\frac{d}{dt}e(t)$$

微分控制可以提升整定时间及系统稳定性。不过因为纯微分器不是因果系统，因此在PID系统实现时，一般会为微分控制加上一个低通滤波器以限制高频增益及噪声。实际上较少用到微分控制，估计PID控制器中只有约20%有用到微分控制。

## 参数调试

PID的参数调试是指透过调整控制参数（比例增益、积分增益/时间、微分增益/时间）让系统达到最佳的控制效果。稳定性（不会有发散性的震荡）是首要条件，此外，不同系统有不同的行为，不同的应用其需求也不同，而且这些需求还可能会互相冲突。

PID只有三个参数，在原理上容易说明，但PID参数调试是一个困难的工作，因为要符合一些特别的准则，而且PID控制有其限制存在。历史上有许多不同的PID参数调试方式，包括齐格勒－尼科尔斯方法等，其中也有一些已申请专利。

PID控制器的设计及调试在概念上很直觉，但若有多个（且互相冲突）的目标（例如高稳定性及快速的暂态时间）都要达到的话，在实际上很难完成。PID控制器的参数若仔细的调试，会有很好的效果，相反的，若调适不当，效果会很差。一般初始设计常需要不断的电脑模拟，并且修改参数，一直达到理想的性能或是可接受的妥协为止。

有些系统有非线性的特性，若在无载下调试的参数可能无法在满载下动作，可以利用增益规划的方式进行修正（在不同的条件下选用不同的数值）。

### 稳定性

若PID控制器的参数未挑选妥当，其控制器输出可能是不稳定的，也就是其输出发散，过程中可能有震荡，也可能没有震荡，且其输出只受饱和或是机械损坏等原因所限制。不稳定一般是因为过大增益造成，特别是针对延迟时间很长的系统。

一般而言，PID控制器会要求响应的稳定，不论程序条件及设定值如何组合，都不能出现大幅振荡的情形，不过有时可以接受临界稳定的情形。

### 最佳性能

PID控制器的最佳性能可能和针对过程变化或是设定值变化有关，也会随应用而不同。

两个基本的需求是调整能力（regulation，干扰拒绝，使系统维持在设定值）及命令追随 （设定值变化下，控制器输出追随设定值的反应速度）。有关命令追随的一些准则包括有上升时间及整定时间。有些应用可能因为安全考量，不允许输出超过设定值，也有些应用要求在到达设定值过程中的能量可以最小化。

### 各方法的简介

有许多种调试PID控制器参数的方法，最有效的方式多半是建立某种程序，再依不同参数下的动态特性来调试参数。相对而言人工调试其效率较差，若是系统的响应时间到数分钟以上，更可以看出人工调试效率的不佳。

调试方法的选择和是否可以暂时将控制回路“离线”有关，也和系统的响应时间有关。离线是指一个和实际使用有些不同的条件（例如不加负载），而且控制器的输出只需考虑理论情况，不需考虑实际应用。在线调试是在实际应用的条件，控制器的输出需考虑实际的系统。若控制回路可以离线，最好的调试方法是对系统给一个步阶输入，量测其输出对时间的关系，再用其响应来决定参数。

方法｜优点｜缺点

人工调试｜不需要数学，可以在线调试｜需要有经验的工程师

齐格勒－尼科尔斯方法｜被证实有效的方法，可以在线调试｜会影响制程，需要试误，得到的参数可能使响应太快

软件工具｜调适的一致性，可以在线调试或离线调试，可以配合计算机自动设计，包括阀及感测器的分析，可以在下载前进行模拟，可以支援非稳态（NSS）的调试｜需要成本或是训练

Cohen–Coon｜好的程序模型｜需要一些数学，需离线调试，只对一阶系统有良好效果

### 人工调整

若需在系统仍有负载的情形进行调试（线上调试），有一种作法是先将$K_i$及$K_d$设为零，增加$K_p$一直到回路输出震荡为止，之后再将$K_p$设定为“1/4振幅衰减”（使系统第二次过冲量是第一次的1/4）增益的一半，然后增加$K_i$直到一定时间后的稳态误差可被修正为止。不过若$K_i$可能会造成不稳定，最后若有需要，可以增加$K_d$，并确认在负载变动后回路可以够快的回到其设定值，不过若$K_d$太大会造成响应太快及过冲。一般而言快速反应的PID应该会有轻微的过冲，只是有些系统不允许过冲。因此需要将回授系统调整为过阻尼系统，而$K_p$比造成震荡$K_p$的一半还要小很多。

<image>

调整PID参数对系统的影响如下

调整方式｜(on) 上升时间｜超调量｜安定时间｜稳态误差｜稳定性

↑ Kp｜减少 ↓｜增加 ↑｜小幅增加 ↗｜减少 ↓｜变差 ↓

↑ Ki｜小幅减少 ↘｜增加↑｜增加 ↑｜大幅减少↓↓｜变差↓

↑ Kd｜小幅减少 ↘｜减少↓｜减少↓｜变动不大→｜变好 ↑

### 齐格勒－尼科尔斯方法

齐格勒－尼科尔斯方法是另一种启发式的调试方式，由John G. Ziegler和Nathaniel B. Nichols在1940年代导入，一开始也是将$K_i$及$K_d$设定为零，增加比例增益直到系统开始等振幅振荡为止，当时的增益称为$K_u$，而振荡周期为$P_u$，即可用以下的方式计算增益：

控制器种类｜$K_p$｜$K_i$｜$K_d$

P｜$0.50{K_u}$

PI｜$0.45{K_u}$｜$1.2{K_p}/P_u$

PID｜$0.60{K_u}$｜$2{K_p}/P_u$｜${K_p}{P_u}/8$

### PID调试软件

大部分现代的工业设备不再用上述人工计算的方式调试，而是用PID调试及最佳化软件来达到一致的效果。软件会收集资料，建立模型，并提供最佳的调试结果，有些软件甚至可以用参考命令的变化来进行调试。

数学的PID调试会将脉冲加入系统，再用受控系统的频率响应来设计PID的参数。若是响应时间要数分钟的系统，建议用数学PID调试，因为用试误法可能要花上几天才能找到可让系统稳定的参数。最佳解不太容易找到，有些数位的回路控制器有自我调试的程序，利用微小的参考命令来计算最佳的调试值。

也有其他调试的公式，是依不同的性能准则所产生。许多有专利的公式已嵌入在PID调试软件及硬件模组中。

一些先进的PID调试软件也可以在动态的情况下用算法调整PID回路，这类软件会先将程序建模，给微扰量，再根据响应计算参数。

## PID控制的限制

PID控制可以应用在许多控制问题，多半在大略调整参数后就有不错的效果，不过有些应用下可能反而会有差的效果，而且一般无法提供最佳控制。PID控制的主要问题是在于其为回授控制，系数为定值，不知道受控系统的资讯，因此其整体性能常常是妥协下的结果。在没有受控系统模型的条件下，PID控制最佳的控制器，但若配合系统模型，可以有进一步的提升。

当PID控制器单独使用时，若因应用需求，需调整PID回路增益使控制系统不会过冲，其效果有可能很差。PID控制器的缺点还包括无法处理受控系统的非线性、需在反应时间及调整率之间妥协、无法针对参数的变动而反应（例如系统在暖机后特性会改变）、以及大扰动下的波形落后。

PID控制器最显著的提升是配合前馈控制，加入有关系统的资讯，只用PID控制器来控制误差。另外，PID控制器也有一些小幅的改善方式，例如调整参数（增益规划或是依性能进行适应性的调整）、提升性能（提高取样率、精度及准度，若有需要加入低波滤波器），或是用多个串接的PID控制器。

### 线性

PID控制器常见的问题是在于其线性且对称的特性，若应用在一些非线性的系统，其效果可能会有变化。以暖通空调中常见的温度控制，可能是采用主动加热（用加热器加热），但冷却是使用被动冷却（不加热，自然冷却），其冷却速度比加热速度慢很多，输出若有过冲，下降速度很慢，因此PID控制需调整为不会过冲的过阻尼，以减少或避免过冲，但这也延长了整定时间，使性能变差。

### 噪声对微分器的影响

微分器的问题在于对量测或程序产生的高频噪声会有放大效果，因此会对输出造成大幅的变动。因此真实的控制器不会有理想的微分器，只有一个有限带宽的微分器或高通滤波器。一般为了移除高频的噪声，会在量测时加入低通滤波器，若低通滤波器和微分器对消，滤波效果也就受限了，因此低噪声的量测设备相当重要。实务上可以使用中值滤波器，调昇滤波效率及实际上的性能。有时可以将微分器关闭，对控制性能的影响不大，此时称为PI控制器。

## PID算法的修改

基本的PID算法在一些控制应用的条件下有些不足，需进行小幅的修改。

### 积分饱和

积分饱和是理想PID算法实现时常见的问题。若设定值有大的变动，其积分量会有大幅的变化，大到输出值被上下限限制而饱和，因此系统会有过冲，而且即使误差量符号改变，积分量变小，但输出值仍被上下限限制，维持在上限（或下限），因此输出看似没有变化，系统仍会持续的过冲，一直要到输出值落在上下限的范围内，系统的回授量才会开始下降。此问题可以用以下方式处理：

- 在程序变数离开可控制范围时，暂停积分。
- 让积分值限制在一个较小的上下范围内。
- 重新计算积分项，使控制器输出维持上下限之间的范围内。

### PI控制器

<image>

PI控制器（比例-积分控制器）是不用微分单元的PID控制器。

控制器的输出为

$$K_P \Delta + K_I \int \Delta\,dt$$

其中$\Delta$为设定值SP和量测值PV的误差：

$\Delta = SP - PV$.

PI控制器可以用Simulink或Xcos之类的软件进行建模，方式是使用“flow chart”图框，其中用以下的拉氏运算子：

$$C=\frac{G(1+\tau s)}{\tau s}$$

其中

$G = K_P$ = 比例增益

$G/\tau = K_I$ = 积分增益

$G$值的选择需在减少过冲以及增加安定时间之间取舍。

微分单元对输入中的高频信号格外敏感，PI控制器因为没有微分单元，在讯号噪声大时，在稳态时会更加稳定。但对状态快速变化的反应较慢，因此相较于调适到最佳值的PID控制器，PI控制器会较慢到达设定值，受干扰后也比较慢恢复到正常值。

PDF控制（pseudo-derivative feedback control）可以视为是PI控制器的变体，比例控制器的输入由误差值改为回授值。

### 不动作区

许多PID回路是控制机械元件（例如阀）。机械保养是一笔可观的费用，磨损会使得机械在有输入信号时出现静摩擦或是不动作区，都会导致控制性能的下降。机械损耗的速度主要和设备多常改变其状态有关。若磨损是主要考量的话，PID回路可以有输出的迟滞现象以减少输出状态的改变。若变化小，仍在不动作区内，让控制器的输出维持上一次的值。变化要大到超过不动作区，实际的状态才会随之变化。

### 设定值的步阶变化

若系统的设定值有步阶变化，比例单元和微分单元也会有对应的变化，特别是微分单元对于步阶变化的输出特别的大，因此有些PID算法会配合以下的修改来处理设定值的变化。

设定值斜坡变化：此修改方式下，设定值会用线性或是一阶滤波的方式，由原始值变到新的值，避免因为步阶变化产生的不连续。

只对程序变数（回授量）微分：此修改下，PID控制器只针对量测的程序变数（PV）微分，不对误差微分。程序变数是实际的物理量，较不易有瞬间的变化，而误差可能因为设定值的步阶变化而有瞬间变化。这也是一种简单的设定值加权法。

设定值加权：设定值加权分别调整在比例单元及微分单元中的误差量，误差量的设定值乘以一个0到1之间的加权，积分单元的误差量需使用真实的设定值，以避免稳态误差。这两个参数不影响对负载变化及量测噪声的响应，可以提升对设定点变化的响应。

### 前馈控制

PID控制器若再配合前馈控制（开回路控制），可以再提升其控制性能。在前馈控制中考虑系统的已知资讯（例如理想加速度或是惯量），再将输出加到PID控制器的控制输出，以提升整体的系统性能。前馈量可能是控制输出主要的部分，而PID控制器只用来补偿目标值和开回路控制器输出之间的误差。因为前馈输出不会受到回授的影响，因此也不会造成系统的振荡，可以在不影响稳定性的条件下提升系统的响应。前馈可以依目标值及其他量测到的干扰量来产生，目标值加权是一种简单的前馈控制方式。

例如，在大部分的运动控制系统中，为了要使机械负载加速，致动器要产生更大的力。若用速度环的PID控制器来控制负载速度，比较理想的方式是先得到理想的瞬间加速度值，适量调整加权后再加到PID的输出中。因此控制器输出中有一部分是不随机械速度而改变的输出，再用PID根据实际输出和目标的差异去增加或是减少输出。这类有前馈控制的PID控制器可以加快控制系统的反应速度。

### 无冲击运转

有时PID控制器会规划为无冲击（bumpless）的特性，在参数变化时重新计算适当的积分累计值，使输出不会因参数变化有不连续的改变。

## 串级PID控制器

二个PID控制器可以组合在一起，得到较佳的效果，这称为串级PID控制。以两个PID控制器组成的串级PID控制为例，其中一个PID控制器在外回路，控制像液面高度或是速度等主要的物理量，另一个PID控制器是内回路，以外回路PID控制器的输出做为其目标值，一般是控制较快速变化的参数，例如流量或加速度等。若利用串级PID控制，可以增加控制器的工作频率，并降低其时间常数。

例如一个温控的循环水浴设备有二个串级的PID控制器，分别有各自的热电偶温度感测器。外回路的控制器控制水温，其感测器距加热器很远，直接量测整体水温，其误差量是理想水温及整体水温的差值。外回路PID控制器的输出即为内回路控制器的目标值，内回路控制器控制加热器，其感测器是在加热器上，其误差量是加热器的理想温度及量测到温度的差值，其输出会使加热器维持在设定值附近。

内外回路控制器的参数可能会差很多，外回路的PID控制器有较长的时间常数，对应所有的水加热或是冷却需要的时间。内回路的PID控制器反应会比较快。每个控制器可以调整到符合其真正控制的系统，例如水槽中所有的水，或是加热器本身。

## 其他PID的形式及其表示法

### 理想的PID及标准形PID

工业上常看到PID控制器，而许多工业相关资料中看到的都是“标准形”的PID，其中比例增益$K_p$也作用在$I_{\mathrm{out}}$及$D_{\mathrm{out}}$两项，和上述“理论”段落看到的形式不同。“标准形”的PID为：

$$\mathrm{MV(t)}=K_p\left(\,{e(t)} + \frac{1}{T_i}\int_{0}^{t}{e(\tau)}\,{d\tau} + T_d\frac{d}{dt}e(t)\right)$$

其中

$T_i$为积分时间。

$T_d$为微分时间。

在标准形中，每一个参数有其明确的物理意义，输出是根据现在误差、过去误差及未来误差而决定，加上微分项可以预测若控制系统不改变的话，$T_d$时间后的误差，而积分项是用过去所有误差的和来调整输出，希望在$T_i$时间后可以完全消除误差，而输出的值会再乘以单一的增益$K_p$。

在理想的平行式PID中，其方程如下：

$$\mathrm{MV(t)}=K_p{e(t)} + K_i\int_{0}^{t}{e(\tau)}\,{d\tau} + K_d\frac{d}{dt}e(t)$$

其中的增益和标准形PID系数的关系是：$K_i = \frac{K_p}{T_i}$及$K_d = K_p T_d \,$。平行式PID中的参数都视为单纯的增益，最泛用，灵活性也最高，但较没有物理意义，因此只用在PID的理论处理中，标准形PID虽在数学上比较复杂，在工业中较常使用。

### 倒数增益

许多情形下，PID控制器处理的变数是无因次的量，是某个最大值的比例，介于0到100%之间，而转换为实际物理量（如泵浦速率或是水加热的功率）是在PID控制器外，而这些控制变数是有因次的物理量（例如温度）。此时$K_p$增益多半不会表示为“每变化一度的输出”，而会以温度的形式$1/K_p$表示，代表“100%输出下的温度（变化）”，代表输出由0变到1（0%变为100%）下的温度变化。

### 只针对过程变数进行微分控制

在大部分的商业控制系统中，是用过程变数取代误差作为微分项的输入，其原因是当目标值有不连续变化时，微分控制会产生很大的突波，若目标值不变，改变过程变数的效果和改变误差相同，因此有些PID控制器会用过程变数作为微分项的输入，不会影响控制器控制过程变数，抗噪声的能力。

$$\mathrm{MV(t)}=K_p\left(\,{e(t)} + \frac{1}{T_i}\int_{0}^{t}{e(\tau)}\,{d\tau} - T_d\frac{d}{dt}PV(t)\right)$$

### 只针对过程变数进行微分及比例控制

大部分的商业控制系统也提供选择，让过程变数作为微分控制及比例控制的输入，因此误差只作为积分控制的输入，这也不会影响控制器控制过程变数，抗噪声的能力。

上述的修改可以避免目标值有不连续变化时，输出值有对应不连续的变化，若目标值有步阶变化，这项调整就相当重要。

$$\mathrm{MV(t)}=K_p\left(\,{-PV(t)} + \frac{1}{T_i}\int_{0}^{t}{e(\tau)}\,{d\tau} - T_d\frac{d}{dt}PV(t)\right)$$

也有些双自由度（2-DoF）PID控制架构除了一般的PID控制外，再加上只针对过程变数进行的微分及比例控制，再分别用增益进行调整，目标是同时对目标步阶响应以及噪声抑制都有良好的性能。

### PID控制器的拉氏转换

有关会将PID控制器进行拉氏转换：

$$G(s)=K_p + \frac{K_i}{s} + K_d{s}=\frac{K_d{s^2} + K_p{s} + K_i}{s}$$

PID控制器的拉氏转换也代表着控制器的传递函数，因此可以确认整体系统的传递函数。

### PID的极零点对消

PID控制器可以写成以下的形式

$$G(s)=K_d \frac{s^2 + \frac{K_p}{K_d}s + \frac{K_i}{K_d}}{s}$$

若受控设备的传递函数如下：

$$H(s)=\frac{1}{s^2 + 2\zeta \omega_0 s + \omega_0^2}$$

又令

$$\frac{K_i}{K_d}=\omega_0^2$$

$$\frac{K_p}{K_d}=2\zeta \omega_0$$

则

$$G(s) H(s)=\frac{K_d}{s}$$

因此若受控设备有不稳定的极点，看似可以用此方式消除，不过实际上有些差异，由干扰到输出的闭回路传递函数中仍有不稳定的极点，因此仍可能会发散。

### 串级型或交互型

另一种PID控制器的表示法为串级型（series）或称为交互型（interacting）

$$G(s) = K_c \frac{(\tau_i{s}+1)}{\tau_i{s}} (\tau_d{s}+1)$$

其中参数和标准型的参数有以下的关系

$K_p = K_c \cdot \alpha$, $T_i = \tau_i \cdot \alpha$

$$T_d = \frac{\tau_d}{\alpha}$$

而

$\alpha = 1 + \frac{\tau_d}{\tau_i}$.

上述作法可表示为二个串级的PD控制器及PI控制器，在早期类比电路的时代较容易实现，虽然控制器已经数字化，不过仍有些维持此形式。

### 离散化的控制器

若要在微处理机（MCU）或是FPGA中实现PID控制或是分析其性能，就需要将控制器离散化。一阶微分可以用后向有限差分表示，积分项也离散化，若取样时间为$\Delta t$，积分项可以用下式近似

$$\int_{0}^{t_k}{e(\tau)}\,{d\tau} = \sum_{i=1}^k e(t_i)\Delta t$$

微分项可近似为

$$\dfrac{de(t_k)}{dt}=\dfrac{e(t_k)-e(t_{k-1})}{\Delta t}$$

因此PID控制器的离散化可以将$u(t)$微分，再用一阶导数及二阶导数的定义求得$u(t_k)$，可以得到

$$u(t_k)=u(t_{k-1})+K_p\left[\left(1+\dfrac{\Delta t}{T_i}+\dfrac{T_d}{\Delta t}\right)e(t_k)+\left(-1-\dfrac{2T_d}{\Delta t}\right)e(t_{k-1})+\dfrac{T_d}{\Delta t}e(t_{k-2})\right]$$

其中$T_i = K_p/K_i, T_d = K_d/K_p$

## 伪代码

以下是一段实现PID算法的伪代码：

```
previous_error = 0
integral = 0 
start:
  error = setpoint - measured_value
  integral = integral + error*dt
  derivative = (error - previous_error)/dt
  output = Kp*error + Ki*integral + Kd*derivative
  previous_error = error
  wait(dt)
  goto start
```

此例中有两个变数在循环前需初始化为0，然后开始循环。目前的误差（error）是用目前目标值（setpoint）减去系统反馈值（measured_value）而得，然后再进行积分和微分运算，比例项、积分项及微分项乘以各自参数后得到输出（output）。在实际系统中，这会透过数位类比转换器转换为类比讯号，作为受控系统的控制量。目前的误差量及积分会储存，以便下次计算微分及积分时使用，程式会等待dt秒后开始，循环继续进行，透过类比数位转换器读取新的系统反馈值及目标值，再计算误差量及输出。

## 外部链接

- 改善PID微分和积分的方法及其它控制系统的计算机自动设计CAutoD
- 学习PID和其他系统调试是如何工作的
- PID控制器实验室，PID调试的Java applets
- 一系列的PID调试的Java Applets
- PID调试的问答
- PID控制系统算法的信息和教程
- 用Excel模拟基本的PID
- 如果用电子部件制作一个PID控制器查看22页
- 关于PID控制器的文章，教材
- 一个控制系统的一部分
- PID定速控制应用
- PID马达定速与定角控制公式比较
- Ang, K.H., Chong, G.C.Y., and Li, Y. (2005)， PID control system analysis, design, and technology. IEEE Transactions on Control Systems Technology, 13 (4). pp. 559-576. ISSN 1063-6536
- Understanding Servo Tune(其中包括PID调整方法范例)
- LabView360技术文章 PID