zoukankan      html  css  js  c++  java
  • PID各环节的意义和功能,自带PID的matlab编程实例

    这是PID的标准形式包括比例/积分/微分三部分,e为偏差

    下面我们分析三个环节的作用,设:当前系统状态A,目标状态B, e=B-A,初始状态e>0

    (以下是个人的理解,欢迎读者评论)

    1 比例环节P

    e越大u越大,当A近似B时,e非常小,u也非常小,现实系统的u除了要满足自身系统的需求,还要分担给克服磨擦,空气阻力等等,因此最终A总是和B差一点,这个很小的u用在克服阻碍上了(它会存在一个小误差)

    2 微分环节d

    此环节就是e的斜率,A在趋近B的过程中e的值始终为正,但e的斜率为负,它不希望e变化,当A稳定在恒定值时,e的斜率为零,它也就失去作用(但它无法消除误差)

    3 积分环节i

    我们一直都知道,积分的数学意义就是求函数与坐标轴围成的面积(这里是指A与目标B围成的面积),它希望面积为零,当比例环节造成的误差存在时(此时A<B),它就会发挥作用,直到围成的面积和为零(它可以消除误差)

    这是编程中u的计算方法

    u(i) = Kp * (x_last - x(i)) +

          Ki * (x_last - 2 * x(i - 1) + x(i - 2)) +

          Kd * x_last

    u为控制量,x_last为目标值。x(i)为当前值

    下面是matlab编程实例:

    已知:A= [-2 -1;1 0] , B = [1 ; 0],现用P控制器来控制这个系统(搞清楚P控制,积分微分内容也是如法炮制)

    matlab脚本如下:

    A = [-2 -1;

             1 0];

    B = [1;0];

    C = [0 0];

    D = 0;

    sys = ss(A,B,C,D);%组成空间量

    sys1 = c2d(sys,0.1);%转为离散,采样时间0.1s

    x = [1;0];%系统初始状态

    x_last = [0;0];%我们期望的最终目标

    Kp = [0.001 0.001];%系数不能太大,这里Kp是1*2的

    %Ki.......

    %Kd........

    %下面开始进行P控制

    for i = 1:100

      u = Kp * (x_last - x(:,i));%u控制器算出的控制量

      x(:,i+1) = sys1(1,1).A * x(:,i) + sys1(1,1).B * u;%为了保证矩阵维度一致,u必须是1*1的,所以Kp需要是1*2的

    end

    到此程序结束,在这要注意几点:

    1 一定要注意矩阵维度问题,维度很容易出错;

    2 循环时要保证每个状态都能被循环到;

     3     注意系数不能太大,有时候调试半天也不知道是怎么回事,其实就是系数太大导致u大的离谱;

  • 相关阅读:
    O021、创建 Image
    O020、理解 Glance
    O019、通过例子学习 Keystone
    O018、理解 Keystone 核心概念
    O017、部署DevStack
    O016、搭建实验环境
    O015、OpenStack 架构
    O014、云计算与OpenStack
    O013、动手实践Linux VLAN
    O012、Linux如何实现VLAN
  • 原文地址:https://www.cnblogs.com/niulang/p/9049265.html
Copyright © 2011-2022 走看看