单片机PID程序源代码
时间:01-22 11:13 阅读:2264次
*温馨提示:点击图片可以放大观看高清大图
简介:本文给大家分享了一个单片机PID程序源代码。
typedef struct DeltPID
{
char PIDTemp;//pid开关温差
char P;
char I;
char D;
char PIDKc;//维持功率
}data DELTPID;
int data PID_Buff[3];//温度缓冲区-参与PID运算
int data PID_Value;//输出控制量
DELTPID PID=
{
50,
50,
50,
50,
50
}; //增量pid结构体
DELTPID E_PID;
unsigned char data HeatCount = 0;
void PID_Out()
{
if (HeatCount>0)
{
HeatCount--;
HEAT_START;//开始加热
}
else
{
HEAT_STOP;//停止加热
}
}
int data PID_Buff[3];//温度缓冲区-参与PID运算
DELTPID PID=
{
50,
50,
50,
50,
50
}; //增量pid结构体
DELTPID E_PID;
#define MAX_DELT 15//最大增量
void PID_Ctrl()
{
static int ei;//当前偏差
int last_ei;//
int delt_ei;//偏差变化量
//刷新最近两次偏差
unsigned char i_sign;//是否取消积分作用
unsigned char c_sign;//是否取消维持功率
int delt_value;//增量pid输出值
last_ei = ei;
ei = TempSet - PID_Buff[0];
delt_ei = ei - last_ei;//求出偏差变化量
if (ei > PID.PIDTemp)//当前温差大于设定温差
{
PID_Value = 150;//全功率输出
return;
}
else if (ei < -5)//超调
{
PID_Value = 0;//停止输出
return;
}
//增量pid控制
if (((ei>0) && (delt_ei<0)) || ((ei<0) && (delt_ei>0)))
{
i_sign = 0;//专家pid测量值正向目标值靠近,取消积分作用
}
else
{
i_sign = 1;
}
if ((ei<0) && (delt_ei>0))
{
c_sign = 1;//温度正在从高温向目标值靠近
}
else
{
c_sign = 0;
}
delt_value = (float)PID.P/17*delt_ei + (float)PID.I/100*ei*i_sign-
(float)PID.D/200*(PID_Buff[0]-2*PID_Buff[1]+PID_Buff[2]) + (float)PID.PIDKc/1000*TempSet*c_sign;
if (delt_value>MAX_DELT)
{
delt_value = MAX_DELT;
}
else if (delt_value<(-MAX_DELT))
{
delt_value = -MAX_DELT;
}
PID_Value+=delt_value;
if (PID_Value<0)
{
PID_Value = 0;
}
else if (PID_Value>150)
{
PID_Value = 150;
}
}