標(biāo)題: 分離積分的pid伺服控制 [打印本頁(yè)]

作者: 2713286758    時(shí)間: 2018-4-10 22:56
標(biāo)題: 分離積分的pid伺服控制
#include <stdio.h>
#include <math.h>
int index;
struct _pid{
float SetSpeed;         //定義設(shè)定值
float ActualSpeed;      //定義實(shí)際值
float err;              //定義偏差值
float err_last;         //定義上一個(gè)偏差值
float Kp,Ki,Kd;         //定義比例、積分、微分系數(shù)
float voltage;          //定義電壓值(控制執(zhí)行器的變量)
float integral;         //定義積分值
}pid;

//項(xiàng)目中獲取到的參數(shù)
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;             //自己設(shè)定
    pid.Ki=0.04;           //自己設(shè)定
    pid.Kd=0.2;             //自己設(shè)定
    printf("PID_init end \n");
}

float PID_realize(float speed){
    pid.SetSpeed=speed;                     //設(shè)定值
    pid.err=pid.SetSpeed-pid.ActualSpeed;   //設(shè)定值-實(shí)際值
    if(abs(pid.err)>200)
    {
        index=0;
    }
    else
    {
        index=1;
        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;                   //上一個(gè)偏差值
    pid.ActualSpeed=pid.voltage*1.0;        //算出實(shí)際值
    return pid.ActualSpeed;                 //返回
}

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





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1