// 积分分离数字PID
#include<stdio.h>
struct pid
{
float Setspeed;
float Actualspeed;
float Err;
float Err_last;
float Kp,Ki,Kd;
float Voltage;
float Integral;
} pid;
void PID_Init(void);
float PID_Cal(float Speed);
int main()
{
struct pid;
int count=0;
printf("SYSTEM BEGIN!\n");
PID_Init();
while(count<200)
{
float speed=PID_Cal(200.0);
printf("-%d %f\n",count,speed);
count++;
}
return 0;
}
float PID_Cal(float Speed)
{
unsigned char index;
pid.Setspeed = Speed;
pid.Err = pid.Setspeed-pid.Actualspeed;
pid.Setspeed = Speed;
pid.Err = pid.Setspeed - pid.Actualspeed;
if(abs(pid.Err) >=100) //取绝对值
{
index = 0;
}
else
{
index =1;
pid.Integral += pid.Err;
}
pid.Voltage =pid.Kp*pid.Err+index*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;
}
void PID_Init(void)
{
printf("PID_Init begin!\n");
pid.Setspeed= 0;
pid.Actualspeed= 0;
pid.Err= 0;
pid.Err_last= 0;
pid.Kp= 0.2;
pid.Ki= 0.15;
pid.Kd= 0.2;
pid.Voltage= 0;
pid.Integral= 0;
printf("PID_Init end!\n");
}
积分分离数字PID控制器C语言
最新推荐文章于 2022-11-21 08:40:44 发布