關(guān)于單片機(jī)PID的算法實(shí)現(xiàn)
//================================================================
// pid.H
// Operation about PID algorithm procedure
// C51編譯器 Keil 7.08
//================================================================
// 作者:zhoufeng
// Date :2007-08-06
// All rights reserved.
//================================================================
#include
#include
typedef
typedef
typedef
//
void
void
//================================================================
typedef struct PIDValue
{
uint32
uint8
uint8
uint8
uint8
uint16
uint16
uint16
}PIDValueStr;
PIDValueStr PID;
uint8
uint8
//================================================================
PID = Uk + KP*[E(k)-E(k-1)]+KI*E(k)+KD*[E(k)-2E(k-1)+E(k-2)];(增量型PID算式)
函數(shù)入口: RK(設(shè)定值),CK(實(shí)際值),KP,KI,KD
函數(shù)出口: U(K)
//PID運(yùn)算函數(shù)
//================================================================
void
{
uint32
uint32
uint32
Temp[0] = 0;
Temp[1] = 0;
Temp[2] = 0;
PostSum = 0;
NegSum = 0;
if( PID.RK_Uint16 > PID.CK_Uint16 )
{
if( PID.RK_Uint16 - PID.CK_Uint16 >10 )
{
else
{
//================================================================
Temp[0]=PID.Ek_Uint32[0] - PID.Ek_Uint32[1];
{
Temp[0]=PID.Ek_Uint32[0] - PID.Ek_Uint32[1];
//================================================================
if( (PID.Ek_Uint32[0]+ PID.Ek_Uint32[2])>Temp[2] )
Temp[2]=(PID.Ek_Uint32[0]+ PID.Ek_Uint32[2])-Temp[2];
{
Temp[2]=Temp[2]-(PID.Ek_Uint32[0]+ PID.Ek_Uint32[2]); //E(k-2)+E(k)<2E(k-1)
//================================================================
//以下部分代碼是講所有的正數(shù)項(xiàng)疊加,負(fù)數(shù)項(xiàng)疊加
//KP*[E(k)-E(k-1)]
if(PID.EkFlag_Uint8[0]==0)
PostSum += Temp[0];
else
NegSum += Temp[0];
// KI*E(k)
if(PID.EkFlag_Uint8[1]==0)
PostSum += Temp[1];
else
//KD*[E(k-2)+E(k)-2E(k-1)]
if(PID.EkFlag_Uint8[2]==0)
PostSum += Temp[2];
else
NegSum += Temp[2];
//U(K)
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
}
}
else
{ PID.Uk_Uint16 = 0; }
}
//================================================================
函數(shù)入口: U(K)
函數(shù)出口: out(加熱輸出)
//PID運(yùn)算植輸出函數(shù)
//================================================================
void
{
static int 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等份)
{
count=0;
i--;
}
}
評(píng)論