PID控制器

PID控制器（比例-积分-微分控制器），由比例单元（P）、积分单元（I）和微分单元（D）组成。可以透过调整这三个单元的增益Kp，Ki和Kd来调定其特性。PID控制器主要适用于基本上线性，且动态特性不随时间变化的系统。
PID控制器是一个在工业控制应用中常见的反馈回路部件。这个控制器把收集到的数据和一个参考值进行比较，然后把这个差别用于计算新的输入值，这个新的输入值的目的是可以让系统的数据达到或者保持在参考值。PID控制器可以根据历史数据和差别的出现率来调整输入值，使系统更加准确而稳定。
PID控制器的比例单元(P)、积分单元(I)和微分单元(D)分别对应目前误差、过去累计误差及未来误差。若是不知道受控系统的特性，一般认为PID控制器是最适用的控制器。借由调整PID控制器的三个参数，可以调整控制系统，设法满足设计需求。控制器的响应可以用控制器对误差的反应快慢、控制器过冲的程度及系统震荡的程度来表示。不过使用PID控制器不一定保证可达到系统的最佳控制，也不保证系统稳定性。
有些应用只需要PID控制器的部分单元，可以将不需要单元的参数设为零即可。因此PID控制器可以变成PI控制器、PD控制器、P控制器或I控制器。其中又以PI控制器比较常用，因为D控制器对回授噪声十分敏感，而若没有I控制器的话，系统不会回到参考值，会存在一个误差量。

历史及应用

PID控制器可以追溯到1890年代的调速器设计。PID控制器是在船舶自动操作系统中渐渐发展。1911年Elmer Sperry开发的控制器是最早期PID型控制器的其中之一，而第一个发表PID控制器理论分析论文的是俄裔美国工程师尼古拉斯·米诺尔斯基（Minorsky 1922）。米诺尔斯基当时在设计美国海军的自动操作系统，他的设计是基于对舵手的观察，控制船舶不只是依目前的误差，也考虑过去的误差以及误差的变化趋势，后来米诺尔斯基也用数学的方式加以推导。他的目的是在于稳定性，而不是泛用的控制，因此大幅的简化了问题。比例控制可以在小的扰动下有稳定性，但无法消除稳态误差，因此加入了积分项，后来也加入了微分项。
当时在新墨西哥号战舰上进行测试，利用控制器控制舵的角速度，利用PI控制器可以角度误差维持在±2°以内，若加上D控制，角度误差维持在±1/6°，比最好的舵手还要好。
不过因为海军人员的抗拒，海军那时候未使用这套系统，在1930年代也有其他人作出类似的研究。
在自动控制发展的早期，用机械设备来实现PID控制，是由杠杆、弹簧、阻尼及质量组成，多半会用压缩气体驱动。气动控制器还一度是工业上的标准。
电子的类比控制器可以用晶体管、真空管、电容器及电阻器组成。许多复杂的电子系统中常会包括PID控制，例如磁盘的读写头定位、电源供应器的电源条件、甚至是现代地震仪的运动侦测线路。现代电子控制器已大幅的被这些利用单芯片或FPGA来实现的数位控制器所取代。
现代工业使用的PID控制器多半会用PLC或有安装面板的数位控制器来实现。软件实现的好处是相对低廉，配合PID实现方式调整的灵敏度很大。在工业锅炉、塑胶射出机械、烫金机及包装行业中都会用到PID控制。
变化的电压输出可以用PWM来实现，也就是固定周期，依要输出的量去调整周期中输出高电势的时间。对于数位系统，其时间比例有可能是离散的，例如周期是二秒，高电势时间设定单位为0.1秒，表示可以分为20格，精度5%，因此存在一量化误差，但只要时间分辨率够高，就会有不错的效果。

稳态误差

比例控制在误差为0时，其输出也会为0。若要让受控输出为非零的数值，就需要有一个稳态误差或偏移量。稳态误差和比例增益的成反比。若加入一偏置，或是加入积分控制，可以消除稳态误差。

参数调试

