SaintStefan
12/22/2019 - 5:37 PM

普通增量型PID的C语言实现

/*******************************************************************************
 * 普通增量型PID的C语言实现
 *******************************************************************************
 * PID增量表达式:∆u(k) = Kp*(error(k) - error(k-1)) + Ki*(error(k)) + Kd*(error(k) - 2*error(k-1) + error(k-2))
 * 最终的结果 = u(k) + ∆u(k)
 ******************************************************************************/

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

struct _pid
{
    float SetSpeed;               //定义设定值
    float ActualSpeed;            //定义实际值
    float error;                  //定义偏差值
    float error_next1;            //定义偏差值(k-1)
    float error_next2;            //定义偏差值(k-2)
    float Kp,Ki,Kd;               //定义比例、积分、微分系数
}pid;                           //定义了一个结构名为_pid的结构变量pid

void PID_init()
{
    printf("PID_init begin\n");
    pid.SetSpeed = 0.0;
    pid.ActualSpeed = 0.0;
    pid.error = 0.0;
    pid.error_next2 = 0.0;
    pid.error_next1 = 0.0;
    pid.Kp = 0.2;                 //需要自行整定
    pid.Ki = 0.015;               //
    pid.Kd = 0.2;                 //
    printf("PID_init end\n");
}

float PID_realize(float speed)
{
    float incrementSpeed;
    
    pid.SetSpeed = speed;
    pid.error = pid.SetSpeed - pid.ActualSpeed;
    incrementSpeed = pid.Kp*(pid.error - pid.error_next1) + pid.Ki*pid.error + pid.Kd*(pid.error - 2*pid.error_next1 + pid.error_next2);
    pid.ActualSpeed += incrementSpeed;
    pid.error_next2 = pid.error_next1;
    pid.error_next1 = pid.error;
    return pid.ActualSpeed;
}

int main()
{
    PID_init();
    int count = 0;
    while(count < 1000)           //运行1000次,得到1000个数据
    {
        float speed = PID_realize(200.0);
        printf("%f\n",speed);
        count++;
    }
    return 0;
}