[51单片机] 发一个C51 PID程序,带很详细的解释

[复制链接]
3934|13
 楼主| ninghong12322 发表于 2016-11-30 09:53 | 显示全部楼层 |阅读模式
本帖最后由 ninghong12322 于 2016-11-30 09:54 编辑

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




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
lihui567 发表于 2016-11-30 22:40 | 显示全部楼层
下载看一下
yinshaojie 发表于 2016-12-1 09:46 | 显示全部楼层
看一下
sopc12 发表于 2017-10-24 14:18 | 显示全部楼层
看看,谢谢
renxiaolin 发表于 2017-10-25 14:30 | 显示全部楼层
wofei1314 发表于 2019-1-22 10:18 | 显示全部楼层
谢谢分享~
zxy2266 发表于 2019-9-24 21:08 | 显示全部楼层
看一下谢谢
wwd8888 发表于 2019-9-25 19:19 | 显示全部楼层
支持一下是必须的
wqg137476 发表于 2019-9-30 08:39 | 显示全部楼层
感谢分享
mjs0528 发表于 2019-10-6 16:16 | 显示全部楼层
感谢分享,不错,下来看看
tanghaideng10 发表于 2019-10-15 14:08 | 显示全部楼层
下载下来,学习学习。
wcx04009102 发表于 2020-2-19 14:59 | 显示全部楼层
支持一下是必须的
xxdcq 发表于 2020-2-20 22:44 | 显示全部楼层
错误的程序完全是误人子弟!
程序里有两处明显错误我给改一下

/* ********************************************************
/* 函数名称: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;
    }
}
白工 发表于 2020-2-23 17:16 | 显示全部楼层
支持一下是必须的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部