新型PID控制及其应用

第一章:数字PID控制
1.PID控制原理:新型PID控制及其应用_第1张图片
图为PID控制原理的最简形式:

e(t) = 设定值 - 实际值

控制规律为:
新型PID控制及其应用_第2张图片
P:比例控制部分,当产生误差后,系统会产生控制作用,减小偏差。但是偏差始终减少不到。所以会与设定值有一个误差,叫做静态误差。对于参数P的控制作用,可以增加开环增益,但是P加大后会不稳定。
I:积分控制部分:积分部分的引入是为了消除静态误差,提高系统的无差度。I加大后会增加系统的稳定性,但超调会明显,所以在PID的控制之上,会对积分部分采取一些操作,以减小超调。
D:微分控制部分:能反映信号的偏差的变化趋势。加快系统的动作迅速,较小调节时间。
有一个形象的比喻:
新型PID控制及其应用_第3张图片

是不是对PID的理解又深了一步呢?

2.PID分为位置式PID和增量式PID:
区别:位置式PID是与过去的位置有关。容错性小
增量式PID只与增量有关。
3.位置式PID公式:

#include <stdio.h>
#include <stdlib.h>

 struct PID{

    float Speed_Set ;
    float Speed_Actual;
    float Kp;
    float Ki;
    float Kd;
    float Err;
    float Last_Err;
    float Sum_Err;

} PID;

void PID_Init (void){

    printf("PID_Init Begin:\n");

    PID.Speed_Set    = 0  ;
    PID.Speed_Actual = 0  ;
    PID.Kp           = 0.2;
    PID.Ki           = 0.1;
    PID.Kd           = 0;
    PID.Err          = 0.0;
    PID.Last_Err     = 0.0;
    PID.Sum_Err      = 0.0;

    printf("PID_Init end:\n");
}

float PID_Realize (float Speed){

    PID.Speed_Set = Speed;
    PID.Err       = PID.Speed_Set - PID.Speed_Actual ;
    PID.Sum_Err += PID.Err;
    PID.Last_Err =  PID.Err;

    PID.Speed_Actual  = PID.Kp * PID.Err + PID.Ki * PID.Sum_Err + PID.Kd * (PID.Err - PID.Last_Err);

    return PID.Speed_Actual ;
}

void main(void){

    float Speed = 0.0;
    float a = 0.0;
    int i = 0;
    PID_Init ();
    while(i < 290){

     a = PID_Realize ( 200.0);
     printf("%f\n",a);
     i++;
    }
       system("pause");

}

缺点:由于是全量输出,所以每次输出均与过去的状态有关,计算是要对e(k)进行累加,计算机工作量大,且容易出现错误。

4.增量式PID公式:

#include <stdio.h>
#include <stdlib.h>

struct PID{

    float set;
    float act;
    float err;
    float err_next;
    float err_last;
    float P;
    float I;
    float D;

}pid;

void PID_INIT(void){

    pid.set = 0.0;
    pid.act = 0.0;
    pid.err = 0.0;
    pid.err_next = 0.0;
    pid.err_last = 0.0;
    pid.P = 0.2;
    pid.I = 0.015;
    pid.D = 0.2;

}

float PID_rea (float SET){

    float speed = 0.0;

    pid.set = SET;
    pid.err = pid.set - pid.act;
    speed = pid.P *(pid.err - pid.err_next ) + pid.I * pid.err + pid.D * (pid.err- pid.err_next  - (pid.err_next - pid.err_last) );

    pid.act += speed;
    pid.err_last = pid.err_next;
    pid.err_next = pid.err;

    return pid.act;

}

void main(void){

    int i = 250;
    float speed = 0.0;

    PID_INIT();

    while(i>= 0){

        i --;
        speed = PID_rea(200.0);
        printf("%f\n",speed);

    }

    system("pause");

}

优点:由于计算机输出增量,所以误动作是影响小,可用逻辑判断去掉
算式无需累加。
缺点:有静态误差,这个无法避免。

总结:在控制精度高的控制系统中用位置PID
在以步进电机未执行器的系统中,则可以使用增量式PID

你可能感兴趣的:(pid)