微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机PID程序

单片机PID程序

时间:11-24 来源:互联网 点击:
刚刚做的一个恒温箱,采用PID算法,3秒一个输出周期,输出量为0-150,各参数量化到0-99,便于用户修改,为抵消散热,加入维持功率系数,程序如下(温度放大了10倍)

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;

}

}


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top