1. PID算法控制运用在哪些地方?
    PID:比列(Proportion),积分(Integral),微分(Differential)
    PID算法可以用来控制温度,压强,流量,化学成分,速度等等。汽车的定速巡航;伺服驱动器中的速度位置控制;冷却系统的温度;液压系统的压力等都可以通过PID算法实现,很好的保证系统的稳定性。
    2. PID算法的原理
    先了解几个概念:
    偏差 e:某时刻的系统的输出值(output)和目标值(target)之差
    Kp: 比列系数
    Ki: 积分系数
    Kd: 微分系数
    Ti: 积分时间
    Td: 微分时间
    原理图:

    image.png
    如图,当得到输出后,将输出和输入的差值作为偏差,将这个偏差信号经过比列,积分,微分3种运算方式叠加后再以一定的方式加入到输入中,从而控制最终的结果,达到想要的输出值。
    比例系数Kp:
    增大比例系数使系统反应灵敏,调节速度加快,并且可以减小稳态误差。但是比例系数过大会使超调量增大,振荡次数增加,调节时间加长,动态性能变坏,比例系数太大甚至会使闭环系统不稳定。
    比例控制不能消除稳态误差。
    积分系数Ki:
    使系统消除稳态误差,提高无差度。积分控制的作用是,只要系统有误差存在,积分调节就进行,积分控制器就不断地积累,输出控制量,直至无差,积分调节停止,积分调节输出一常值。因而,只要有足够的时间,积分控制将能完全消除误差,使系统误差为零,从而消除稳态误差。积分作用的强弱取决于积分时间常数Ti,Ti越小,积分作用就越强,积分作用太强会使系统超调加大,甚至使系统出现振荡,反之Ti大则积分作用弱。加入积分调节可使系统稳定性下降,动态响应变慢。
    微分系数Kd:
    微分控制可以减小超调量,克服振荡,使系统的稳定性提高,同时加快系统的动态响应速度,减小调整时间,从而改善系统的动态性能。
    微分的控制作用跟偏差的变化的速度有关,微分控制能够预测偏差,产生 超前的校正作用,有助于减少超调。
    PID的公式原理
    image.png
    如果需要在计算机上实现,需要将其离散化:
    image.png
    可以看出,某一个偏差的PID值只跟相邻的三个偏差相关。
    3. PID算法的python实现
    首先建立一个PID的算法模块,算法原理就是上面的式子,保存为PID.py,如下:

    1. import time
    2. class PID:
    3. def __init__(self, P, I, D):
    4. self.Kp = P
    5. self.Ki = I
    6. self.Kd = D
    7. self.sample_time = 0.00
    8. self.current_time = time.time()
    9. self.last_time = self.current_time
    10. self.clear()
    11. def clear(self):
    12. self.SetPoint = 0.0
    13. self.PTerm = 0.0
    14. self.ITerm = 0.0
    15. self.DTerm = 0.0
    16. self.last_error = 0.0
    17. self.int_error = 0.0
    18. self.output = 0.0
    19. def update(self, feedback_value):
    20. error = self.SetPoint - feedback_value
    21. self.current_time = time.time()
    22. delta_time = self.current_time - self.last_time
    23. delta_error = error - self.last_error
    24. if (delta_time >= self.sample_time):
    25. self.PTerm = self.Kp * error#比例
    26. self.ITerm += error * delta_time#积分
    27. self.DTerm = 0.0
    28. if delta_time > 0:
    29. self.DTerm = delta_error / delta_time#微分
    30. self.last_time = self.current_time
    31. self.last_error = error
    32. self.output = self.PTerm + (self.Ki * self.ITerm) + (self.Kd * self.DTerm)
    33. def setSampleTime(self, sample_time):
    34. self.sample_time = sample_time

    然后在相同路径下建立一个test_pid.py,实现PID控制的算法示意,如下:

    1. import PID #导入上面的PID算法
    2. import time
    3. import matplotlib.pyplot as plt
    4. import numpy as np
    5. from scipy.interpolate import spline
    6. def test_pid(P, I , D, L):
    7. pid = PID.PID(P, I, D)
    8. pid.SetPoint=1.1
    9. pid.setSampleTime(0.01)
    10. END = L
    11. feedback = 0
    12. feedback_list = []
    13. time_list = []
    14. setpoint_list = []
    15. for i in range(1, END):
    16. pid.update(feedback)
    17. output = pid.output
    18. feedback +=output #PID控制系统的函数
    19. time.sleep(0.01)
    20. feedback_list.append(feedback)
    21. setpoint_list.append(pid.SetPoint)
    22. time_list.append(i)
    23. time_sm = np.array(time_list)
    24. time_smooth = np.linspace(time_sm.min(), time_sm.max(), 300)
    25. feedback_smooth = spline(time_list, feedback_list, time_smooth)
    26. plt.figure(0)
    27. plt.grid(True)
    28. plt.plot(time_smooth, feedback_smooth,'b-')
    29. plt.plot(time_list, setpoint_list,'r')
    30. plt.xlim((0, L))
    31. plt.ylim((min(feedback_list)-0.5, max(feedback_list)+0.5))
    32. plt.xlabel('time (s)')
    33. plt.ylabel('PID (PV)')
    34. plt.title('PythonTEST PID--xiaomokuaipao',fontsize=15)
    35. plt.ylim((1-0.5, 1+0.5))
    36. plt.grid(True)
    37. plt.show()
    38. if __name__ == "__main__":
    39. test_pid(1.2, 1, 0.001, L=100)

    最终,输出的示意图如下,
    image.png
    其中,红色线是目标值(setpoint),蓝色线是在当前Kp,Ki,Kd参数下的震荡结果,最终趋于目标值,实现了控制。
    从而用python实现了PID算法的简单示意。
    4. PID调试的一些经验
    PID调试的一般原则:
    在输出不震荡时,增大比例增益;
    在输出不震荡时,减少积分时间常数;
    在输出不震荡时,增大微分时间常数;
    PID调节口诀:
    参数整定找最佳,从小到大顺序查
    先是比例后积分,最后再把微分加
    曲线振荡很频繁,比例度盘要放大
    曲线漂浮绕大湾,比例度盘往小扳
    曲线偏离回复慢,积分时间往下降
    曲线波动周期长,积分时间再加长
    曲线振荡频率快,先把微分降下来
    动差大来波动慢,微分时间应加长
    理想曲线两个波,前高后低四比一
    一看二调多分析,调节质量不会低