用于单片机的PID调节子程序,经过多次改进,非常实用简单,已经用于多个产品上,非常稳定可靠
PID_of_C8051_or_MSP430.rar PID1.cwww.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);
}
//****************************************************************************
//文件名: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);
}
评论0