PID控制

1.PID控制

由PID控制器产生的执行器命令式误差信号及其积分和微分的加权和。

u=Kp(e+Ki∫e*dt+Kd*de/dt)

2.调节PID控制器

  • 选择比较小的Kp值,设置Kd=0,较小的Kp值可以降低出现过量超调和振荡的可能性
  • 选择适当的输入信号,如阶跃输入
  • 递增Kp值,重复测试。如果Kp过大将引起超调和振荡
  • 递增Kd值,使超调和振荡减小到可接受范围。如何响应速度慢得难以接受,可以减少Kd值
  • 继续递增Kp,并将Kd调节到适合的值。如果出现无法接受的饱和,减少Kp值
  • 将Ki设置比较小的值,递增Ki值,如果Ki过大,响应中的超调会变得过大

3.PID控制与执行器饱和

积分器饱和时执行器不能完全反应其指定行为期间对大误差信号积分的结果。为题是倍积分的误差项在这段时间内达到很大的值,

引起系统响应出现过量超调。

解决办事的一种是:当误差信号幅度大于门限时,停止积分,将输入设置为0

4.PID控制算法c++实现

#include<cmath>
typedef double real;
class PID_controller
{

public:
  
void Initialize(real kp,real ki,real kd,real error_thresh,real step_time);
 
real Update(real error);
  

private:

bool m_started;

real m_kp, 
real m_ki;
real m_kd;
real m_h;
real m_inv_h;
real m_prev_error;
real m_error_thresh;
real m_integral;        

};

void PID_controller::Initialize(real kp, real ki,
        real kd, real error_thresh, real step_time)
{
    //初始化控制器参数
    m_kp=kp;
    m_ki=ki;
    m_kd=kd;
    m_error_thresh=error_thresh;
    //控制器步进时间及倒数
    m_h=step_time;
    m_inv_h=1/step_time;
    //初始化积分和微分计算
    m_integral=0;
    m_started=false;

}

real PID_controller::Update(real error)
{
    //如果误差幅度低于门限,则q为1,否则为0
    real q;

    if(fabs(error)<m_error_thresh)
    {    
        q=1;
    }
    else
    {
        q=0;
    }
    //更新误差积分
    m_integral+=m_h*q*error;
    //计算误差微分
    real deriv;
    if(!m_started)
    {
        m_started=true;
        deriv=0;
    }
    else
    {
        deriv=(error - m_prev_error)*m_inv_h;
    }

    m_prev_error=error;
    return m_kp*(error+m_ki*m_integral+m_kd*deriv);

}

当设备模型不存在时可以使用PID控制器进行控制。由于没有数学模型,设计方法需要反复调节控制器的参数,以响应闭环系统的测试。

posted on 2013-03-23 20:29  bigmenfi  阅读(375)  评论(0)    收藏  举报