- #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
- */
|