www.pudn.com > PID_of_C8051_or_MSP430.rar > PID1.c


//**************************************************************************** 
//文件名:PID.c 
//描述: 有关温度控制的子函数 
//版本:1.1 2006-10-23 
//**************************************************************************** 
 
//头文件引用区 
#include "math.h" 
//**************************************************************************** 
//模块名:PID 
//编写者:lk 
//描述:  PID调节子程序。 
//版本:  1.1 
//修改:  2006年10月24日 
//入口:  16位温度偏差 
//出口:  16位功率调节输出 
//根据实际对象需要调节的是f0Kp、f0I、f0D三个参数 
//**************************************************************************** 
int PID(int Ek0) 
  { 
    static idata float f0Ek1;                  // 上次偏差 
    static idata float f0Ek2;                  // 上上次偏差 
    static idata float f0Kp = 2800.0;          // 比例系数 
    static idata float f0I  = 0.0005;          // 积分系数 
    static idata float f0D  = 0.05;            // 微分系数 
    static idata float f0Uk;                   // 调整输出 
    static idata float f0D1Ek;                 // 偏差一阶 
    static idata float f0D2Ek;                 // 偏差二阶 
    static idata float f0DUk;                  // 输出增量 
 
    float f0Ek;                                // 当前偏差 
    float fq0; 
    unsigned int iOut; 
 
    f0Ek = Ek0/100; 
    f0D1Ek  = f0Ek-f0Ek1;                      // 计算一阶偏差         
    f0D2Ek = f0Ek-2*f0Ek1+f0Ek2;               // 计算二阶偏差 
    f0DUk  = f0D1Ek+ f0D*f0D2Ek;               // 计算增量PID输出(比例和微分) 
    if(f0Ek<=2) f0DUk += f0I*f0Ek;             // 计算增量PID输出(积分) 
    f0DUk  *= f0Kp;                            // 计算增量PID输出(比例系数) 
    f0Uk  += f0DUk;                            // 计算调整输出值(位置) 
    if(f0Uk < -10 ) f0Uk = -10; 
    f0Ek2  = f0Ek1;                            // 保存上次偏差 
    f0Ek1  = f0Ek;                             // 保存当前偏差 
    if(f0Uk>0) fq0 = sqrt(f0Uk); 
    else fq0 = 0; 
    if(fq0 > 65536 )fq0 = 65535; 
    if(fq0 >0) iOut = f0Uk; 
    else iOut = 0; 
    return(iOut); 
  }