发一个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 上传 点击文件名下载附件



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
wwd8888
1楼-- · 2020-03-07 14:45
支持一下是必须的
wqg137476
2楼-- · 2020-03-07 17:46
 精彩回答 2  元偷偷看……
mjs0528
3楼-- · 2020-03-07 20:41
感谢分享,不错,下来看看
tanghaideng10
4楼-- · 2020-03-07 20:44
下载下来,学习学习。
wcx04009102
5楼-- · 2020-03-08 02:19
支持一下是必须的
xxdcq
6楼-- · 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;
    }
}

一周热门 更多>