发一个C51 PID程序,带很详细的解释

2020-03-06 19:41发布

本帖最后由 ninghong12322 于 2016-11-30 09:54 编辑

发一个C51 PID程序,带很详细的解释
c51PID.rar (1.97 KB, 下载次数: 384) 2016-11-30 09:53 上传 点击文件名下载附件



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
14条回答
xxdcq
2020-03-08 07:11
错误的程序完全是误人子弟!
程序里有两处明显错误我给改一下

/* ********************************************************
/* 函数名称: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;
    }
}

一周热门 更多>