PID的参数调试是指透过调整控制参数（比例增益、积分增益/时间、微分增益/时间）让系统达到最佳的控制效果。稳定性（不会有发散性的震荡）是首要条件，此外，不同系统有不同的行为，不同的应用其需求也不同，而且这些需求还可能会互相冲突。
PID只有三个参数，在原理上容易说明，但PID参数调试是一个困难的工作，因为要符合一些特别的判据，而且PID控制有其限制存在。历史上有许多不同的PID参数调试方式，包括齐格勒－尼科尔斯方法等，其中也有一些已申请专利。
PID控制器的设计及调试在概念上很直觉，但若有多个（且互相冲突）的目标（例如高稳定性及快速的暂态时间）都要达到的话，在实际上很难完成。PID控制器的参数若仔细的调试，会有很好的效果，相反的，若调适不当，效果会很差。一般初始设计常需要不断的电脑模拟，并且修改参数，一直达到理想的性能或是可接受的妥协为止。
有些系统有非线性的特性，若在无载下调试的参数可能无法在满载下动作，可以利用增益规划的方式进行修正（在不同的条件下选用不同的数值）。

稳定性

若PID控制器的参数未挑选妥当，其控制器输出可能是不稳定的，也就是其输出发散，过程中可能有震荡，也可能没有震荡，且其输出只受饱和或是机械损坏等原因所限制。不稳定一般是因为过大增益造成，特别是针对延迟时间很长的系统。
一般而言，PID控制器会要求响应的稳定，不论程序条件及设定值如何组合，都不能出现大幅振荡的情形，不过有时可以接受临界稳定的情形。

最佳性能

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

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

前馈控制

PID控制器若再配合前馈控制（开回路控制），可以再提升其控制性能。在前馈控制中考虑系统的已知信息（例如理想加速度或是惯量），再将输出加到PID控制器的控制输出，以提升整体的系统性能。前馈量可能是控制输出主要的部分，而PID控制器只用来补偿目标值和开回路控制器输出之间的误差。因为前馈输出不会受到回授的影响，因此也不会造成系统的振荡，可以在不影响稳定性的条件下提升系统的响应。前馈可以依目标值及其他量测到的干扰量来产生，目标值加权是一种简单的前馈控制方式。
例如，在大部分的运动控制系统中，为了要使机械负载加速，致动器要产生更大的力。若用速度环的PID控制器来控制负载速度，比较理想的方式是先得到理想的瞬间加速度值，适量调整加权后再加到PID的输出中。因此控制器输出中有一部分是不随机械速度而改变的输出，再用PID根据实际输出和目标的差异去增加或是减少输出。这类有前馈控制的PID控制器可以加快控制系统的反应速度。

无冲击运转

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

串级PID控制器

二个PID控制器可以组合在一起，得到较佳的效果，这称为串级PID控制。以两个PID控制器组成的串级PID控制为例，其中一个PID控制器在外回路，控制像液面高度或是速度等主要的物理量，另一个PID控制器是内回路，以外回路PID控制器的输出做为其目标值，一般是控制较快速变化的参数，例如流量或加速度等。若利用串级PID控制，可以增加控制器的工作频率，并降低其时间常数。
例如一个温控的循环水浴设备有二个串级的PID控制器，分别有各自的热电偶温度感测器。外回路的控制器控制水温，其感测器距加热器很远，直接量测整体水温，其误差量是理想水温及整体水温的差值。外回路PID控制器的输出即为内回路控制器的目标值，内回路控制器控制加热器，其感测器是在加热器上，其误差量是加热器的理想温度及量测到温度的差值，其输出会使加热器维持在设定值附近。
内外回路控制器的参数可能会差很多，外回路的PID控制器有较长的时间常数，对应所有的水加热或是冷却需要的时间。内回路的PID控制器反应会比较快。每个控制器可以调整到符合其真正控制的系统，例如水槽中所有的水，或是加热器本身。

倒数增益

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

虚拟码

以下是一段实现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秒后开始，循环继续进行，透过类比数位转换器读取新的系统反馈值及目标值，再计算误差量及输出。