错误的程序完全是误人子弟!
程序里有两处明显错误我给改一下
/* ********************************************************
/* 函数名称:PID_Output()
/* 函数功能:PID输出控制
/* 入口参数:无(隐形输入,U(k))
/* 出口参数:无(控制端)
******************************************************** */
void PID_Output(void)
{
static uInt16 iTemp;
static uChar8 uCounter;
iTemp = PID.iPriVal;
if(iTemp == 0)
ConOut = 1; //不加热
else ConOut = 0; //加热
if(g_bPIDRunFlag) //定时中断为100ms(0.1S),加热周期10S(100份*0.1S)
{
g_bPIDRunFlag = 0;
if(iTemp) iTemp--; //只有iTemp>0,才有必要减“1”
uCounter++;
if(100 == uCounter)
{
PID_Operation(); //每过0.1*100S调用一次PID运算。
uCounter = 0;
}
}
}
改成
/* ********************************************************
/* 函数名称:PID_Output()
/* 函数功能:PID输出控制
/* 入口参数:无(隐形输入,U(k))
/* 出口参数:无(控制端)
******************************************************** */
void PID_Output(void)
{
static uInt16 iTemp;
static uChar8 uCounter;
if(iTemp == 0)
ConOut = 1; //不加热
else ConOut = 0; //加热
if(g_bPIDRunFlag) //定时中断为100ms(0.1S),加热周期10S(100份*0.1S)
{
g_bPIDRunFlag = 0;
if(iTemp) iTemp--; //只有iTemp>0,才有必要减“1”
uCounter++;
if(100 == uCounter)
{
PID_Operation(); //每过0.1*100S调用一次PID运算。
iTemp = PID.iPriVal;
uCounter = 0;
}
}
}
void Timer0_ISR(void) interrupt 1
{
static uInt16 uiCounter = 0;
TH0 = 0xDC;
TL0 = 0x00;
uiCounter++;
if(100 == uiCounter)
{
g_bPIDRunFlag = 1;
}
}
改成
void Timer0_ISR(void) interrupt 1
{
static uInt16 uiCounter = 0;
TH0 = 0xDC; //晶振频率11.0592M 定时中断10ms
TL0 = 0x00;
uiCounter++;
if(10 == uiCounter)
{
g_bPIDRunFlag = 1;
uiCounter = 0;
}
}
|