#include <reg52.h>
typedef
unsigned
char
uChar8;
typedef
unsigned
int
uInt16;
typedef
unsigned
long
int
uInt32;
sbit ConOut = P1^1;
typedef
struct
PID_Value
{
uInt32 liEkVal[3];
uChar8 uEkFlag[3];
uChar8 uKP_Coe;
uChar8 uKI_Coe;
uChar8 uKD_Coe;
uInt16 iPriVal;
uInt16 iSetVal;
uInt16 iCurVal;
}PID_ValueStr;
PID_ValueStr PID;
bit g_bPIDRunFlag = 0;
void
PID_Operation(
void
)
{
uInt32 Temp[3] = {0};
uInt32 PostSum = 0;
uInt32 NegSum = 0;
if
(PID.iSetVal > PID.iCurVal)
{
if
(PID.iSetVal - PID.iCurVal > 10)
PID.iPriVal = 100;
else
{
Temp[0] = PID.iSetVal - PID.iCurVal;
PID.uEkFlag[1] = 0;
PID.liEkVal[2] = PID.liEkVal[1];
PID.liEkVal[1] = PID.liEkVal[0];
PID.liEkVal[0] = Temp[0];
if
(PID.liEkVal[0] > PID.liEkVal[1])
{
Temp[0] = PID.liEkVal[0] - PID.liEkVal[1];
PID.uEkFlag[0] = 0;
}
else
{
Temp[0] = PID.liEkVal[1] - PID.liEkVal[0];
PID.uEkFlag[0] = 1;
}
Temp[2] = PID.liEkVal[1] * 2;
if
((PID.liEkVal[0] + PID.liEkVal[2]) > Temp[2])
{
Temp[2] = (PID.liEkVal[0] + PID.liEkVal[2]) - Temp[2];
PID.uEkFlag[2]=0;
}
else
{
Temp[2] = Temp[2] - (PID.liEkVal[0] + PID.liEkVal[2]);
PID.uEkFlag[2] = 1;
}
Temp[0] = (uInt32)PID.uKP_Coe * Temp[0];
Temp[1] = (uInt32)PID.uKI_Coe * PID.liEkVal[0];
Temp[2] = (uInt32)PID.uKD_Coe * Temp[2];
if
(PID.uEkFlag[0] == 0)
PostSum += Temp[0];
else
NegSum += Temp[0];
if
(PID.uEkFlag[1] == 0)
PostSum += Temp[1];
else
;
if
(PID.uEkFlag[2]==0)
PostSum += Temp[2];
else
NegSum += Temp[2];
PostSum += (uInt32)PID.iPriVal;
if
(PostSum > NegSum)
{
Temp[0] = PostSum - NegSum;
if
(Temp[0] < 100 )
PID.iPriVal = (uInt16)Temp[0];
else
PID.iPriVal = 100;
}
else
PID.iPriVal = 0;
}
}
else
PID.iPriVal = 0;
}
void
PID_Output(
void
)
{
static
uInt16 iTemp;
static
uChar8 uCounter;
iTemp = PID.iPriVal;
if
(iTemp == 0)
ConOut = 1;
else
ConOut = 0;
if
(g_bPIDRunFlag)
{
g_bPIDRunFlag = 0;
if
(iTemp) iTemp--;
uCounter++;
if
(100 == uCounter)
{
PID_Operation();
uCounter = 0;
}
}
}
void
Timer0Init(
void
)
{
TMOD |= 0x01;
TH0 = 0xDC;
TL0 = 0x00;
TR0 = 1;
EA = 1;
ET0 = 1;
}
void
main(
void
)
{
Timer0Init();
while
(1)
{
PID_Output();
}
}
void
Timer0_ISR(
void
) interrupt 1
{
static
uInt16 uiCounter = 0;
TH0 = 0xDC;
TL0 = 0x00;
uiCounter++;
if
(100 == uiCounter)
{
g_bPIDRunFlag = 1;
}
}