打印
[51单片机]

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

[复制链接]
3182|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ninghong12322|  楼主 | 2016-11-30 09:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ninghong12322 于 2016-11-30 09:54 编辑

发一个C51 PID程序,带很详细的解释
c51PID.rar (1.97 KB)



相关帖子

沙发
lihui567| | 2016-11-30 22:40 | 只看该作者
下载看一下

使用特权

评论回复
板凳
yinshaojie| | 2016-12-1 09:46 | 只看该作者
看一下

使用特权

评论回复
地板
sopc12| | 2017-10-24 14:18 | 只看该作者
看看,谢谢

使用特权

评论回复
5
renxiaolin| | 2017-10-25 14:30 | 只看该作者
支持

使用特权

评论回复
6
wofei1314| | 2019-1-22 10:18 | 只看该作者
谢谢分享~

使用特权

评论回复
7
zxy2266| | 2019-9-24 21:08 | 只看该作者
看一下谢谢

使用特权

评论回复
8
wwd8888| | 2019-9-25 19:19 | 只看该作者
支持一下是必须的

使用特权

评论回复
9
wqg137476| | 2019-9-30 08:39 | 只看该作者
感谢分享

使用特权

评论回复
10
mjs0528| | 2019-10-6 16:16 | 只看该作者
感谢分享,不错,下来看看

使用特权

评论回复
11
tanghaideng10| | 2019-10-15 14:08 | 只看该作者
下载下来,学习学习。

使用特权

评论回复
12
wcx04009102| | 2020-2-19 14:59 | 只看该作者
支持一下是必须的

使用特权

评论回复
13
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;
    }
}

使用特权

评论回复
14
白工| | 2020-2-23 17:16 | 只看该作者
支持一下是必须的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

1

粉丝