找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 2959|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

分離積分的pid伺服控制

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:305552 發(fā)表于 2018-4-10 22:56 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#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;
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表