原创 PID程序参考

2008-10-26 16:47 2713 7 8 分类: MCU/ 嵌入式
#include <REG52.H>
#include <MATH.H>
/*******************************************************************************/
int idata p,ti,td,t,gd; 
/*p--比例度, ti--积分时间, td--微分时间,t--采样时间,gd--给定值*/
/*时间的单位均为0.1S*/
int idata cel,cel1,shchshx,shchxx,u0;
/*clshx--满度对应的上限值,clxx--满度对应的下限值*/
/*cel--用clshx,clxx,jzhshx,jzhxx校准后的测量值,用来计算偏差*/
/*shchshx--D/A输出对应5V时的数字量,shchxx--D/A输出对应1V时的数字量*/
/*u0--输出的位置信号*/
int idata jzhshx,jzhxx,celiang;
/*jzhshx--输入5V对应的A/D数字量,jzhxx--jzhshx--输入5V对应的A/D数字量*/
/*celiang--实际测量的A/D值 */
int idata de,de1;        /*本次偏差(测量值-给定值)和上次偏差*/
int idata df1;            /*pid运算中要保留的中间量*/
bit zdbit,dshbit,zhfzy;       
/*zdbit--手动自动切换标志,dshbit--等分采样时间到标志*/
/*******************************************************************************/
void d_a(unsigned int x)
{
}
/*******************************************************************************/
void pid()
{
int de2,dpv;
float tdf,tf,tif,uf;
if(dshbit==1)
             {
        dshbit=0;
  de2=de1;
         de1=de;
                de="cel-gd";
                dpv="cel-cel1";
  cel1=cel;
     if(zdbit==1)
                {
                tf="t";
                tdf="td";
                tif="ti";
                uf="tdf"*(de+de2-2*de1)/(tdf+10*tf)+tf*df1/(10*(tf+tdf));
                df1=uf;
                uf="uf"+dpv+tf*de/tif;
                uf="uf"*1000;
                uf="uf/p";
                uf="uf/1000";
                uf="uf"*(shchshx-shchxx);
 if(zhfzy==0)
              {
                   u0=u0+uf;
                   }
 if(zhfzy==1)
     {
                   u0=u0-uf;
                   }
                 }
                 if(u0>shchshx+0.05*(shchshx-shchxx)){u0=shchshx+0.05*(shchshx-shchxx);}
                 if(u0<shchxx-0.05*(shchshx-shchxx)){u0=shchxx-0.05*(shchshx-shchxx);}
  d_a(u0);
   }
}
/*******************************************************************************/
void shjchl()
{
float x;
x=celiang-jzhxx;
x=x/(jzhshx-jzhxx);
cel=1000*x;
}
/*******************************************************************************/
void timer0(void) interrupt 1
{
   TH0=-(2252/256);
  TL0=-(2252%256);
}
/*=============================================================================*/
void main()
{
        TMOD="0x11";
   TH0 =-(2240/256);
  TL0 =-(2240%256);
        ET0 =1;
        TR0=1;
        EA="1";
        p="1000";
        ti="600";
        td="0";
        t="10";
        gd="500";
        celiang="2400";
        jzhshx="4000";
        jzhxx="1000";
        shchshx="4000";
        shchxx="800";
        u0=2400;
        df1=0;
        zhfzy="0";
        cel1=466;
        zdbit="1";
        dshbit="1";
        while(1)
                {
                dshbit="1";
                shjchl();
                pid();
                }
}

文章评论1条评论)

登录后参与讨论

用户175098 2009-4-9 17:06

你好,如果是采用继电器输出要采用哪种? PID计算出来的值要怎样控制继电器。麻烦解答一下。谢谢
相关推荐阅读
burkett2011_327610014 2010-11-21 15:19
RT-Thread 国产嵌入式操作系统
RT-Thread是一国内开源的实时嵌入式操作系统,所有代码遵循GNU GPLv2许可证发布。首先RT-Thread是一个实时操作系统核心,完全符合实时系统的特征,做到了硬实时的要求。这个核心同时也是...
burkett2011_327610014 2010-08-12 19:46
EDN换礼,圈圈的书和学习套件已经收到,支持EDN
圈圈的书和学习套件已经收到,EDN速度真快,谢谢EDN,谢谢huangna!...
burkett2011_327610014 2009-11-15 20:15
一名25岁的董事长给大学生的忠告
一、读大学,究竟读什么?   大学生和非大学生最主要的区别绝对不在于是否掌握了一门专业技能……一个经过独立思考而坚持错误观点的人比一个不假思索而接受正确观点的人更值得肯定……草木可以在校园年复一年地生...
burkett2011_327610014 2009-11-15 20:13
电子信息专业学生,出来之后要干什么呢?
如果从工程师和研究生的专业方向来看,电子信息专业的方向大概有1)数字电子线路方向。从事单片机(8位的8051系列、32位的ARM系列等等)、FPGA(CPLD)、数字逻辑电路、微机接口(串口、并口、U...
burkett2011_327610014 2009-11-08 11:26
ARM微处理器运行模式
  ARM微处理器支持7种运行模式,分别为:        用户模式(usr):ARM处理器正常的程序执行状态;        快速中断模式(fiq):用于高速数据传输或通道管理;        外部...
burkett2011_327610014 2009-11-07 22:15
可以让你少奋斗10年的工作经验
 0推荐第一:不要认为停留在心灵的舒适区域内是可以原谅的。      每个人都有一个舒适区域,在这个区域内是很自我的,不愿意被打扰,不愿意被push,不愿意和陌生的面孔交谈,不愿意被人指责,不愿意按照...
我要评论
1
7
关闭 站长推荐上一条 /2 下一条