<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è) > 嵌入式系統 > 設計應用 > 51單片機實(shí)現PID算法(溫度控制)

51單片機實(shí)現PID算法(溫度控制)

作者: 時(shí)間:2016-11-26 來(lái)源:網(wǎng)絡(luò ) 收藏
用整型變量來(lái)實(shí)現PID算法,由于是用整型數來(lái)做的,所以也不是很精確,但是對于很多的使用場(chǎng)合,這個(gè)精度也夠了,關(guān)于系數和采樣電壓全部是放大10倍處理的.所以精度不是很高. 但是也不是那么低,大部分的場(chǎng)合都夠了. 實(shí)在覺(jué)得精度不夠, 可以再放大10倍或者100倍處理,但是要注意不超出整個(gè)數據類(lèi)型的范圍就可以了.本程序包括PID計算和輸出兩部分.當偏差>10度全速加熱,偏差在10度以?xún)葹镻ID計算輸出.具體的參考代碼參見(jiàn)下面:*/

//================================================================
// pid.H
// Operation about PID algorithm procedure
// C51編譯器Keil 7.08
//================================================================
// 作者:zhoufeng
// Date :2007-08-06
// All rights reserved.
//================================================================

本文引用地址:http://dyxdggzs.com/article/201611/321816.htm

#include
#include
typedefunsignedcharuint8;
typedefunsignedintuint16;
typedefunsignedlong intuint32;

voidPIDOutput ();
voidPIDOperation ();

typedef struct PIDValue
{
uint32Ek_Uint32[3];//差值保存,給定和反饋的差值
uint8EkFlag_Uint8[3];//符號,1則對應的為負數,0為對應的為正數
uint8KP_Uint8;
uint8KI_Uint8;
uint8KD_Uint8;
uint16Uk_Uint16;//上一時(shí)刻的控制電壓
uint16RK_Uint16;//設定值
uint16CK_Uint16;//實(shí)際值
}PIDValueStr;
PIDValueStrPID;
uint8out ;// 加熱輸出
uint8count;// 輸出時(shí)間單位計數器

voidPIDOperation (void)
{
uint32Temp[3];//中間臨時(shí)變量
uint32PostSum;//正數和
uint32NegSum;//負數和
Temp[0] = 0;
Temp[1] = 0;
Temp[2] = 0;
PostSum = 0;
NegSum= 0;
if( PID.RK_Uint16 > PID.CK_Uint16 )//設定值大于實(shí)際值否?
{
if( PID.RK_Uint16 - PID.CK_Uint16 >10 )//偏差大于10否?
{
PID.Uk_Uint16 = 100;}//偏差大于10為上限幅值輸出(全速加熱)
else
{
Temp[0] = PID.RK_Uint16 - PID.CK_Uint16;//偏差<=10,計算E(k)
PID.EkFlag_Uint8[1]=0;//E(k)為正數
//數值移位
PID.Ek_Uint32[2] = PID.Ek_Uint32[1];
PID.Ek_Uint32[1] = PID.Ek_Uint32[0];
PID.Ek_Uint32[0] = Temp[0];

if( PID.Ek_Uint32[0] >PID.Ek_Uint32[1] )//E(k)>E(k-1)否?
{
Temp[0]=PID.Ek_Uint32[0] - PID.Ek_Uint32[1];//E(k)>E(k-1)
PID.EkFlag_Uint8[0]=0;}//E(k)-E(k-1)為正數
else
{
Temp[0]=PID.Ek_Uint32[0] - PID.Ek_Uint32[1];//E(k)PID.EkFlag_Uint8[0]=1;}//E(k)-E(k-1)為負數

Temp[2]=PID.Ek_Uint32[1]*2 ;// 2E(k-1)
if( (PID.Ek_Uint32[0] PID.Ek_Uint32[2])>Temp[2] )//E(k-2) E(k)>2E(k-1)否?
{
Temp[2]=(PID.Ek_Uint32[0] PID.Ek_Uint32[2])-Temp[2];//E(k-2) E(k)>2E(k-1)
PID.EkFlag_Uint8[2]=0;}//E(k-2) E(k)-2E(k-1)為正數
else
{
Temp[2]=Temp[2]-(PID.Ek_Uint32[0] PID.Ek_Uint32[2]);//E(k-2) E(k)<2E(k-1)
PID.EkFlag_Uint8[2]=1;}//E(k-2) E(k)-2E(k-1)為負數

Temp[0] = (uint32)PID.KP_Uint8 * Temp[0];// KP*[E(k)-E(k-1)]
Temp[1] = (uint32)PID.KI_Uint8 * PID.Ek_Uint32[0];// KI*E(k)
Temp[2] = (uint32)PID.KD_Uint8 * Temp[2];// KD*[E(k-2) E(k)-2E(k-1)]



if(PID.EkFlag_Uint8[0]==0)
PostSum = Temp[0];//正數和
else
NegSum = Temp[0];//負數和

if(PID.EkFlag_Uint8[1]==0)
PostSum = Temp[1];//正數和
else
;//空操作,E(K)>0

if(PID.EkFlag_Uint8[2]==0)
PostSum = Temp[2];//正數和
else
NegSum = Temp[2];//負數和

PostSum = (uint32)PID.Uk_Uint16;

if(PostSum > NegSum )// 是否控制量為正數
{ Temp[0] = PostSum - NegSum;
if( Temp[0] < 100 )//小于上限幅值則為計算值輸出
PID.Uk_Uint16 = (uint16)Temp[0];
else
PID.Uk_Uint16 = 100;//否則為上限幅值輸出
}
else//控制量輸出為負數,則輸出0(下限幅值輸出)
PID.Uk_Uint16 = 0;
}
}
else
{ PID.Uk_Uint16 = 0;}

}


voidPIDOutput (void)
{
staticint i;
i=PID.Uk_Uint16;
if(i==0)
out=1;
else out=0;
if((count )==5)//如定時(shí)中斷為40MS,40MS*5=0.2S(輸出時(shí)間單位),加熱周期20S(100等份)
{//每20S PID運算一次
count=0;
i--;
}
}



關(guān)鍵詞: 51單片機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>