通俗理解 模糊自适应PID

模糊自适应PID算法就是在经典的PID的基础上添加模糊控制规则库,建立这个库的目的就是算法能够自己来进行改变PI、D的值。

就拿温度的上升过程控制来说,刚开始的时候,希望温度能够快速的升到终点温度,并且以尽量小的波动将温度稳定在目标温度处(最好不让其超过)。此时如果利用经典的PID控制方式,那么此时的P值就是恒定不变,但是我们希望他刚开始的时候尽量大。加入规则库,就可以实现,可以用语句

if冷 then 加大热

当然也有:

if热 then 加大冷

从而快速的改变温度。

就好比我们在冬天里用冷水洗脚, 冷水 + 冷脚 = 感觉非常的冷,迫不及待想让水快点热,所以我们加入很热的水,而不是加入温水。

 

这应该是最通俗的理解了。

 

扩充PID_C程序参考如下:(还没有验证

 

#include <stdio.h>

/*定义PID变量结构体*/
struct _pid 
{
    float SetSpeed;//定义设定值
    float ActualSpeed;//定义实际值
    float err;//定义偏差值
    float err_last;//定义上一个偏差
    float Kp, Ki, Kd;//
    float voltage;//定义电压值(控制执行器的变量)
    float integral;//定义积分值
};


/*初始化变量*/

void PID_init(){
    
    printf("PID_init begin \n");
    pid.SetSpeed = 0.0;
    pid.ActualSpeed = 0.0;
    pid.err = 0.0;
    pid.err_last = 0.0;
    pid.voltage = 0.0;
    pid.integral = 0.0;
    pid.Kp = 0.2;
    pid.Ki = 0.015;
    pid.Kd = 0.2;
    printf("PID_init end \n");
    
}

/*编写编写控制算法*/
float PID_realize(float speed){
    pid.SetSpeed = speed;
    pid.err = pid.SetSpeed - pid.ActualSpeed;
    pid.integral+=pid.err;
    pid.voltage = pid.Kp*pid.err + pid.Ki*pid.integral + pid.Kd*(pid.err-pid.err_last);
    pid.err_last = pid.err;
    pid.ActualSpeed = pid.voltage*1.0;
    return pid.ActualSpeed;
}

int main (){
    printf("System begin \n");
    PID_init();
    int count;
    while (1){
        float speed = PID_realize(200.00);
        printf("%f\n",speed);
        count++;
        
    }
    return 0;
}

 

posted @ 2019-06-01 14:07  Mr_Song_D  阅读(6080)  评论(0编辑  收藏  举报