找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2576|回复: 0
收起左侧

分离积分的pid伺服控制

[复制链接]
ID:305552 发表于 2018-4-10 22:56 | 显示全部楼层 |阅读模式
#include <stdio.h>
#include <math.h>
int index;
struct _pid{
float SetSpeed;         //定义设定值
float ActualSpeed;      //定义实际值
float err;              //定义偏差值
float err_last;         //定义上一个偏差值
float Kp,Ki,Kd;         //定义比例、积分、微分系数
float voltage;          //定义电压值(控制执行器的变量)
float integral;         //定义积分值
}pid;

//项目中获取到的参数
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.04;           //自己设定
    pid.Kd=0.2;             //自己设定
    printf("PID_init end \n");
}

float PID_realize(float speed){
    pid.SetSpeed=speed;                     //设定值
    pid.err=pid.SetSpeed-pid.ActualSpeed;   //设定值-实际值
    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;                   //上一个偏差值
    pid.ActualSpeed=pid.voltage*1.0;        //算出实际值
    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;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表