<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 單片機PID程序

單片機PID程序

作者: 時(shí)間:2016-11-24 來(lái)源:網(wǎng)絡(luò ) 收藏
剛剛做的一個(gè)恒溫箱,采用PID算法,3秒一個(gè)輸出周期,輸出量為0-150,各參數量化到0-99,便于用戶(hù)修改,為抵消散熱,加入維持功率系數,程序如下(溫度放大了10倍)
typedef struct DeltPID
{
char PIDTemp;//pid開(kāi)關(guān)溫差
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;//開(kāi)始加熱
}
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;//專(zhuān)家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;
}
}



關(guān)鍵詞: 單片機PID程

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>