转自 http://blog.163.com/djl_310/blog/static/8668667200872804916176/ 用整型变量来实现PID算法,由于是用整型数来做的,所以也不是很精确,但是对于很多的使用场合,这个精度也够了,关于系数和采样电压全部是放大10倍处理的.所以精度不是很高. 但是也不是那么低,大部分的场合都够了. 实在觉得精度不够, 可以再放大10倍或者100倍处理,但是要注意不超出整个数据类型的范围就可以了.本程序包括PID计算和输出两部分.当偏差>10度全速加热,偏差在10度以内为PID计算输出. 具体的参考代码参见下面: //================================================================ // pid.H // Operation about PID algorithm procedure // C51编译器 Keil 7.08 //================================================================ // 作者:zhoufeng // Date :2007-08-06 // All rights reserved. //================================================================ #include <reg52.h> #include <intrins.h> typedef unsigned char uint8; typedef unsigned int uint16; typedef unsigned long int uint32; // 函数声明 void PIDOutput (); void PIDOperation (); //================================================================ typedef struct PIDValue { uint32 Ek_Uint32[3]; //差值保存,给定和反馈的差值 uint8 EkFlag_Uint8[3]; //符号,1则对应的为负数,0为对应的为正数 uint8 KP_Uint8; uint8 KI_Uint8; uint8 KD_Uint8; uint16 Uk_Uint16; //上一时刻的控制电压 uint16 RK_Uint16; //设定值 uint16 CK_Uint16; //实际值 }PIDValueStr; PIDValueStr PID; uint8 out ; // 加热输出 uint8 count; // 输出时间单位计数器 //================================================================ PID = Uk + KP*[E(k)-E(k-1)]+KI*E(k)+KD*[E(k)-2E(k-1)+E(k-2)];(增量型PID算式) 函数入口: RK(设定值),CK(实际值),KP,KI,KD 函数出口: U(K) //PID运算函数 //================================================================ void PIDOperation (void) { uint32 Temp[3]; //中间临时变量 uint32 PostSum; |