有关位置型PID控制算法Python代码实现已经在上一篇文章中介绍清楚了,需要的可以点这里回顾上一篇文章。本文将介绍增量型PID控制算法。
增量型PID控制算法原理介绍
位置型PID控制算法公式已经在上一篇文章中给出,增量型PID算法仍需要用到,给出如下:
那么
两式相减得到
这就是离散化PID的增量式表示方式,由公式可以看出,增量式的表达结果和最近三次的偏差有关,这样就大大提高了系统的稳定性。需要注意的是,增量型PID控制算法得到的是输出量的变化量,如果需要得到当前状态的值,还需要做一次加法。
位置型PID和增量型PID控制算法
两者的区别在于:
(1)位置型PID控制算法的输出与整个过去的状态都有关,用到了误差的累计值;而增量型PID控制算法的输出只与当前状态和前两个状态有关,所以位置型PID控制算法的累积误差相对较大;
(2)由表达式可以看出,增量型PID控制算法并无积分作用,因此增量型方法适用于执行机构带积分部件的对象,如步进电机等,而位置型PID适用于执行机构不带积分部件的对象,如电液伺服阀。
(3)由于增量型PID得到的是输出量的变化量,如果计算机出现故障,误动作影响较小,不会严重影响系统的工作,而位置型PID算法的输出直接对应对象的输出,因此对系统影响较大。
增量型PID算法Python代码实现
增量型PID算法Python代码实现如下:
import numpy as np
import matplotlib.pyplot as plt
class PID:
def __init__(self, P=0, I=0, D=0, initValue=0):
self.Kp = P
self.Ki = I
self.Kd = D
self.curValue = initValue
self.last_error = 0
self.last_last_error = 0
self.cur_error = 0
def PID_output(self, Target):
self.last_last_error = self.last_error
self.last_error = self.cur_error
self.cur_error = Target - self.curValue
delta = self.Kp * (self.cur_error - self.last_error) + \
self.Ki * self.cur_error + \
self.Kp * (self.cur_error - 2 * self.last_error + self.last_last_error)
self.curValue += delta
return self.curValue
def test_PID(P=0, I=0, D=0, initValue=0, len=1, target=0):
pid = PID(P, I, D, initValue)
pid_list = []
time_list = []
pid_list.append(pid.curValue)
time_list.append(0)
for i in range(1, len + 1):
output = pid.PID_output(target)
pid_list.append(output)
time_list.append(i)
time_list = np.array(time_list)
pid_list = np.array(pid_list)
plt.figure()
plt.style.use('seaborn-v0_8')
plt.plot(time_list, pid_list)
plt.axhline(target, c='green')
plt.xlim((0, len))
plt.ylim((min(pid_list) - 1, max(pid_list) + 1))
plt.xlabel('time(s)')
plt.ylabel('value')
plt.title('PID control')
plt.grid(True)
plt.show()
if __name__ == '__main__':
test_PID(P=0.2, I=0.1, D=0.1, initValue=200, len=100, target=100)