• PID简介


    一、基本定义
    Sv:用户设定值(给定信号)
    Pv:控制对象当前状态值(反馈信号)
    E:偏差值(偏差信号)
    所以:E=Sv-Pv

    二、PID各个控制基本分析
    1、P控制(比例控制)

    Pout=Kp*Ek
    1. 假定从早上开机上电,我们每隔一秒钟就通过传感器取一个反馈信号。
    2. X(1)X(2)X(3)X(4)……………X(k-2)、X(k-1)、X(k) //从开机以来,传感器的所有采样点的数据序列。X(1)为开机第一秒的反馈值,X(k)为当前时刻的反馈值
    3. Ek=Sv-X(k) //用户设定值减去第k时刻(也就是当前时刻)的反馈值,得出一个偏差值。反映了当前时刻用户设定值与反馈值的偏差程度。
    4. Ek>0:代表当前控制未达标,当前时刻反馈值小于用户期望值。
    5. Ek=0:代表控制刚好达标
    6. Ek<0:代表当前控制已超标,,当前时刻反馈值大于用户期望值。
    7. 比例控制器是根据Ek值线性输出控制信号,对负载做出控制。那么具体做法就是:
    8. Pout=Kp*Ek //[输出信号大小] 正比于 [当前偏差值]
    9. Kp:放大系数,可以认为是一个放大器或者衰减器。
    10. Kp作用:顾名思义就是用于整个比例控制器的增益。
    11. 通俗来说就是将反馈回来的偏差值Ek进行有意的放大或者缩小,然后作为输出量输出。
    1. 比例控制缺点:
    2. 由公式我们可以看出,无论Ek>0还是Ek<0,Pout都会有输出,而当Ek=0时,Pout=0无输出信号,不输出信号即负载处于失控状态,
    3. 那么此时无论环境或者其他因素都有可能作为扰动信号使得此时的系统产生波动。
    4. 也就是说:比例控制遵循的是,你有了偏差我才会控制,你没有偏差我就不起作用了,一旦达到目标我就不管了,生死与我再不相干。
    5. 所以比例控制在控制系统的控制过程中总是有误差,故比例控制又称为"有差控制"
    1. 比例控制缺点:
    2. 无论Ek>0还是Ek<0,Pout都会有输出,而当Ek=0时,Pout=0无输出信号,不输出信号即负载处于失控状态,
    3. 那么此时无论环境或者其他因素都有可能作为扰动信号使得此时的系统产生波动。
    4. 也就是说:比例控制遵循的是,你有了偏差我才会控制,你没有偏差我就不起作用了。
    5. 所以比例控制在控制系统的控制过程中总是有误差,故比例控制又称为"有差控制"
    1. 其实这里有一个可以避免偏差为0时系统零输出的方法,具体做法就是:
    2. Pout=Kp*Ek+OUT0 //即加一个维持输出OUT0,那么即使Ek=0时也会有Pout=OUT0,Pout也就不会再有零输出情况发生。
    3. 这个方法在你使用 单比例控制 时可以使用且效果不错。

    2、I控制(积分控制)

    1. {X(1)、X(2)、X(3)、X(4)……………X(k-2)、X(k)} //从开机以来,传感器的所有采样点的数据序列。X(1)为开机第一秒的反馈值,X(k)为当前时刻的反馈值
    2. 我们将开机以来每个反馈值都依次与用户期望值Sv相减,即可得出对应的偏差序列:
    3. {E(1)、E(2)、E(3)、E(4)…………E(k-2)、E(k-1)、E(k)} //历史所有采样点的偏差序列。
    4. E(1)=X(1)-Sv;E(2)=X(2)-Sv;;E(3)=X(3)-Sv;;E(4)=X(4)-Sv;;……E(K-2)=X(K-2)-Sv;E(K-1)=X(K-1)-Sv;E(K)=X(K)-Sv;
    5. 将这些历史偏差求代数和:
    6. Sk=E(1)+E(2)+E(3)+E(4)…………E(k-2)+E(k-1)+E(k); //反映的是历史上偏差值的整体情况。
    7. [分析]
    8. Sk>0:在过去时间,大多数是未达标的,即整体是未达标的。
    9. Sk=0:在过去时间,控制效果整体是比较合理的。
    10. Sk<0:在过去时间,大多数是超标的。
    11. 积分控制器公式为:
    12. Iout=Kp*Sk //[输出信号大小] 正比于 [过去总体偏差值]

    3、D控制(微分控制)

    1. {X(1)、X(2)、X(3)、X(4)……………X(k-2)、X(k-1)、X(k)} //从开机以来,传感器的所有采样点的数据序列。X(1)为开机第一秒的反馈值,X(k)为当前时刻的反馈值
    2. 我们将开机以来每个反馈值都依次与用户期望值Sv相减,
    3. E(1)=X(1)-Sv;E(2)=X(2)-Sv;;E(3)=X(3)-Sv;;E(4)=X(4)-Sv;;……E(K-2)=X(K-2)-Sv;E(K-1)=X(K-1)-Sv;E(K)=X(K)-Sv;
    4. 即可得出对应的偏差序列:
    5. {E(1)、E(2)、E(3)、E(4)…………E(k-2)、E(k-1)、E(k)} //历史所有采样点的偏差序列。
    6. 那么此时从[前一时刻的偏差E(k-1)] 到 [当前这一时刻的偏差E(k)] 的差值,即偏差之差为:
    7. Dk = E(k) - E(k-1); //差值的差,所以这是反映的是两个时刻的偏差的变化趋势。
    8. [分析]
    9. Dk>0:这个时刻的偏差比上一时刻的偏差还要大,所以偏差为增大趋势,系统状态越来越偏离目标。
    10. Dk=0:两个时刻的偏差相对没有改变,两次偏差值相等。系统无变化。
    11. Dk<0:这个时刻的偏差比上一时刻的偏差小,所以偏差为减小趋势,系统状态越来越接近目标。
    12. 微分控制器公式为:
    13. Dout = Kp * Dk

    4、PID控制(比例积分微分控制)

    1. PIDout = Pout+Iout+Dout;//将P、I、D三种算法加起来,它们就会相互之间优缺点弥补。
    2. PIDout =(Kp * Ek+OUT0+(Kp * Sk+OUT0+(Kp * Dk+OUT0);
    3. PIDout = Kp * (Ek + Sk + Dk)+OUT0;//得出PID算法的简单数学模型

    PIDout=Kp*(Ek+Sk+Dk)+OUT0

    Ek、Sk、Dk”是可以测算的,而“Kp、OUT0”可由人为确定。

    三、数学模型中Sk、Dk的确定

    1、 Sk的处理

    Sk=\frac{1}{Ti}\cdot T\cdot \sum Ek

    1. Ti:积分时间常数//数学上指积分项运行的时间,物理上指考察历史数据的范围大小。
    2. T:控制周期(或称采样周期、计算周期)//即我多长时间算一次PID,多长时间更新一次PID,间隔时间。
    3. NOTE:Ti越大,(1/Ti)越小,积分项输出就越小。即:Ti越大,就越削弱输出。

    故Sk的确定,需要确定两个参数:T与Ti

    2、Dk的处理

    Dk=Td \cdot \frac{Ek-E(k-1)}{T}

    1. Td:微分时间常数//反应微分项运行的时间。
    2. T:控制周期(或称采样周期、计算周期)//即我多长时间算一次PID,多长时间更新一次PID,间隔时间。
    3. NOTE1:Td越大,微分项输出就越大。即:Td越大,就越增强输出。
    4. NOTE2:偏差不变情况下,T越大,此时公式后半部分就越小,即偏差变化趋势越小,即偏差斜率越平坦(如下图),
    5. 这会造成的结果是:有时系统明明已经发生了非常非常剧烈的变化,但却因为我控制周期设置太长了,
    6. 使得系统对变化趋势很不敏感,而导致系统并未检测到该剧烈变化。这就可以理解为“T若过大,则微分项失效”
    7. 故控制周期T切勿取过大。

    故Dk的确定,需要确定两个参数:Td与T(与Sk中的是同一个T)

    3、PID数学模型

    将上面的数学公式整理一下可得:

    PIDout=Kp*(Ek+Sk+Dk)+OUT0

    PIDout=Kp*(Ek+\frac{1}{Ti}\cdot T\cdot \sum Ek+Td \cdot \frac{Ek-E(k-1)}{T})+OUT0

     \bgwhiteKi=Kp1TiT" role="presentation" style="position: relative;">\bgwhiteKi=Kp1TiT

    \bgwhiteKd=KpTd1T" role="presentation" style="position: relative;">\bgwhiteKd=KpTd1TPIDout=KpEk+KiEk+Kd(EkE(k1))+OUT0" role="presentation" style="position: relative;">PIDout=KpEk+KiEk+Kd(EkE(k1))+OUT0

    四、位置PID控制代码

    1. /*****变量定义************/
    2. int
    3. Error,Error_last, //本次偏差,上次偏差
    4. Integral_Error,Differential_Error, //偏差的积分,偏差的微分
    5. Proportion_OUT,Integral_OUT,Differential_OUT,//比例项输出,积分项输出,微分项输出
    6. T,Ti,Td, //控制周期,积分时间常数,微分时间常数
    7. PID_OUT; //PID最终输出
    8. float
    9. Kp,Ki,Kd;//比例项系数,积分项系数,微分项系数
    10. /*
    11. *****PID函数**********
    12. 函数入口:目标值Target,反馈值Feedback
    13. 函数返回:PID最终输出
    14. */
    15. int PID_Controller(float Target,float Feedback)
    16. {
    17. Ki = Kp * T * (1/Ti);//积分项系数,即提取出积分项公式中所有可人为设定的参数
    18. Kd = Kp * Td * (1/T);//微分项系数,即提取出微分项公式中所有可人为设定的参数
    19. Error = Target - Feedback;//偏差
    20. Integral_Error = Integral_Error + Error;//偏差的积分
    21. Differential_Error = Error - Error_last;//偏差的微分
    22. Proportion_OUT = Kp * Error;//比例项输出 = Kp * 偏差
    23. Integral_OUT = Ki * Integral_Error; //积分项输出 = Ki * 偏差的积分
    24. Differential_OUT = Kd * Differential_Error; //微分项输出 = Kd * 偏差的微分
    25. PID_OUT = Proportion_OUT + Integral_OUT + Differential_OUT;//PID最终输出 = 比例项输出 + 积分项输出 + 微分项输出
    26. return PID_OUT;
    27. }

  • 相关阅读:
    System.lineSeparator() 解决 append(“\r\n“) 换行符抛异常:No such file or diretory
    vscode 局域网访问HTML文件
    【LeetCode-中等题】46. 全排列
    乘积尾零(乘积尾巴中的0个数)
    this的指向
    硬件设计——串联直流稳压电源
    CVPR‘23投稿量再创新高? CCF会议投稿量大比拼, 谁才是卷王?
    linux虚拟化: svm: 初始化及重要函数分析
    【vue】vue实现海康ws协议的实时监控播放:
    SpringBoot整合RabbitMQ实现延迟队列功能
  • 原文地址:https://blog.csdn.net/wsq_666/article/details/126507601