PID算法的理解及场景模拟

增量式PID算法的简化版之后的公式:

△u(t)=Ae(t)-Be(t-1)+Ce(t-2)

△u:PID控制器输出的下一时刻的调整量

e(t):PID控制器在当前时刻的状态变化量-给定值

e(t-1):PID控制器在上一时刻的状态变化量-给定值

e(t-2):PID控制器在上上时刻的状态变化量-给定值

A、B、C 是控制控制系数,A比例,B积分,C微分

需要明确两个重要的概念,被确定量与给定值

被确定量是指传感器检测到的当前系统的状态,给你值是我们希望系统达到的某种状态。(这两个关键变量也因该在公式中有所体现)

 

假设已知下面这个关系,假设初始速度v0 = 100,且PID控制的公式如下:

△u = 0.8v(t) + 0.2v(t-1) + 0.1v(t-2)

模拟情形:0-50:当前速度是100,期望速度是100,当50-150,期望速度变为50,150-200,期望速度变为200

PID控制器的输出的变化如图:(蓝色曲线为PID控制器输出的下一刻产生的速度变化量,黄色曲线为0,标准值,作为速度调整变化的参照曲线)

 

下图给出PID控制器的电机输出(蓝色)与目标速度(黄色)的关系

初始速度是100.当50s的时候,期望速度变为50 ,此时PID控制器给电机的反馈要低于达到目标速度的输出,以达到加快减速的目的,而当期望速度由50变为150,点击的输出量要大于150需要的量,以达到加快加速的目的,这个就是i这个分量的作用。d这个分量的作用是消除震荡,消除由于刚刚的提高加速的高输出带来的加速或加速过度带来的影响。具体的这三个参数还是需要在实际的闭环系统中进行调节,达到最佳值。

总结:

p:主要的调节作用,通过加速或减速,已达到期望速度,值一般最大

I:加速调节的作用,通过过量的调节方式,实现快速达到期望值

D:消除震荡,消除由于I的过度调节引起的震荡

 

模拟的python源码:

# -*- coding: UTF-8 -*-

#约定俗成的写法plt
import matplotlib.pyplot as plt

curV = 100
curV_p1 = 100
curV_p2 = 100
stanV = 100
p = 0.7
i = 0.2
d = 0.1
index = 0
x = []
v = []
s = []
while index < 200:
    x.append(index)
    index = index + 1
    v_d = (curV - stanV) * p + (curV_p1 - stanV) * i + (curV_p2 - stanV) * d
    curV_p1 = curV
    curV_p2 = curV_p1
    curV = curV - v_d
    print (index,v_d,curV)
    v.append(curV)
    s.append(stanV)
    if index == 50:
        stanV = 50
    elif index == 150:
        stanV = 200

plt.plot(x,v)
plt.plot(x,s)
plt.show()

 

 

 
 

 

posted @ 2019-03-04 17:43  Drebander  阅读(650)  评论(0编辑  收藏  举报