自己写的一份pidC语言仿真,嘻嘻,系数不是调得很稳定啊,仅供参考。
其实我的用意是想试一下哪个比较好,第一是误差项从开始就累加,第二是只取先前几个时间点的误差项累加,
大家可以参考体验一下。
#include "stdio.h"
#define eroorr_num 6//误差项个数
float now;//全局变量现在值
float set;//预设值
float eroorrs[eroorr_num];//误差数组
//PID结构体
typedef struct pid_struct{
float kp;
float ki;
float kd;
}PID_str;
void delay(int ms)//这个只是让控制台输出慢一点更好看一点
{
int i;
for (ms; ms > 0; ms--)
for (i = 1100; i > 0; i--);
}
float pid(float set, float kp, float ki, float kd)
{
float out;
float error;
float errors=0;
int i = 0;
error = set - now;
i = eroorr_num - 1;
do
{
eroorrs[i] = eroorrs[i - 1];//把先前的误差项挤出队列中
i--;
if (i == 0)//填补上当前误差
{
eroorrs[0] = error;
}
} while (i != 0);
for (i = 0; i < eroorr_num; i++)
{
errors += eroorrs[i];
}
out = kp * error + ki * errors + kd * (eroorrs[0] - eroorrs[1]);
now += out;
return now;
}
int main()
{
float ut;
int i;
PID_str pid_str;
/*设置pid系数*/
pid_str.kd = (float)1.42;
pid_str.ki = (float)0.2;
pid_str.kp = (float)0.1;
now = 1;//假设now=1,不过分吧
for (i = 0; i < eroorr_num; i++)//初始化误差数组
eroorrs[i] = 0;
while(1)
{
ut = pid(1400, pid_str.kd, pid_str.ki, pid_str.kp);
for (i = 0; i < eroorr_num; i++)
printf("%f\t", eroorrs[i]);//输出误差数组
printf("\n%f\n\n", ut);
delay(500000);
}
return 0;
}