#include "stdio.h"
int dat;
int goal=180; //设定值
int now; //现在值
int gap[3]; //缓存,最少3个成员
int Pid(unsigned char P, unsigned char I, unsigned char D, int goal, int now, int *gap) //P/I/D系数,目标值,现在值,缓存
{
gap[2]=gap[1];
gap[1]=gap[0];
gap[0]=goal-now; //负反馈式PID
//gap[0]=now-goal; //正反馈式PID。这2条语句请2选1
return (P*(gap[0]-gap[1])+I*gap[0]+D*(gap[0]-gap[1]-gap[1]+gap[2])); //PID计算公式
}
int main() //以下的是测试代码
{
while(1) //使用PID计算,请注意要定时定点的采集测量数据才有效
{
printf("请输入当前温度\n"); //提示字符
scanf("%3d[0-9]",&now); //从键盘获取最多3个0-9的字符,然后转化为十进制,再赋值给变量
scanf("%*[^\n]%*c"); //清空输入缓存,等同于非标准的fflush(stdin)
dat=Pid(9,8,7,goal,now,gap); //PID计算
printf("当前的温度=%d,PID计算结果=%d,",now,dat); //输出原始值
if(dat<0) dat=0; if(dat>255) dat=255; //计算结果限幅
printf("PWM占空比=%d/255\n\n",dat); //输出PWM调整参数
}
}
/*
调试结果:
请输入当前温度
150
当前的温度=150,PID计算结果=720,PWM占空比=255/255
请输入当前温度
175
当前的温度=175,PID计算结果=-570,PWM占空比=0/255
请输入当前温度
176
当前的温度=176,PID计算结果=191,PWM占空比=191/255
请输入当前温度
ADCD
当前的温度=176,PID计算结果=39,PWM占空比=39/255
请输入当前温度
18234
当前的温度=182,PID计算结果=-112,PWM占空比=0/255
*/
|