找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10510|回复: 19
打印 上一主题 下一主题
收起左侧

51单片机PID液位控制系统设计 程序PCB和实训报告论文都有

  [复制链接]
跳转到指定楼层
楼主
用51单片机做的PID液位控制系统 程序PCB和设计实训报告一应俱全.



51单片机PID液位控制系统设计所有文件下载(包含程序 论文 pcb文件): 液位控制.rar (453.09 KB, 下载次数: 259)



以下是单片机pid液位控制系统设计的论文预览:
桂林电子科技大学信息科技学院
《自动化仪表与过程控制》实训报告
级:自动化一班      
号:     00000000000000   
                    姓  名:00
指导教师:xxx
               2015 6 15

            实训题目:液位控制系统

1  系统设计
1.1 设计要求
1.1.1 基本原理
     水箱为双容水箱,仅使用一个作为被控对象,即单容液位控制(将水箱设为自衡系统),水箱采用水泵进行给水,水泵为12V直流电机控制,可采用PWM方式。液位传感器为压力式,输出为电压信号。设计调节器(模拟或数字式),能够根据用户设定,将水位控制在要求值(采用PID或PI规律)。

1.1.2 性能指标要求
1、设计制作硬件系统电路,标记姓名学号及制作日期;
2、实现水泵的控制、信号检测(显示)及调节器控制规律;
3、系统能够尽快的克服扰动;

1.1.3 设计方法与步骤
1、根据设计基本原理和性能指标要求选择总体方案,画出设计框图;
2、参阅相关资料,根据设计框图进行电路的设计;
3、列出元件清单;
4、画原理图,布PCB图,并制作电路板;
5、根据器件由小到大的顺序安装电路,并进行自检测试;      
6、数学建模、设计合适的控制参数;
7、调试所制作的电路;
1.2 设计思路及设计框图
1.2.1设计思路
    调节器和PWM信号产生用51单片机执行,单片机与驱动模块之间使用光电耦合器进行隔离。液位变送器根据水压不同输出模拟电流信号(0-20mA),然后经250欧电阻转成0-5V的电压信号经过ADC0809芯片转换成数字信号,再把数字信号传给单片机的P1口,用单片机进行数据处理。用两位数码管显示AD值(调试用的),经多次测量AD值所对应的液位高度,记下多组数据,再用MATLAB,Polyfit(x,y,n)
函数,拟合曲线,得到线性关系,然后再把之前显示AD值的两位数码管用来显示拟合出来的AD值所对应的液位。另外两位数码管则用来显示设定液位的高度。
水泵的驱动用达林顿三级管驱动,可以通过单片机模拟出来的PWM控制水泵的转速。

1.2.2总体设计框图


2 各个模块的程序的设计
1PID算法控制:
#include"PID.H"
/*PID参数初始化*/
voidIncPIDInit(void)
{
       //sptr->SumError = 0;
       sptr->LastError = 0; //Error[-1]
       sptr->PrevError = 0; //Error[-2]
       sptr->Proportion = 100; //比例常数Proportional Const
       sptr->Integral = 1;//积分常数Integral Const
       sptr->Derivative = 1; //微分常数Derivative Const
      
}
/*增量式 PID 计算部分*/
intIncPIDCalc(int NextPoint)
{
       register int iError,iIncpid; //当前误差
       iError = sptr->SetPoint - NextPoint;//增量计算
       iIncpid = sptr->Proportion *iError//E[k]
       -sptr->Integral*sptr->LastError//E[k1]
       + sptr->Derivative *sptr->PrevError; //E[k2]
       //存储误差,用于下次计算
       sptr->PrevError = sptr->LastError;
       sptr->LastError = iError;
       //返回增量值
       return(iIncpid);
}
2、ADC0809模数转换:
voidInitAdc(void)  //ADC初始化
{
       ST=0;
       OE=0;
       ST=1;
       ST=0;
}
voidAdcObtainData(void) //ADC或出数据
{
       while(EOC==0);
       OE=1;
       getdata=P1;
       YEWEI=5*(getdata-50);
       SHI=YEWEI>>4;
       GE=YEWEI&0X0F;            
       OE=0;
      DelayMs(200);                    //延时防止采集频率过快
}
3、数码管显示模块:
voidTimer1Interrupt(void) interrupt 3
{
    TH1 = 0x0EC;
    TL1 = 0x78;
       switch(c)
       {
              case0:P2=0X8f;P0=dofly_DuanMa[0];break;//显示2位液位值break;
             case1:P2=0X4f;P0=dofly_DuanMa[YEWEI/100];break;
              case2:P2=0X2f;P0=dofly_DuanMa[YEWEI%100/10];break;//显示2位数液位break;
             case3:P2=0X1f;P0=dofly_DuanMa[YEWEI%10];break;
      }
       c++;
       if(c==4){c=0;}
       d++;
       if(d==400){d=0;}
}
4、按键控制模块:
voidSheZhi(void)//按键设置液位高度
{
       if(KeyPlus==0)        //液位增加按键
       {
              DelayMs(100);//防止按键抖动
              while(!KeyPlus);
              KZ++;     
       }
       if(KeyMinus==0)     //液位降低按键
       {
              DelayMs(100);//防止按键抖动
              while(!KeyMinus);
              KZ--;
       }            
}
5PWM电机控制模块:
voidjishi(void) interrupt 1 using 1   //定时器中断0输出PWM
{
    TH0 = (65536-50)/256;       //求模     0.05ms
    TL0 = (65536-50)%256;            //求余
       /*用来电机调速*/  
       speed_L++;
       if(speed_L < PWM_L)                //调速给出高电平占空比
       {
              ENA= 0;      
       }
       else if(speed_L > PWM_L)   //调速给出低电平占空比
       {     
              ENA= 1;              
       }
       if(speed_L == 256)           //1S周期至256时清零
    {
              speed_L= 0;
              ENA= 0;      
       }
       CLK=~CLK;
}
3 制作与调试过程
   ①制作:本次实训在制作电路板的过程中,根据所查找的资料提供的原理图进行修改,从原理图中减去了很多的元件。然后用AD软件画出原理图,接着转为PCB,手动布线,并将PCB转印在板子上,腐蚀、打孔后,完成实训电路板。
     ②调试:当电路板制作完成后,需要调试电路板能否完成实训要求的功能,在调试的过程中我发现了数码管是共阳的,随后在P2口焊上1K上拉电阻,本次实训没有用到三极管导致数码管不够亮,但是并不影响参数整定,而且晶振也换为12兆。
4功能测试
4.1测试仪器和设备
万用表、传感器设备、双容水箱
4.2性能指标测试
①实现液位标定(误差%5)
②完成参数的整定
5.硬件工作模块


51最小系统
  最小系统是指是指用最少的元件组成的单片机可以工作的系统,它包括单片机、复位电路和时钟电路。
  复位电路:单片机第9脚为复位信号引脚(RST),复位信号高电平有效,但高电平维持时间必须维持在24个振荡周期以上才能完成复位。系统使用12MHZ晶振则复位需要两个机器周期。通电瞬间RC电路充电,RST引脚得到了一定脉宽的信号,只要信号脉宽维持在复位允许时间,单片机即可复位。
  起振电路:在外部连接晶振和起振电容便可构成内部振荡电路,产生振荡时钟脉冲。
  单片机:AT89S52,它是一种低功耗、高性能CMOS8位微控制器,具有8K系统可编程Flash储存器。
  

A/D转换
  ADC0809是一款8通道复用的8位AD转换器,数据获取的关键部分是它的八位8位模/数转换器。这个部分由三部分组成:266R的阶梯网络,连接逼近的电阻和比较器。ADC0809为8路模拟信号的份上采集转换器。片内有8路模拟选通开关,以及相应的通道抵制锁存用译码电路,其转换时间为100US左右。
  


电机模块
   

  • 原理图:

  • PCB图:


5.实训心得
    经过本次实训,让我对过程控制这一门课有了更深刻的了解。特别是双位控制和PID控制,不仅对理论有了跟深刻的了解,还对它们实际应用有了一定的认识。这次实训首先设计原理图和布局PCB,然后做板子。在设计原理图的时候没有注意到数码管是共阳的,也没加三极管,导致数码管很暗,后来在接数码管位选的IO口上接了一个1K的上拉电阻,有效的解决了这个问题。其中本次实训的关键在于调试,这也是最难,它不仅考验了知识,还考验了耐心。调试主要包括了测量参数,利用参数经数学计算工具拟合出曲线,还有就是不断的修改程序,首先就是调节P值,不让I作用,让水位能在设定值的附近比较稳定的上下波动,出现等幅振荡最好。最后加入I调节,调整I参数,是系统跟加好的稳定。不过本次实训中我只调了P,因为调了P水位也能比较稳定的在设定值的附近微小的波动。
附录1:原件清单
51单片机
ADC0809 数码管
达林顿三极管
四个独石电容
两个瓷片电容
多个电阻 RS232串口芯片
DB9
1K上拉电阻
若干插针
接线柱
12M晶振 三个按键  
一个极性电容
光耦
下载接口

附录2:程序清单
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uint c=0; //获取液位AD值,
  5. unsigned char code dofly_DuanMa[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
  6.                                                                         0x90,0X88,0X83,0Xc6,0Xa1,0X86,0X8e};// 显示段码值0~9
  7. /*ADC0809*/
  8. sbit EOC=P3^2; //转换结束信号
  9. sbit OE=P3^3;  //允许输出信号
  10. sbit ST=P3^4;  //转换启动信号
  11. sbit CLK=P3^5; //时钟
  12. /*按键*/
  13. sbit KeyPlus=P2^0;//按键加
  14. sbit KeyMinus=P2^1;//按键减
  15. /*驱动*/
  16. sbit ENA=P3^6;//进出水控制
  17. double KZ=100;
  18. double YEWEI; //获取液位AD对应液位值,
  19. uint rout; // PID Response (Output)
  20. uint getdata;

  21. uint PWM_L;
  22. uint speed_L = 0;


  23. void DelayUs2x(unsigned char t)
  24. {   
  25.          while(--t);
  26. }

  27. void DelayMs(unsigned char t)
  28. {
  29.      while(t--)
  30.          {
  31.              //大致延时1mS
  32.              DelayUs2x(245);
  33.                  DelayUs2x(245);
  34.          }
  35. }

  36. void InitTimer0(void)
  37. {
  38.     TMOD = 0x11;
  39.         TH0 = (65536-500)/256;           //求模        0.5ms
  40.     TL0 = (65536-500)%256;           //求余
  41.         TH1 = 0x0EC;
  42.          TL1 = 0x78;
  43.         EA = 1;
  44.     ET0 = 1;
  45.     TR0 = 1;
  46.         ET1 = 1;
  47.         TR1 = 1;
  48. }

  49. void InitAdc(void)         //ADC初始化
  50. {
  51.         ST=0;
  52.         OE=0;
  53.         ST=1;
  54.         ST=0;
  55. }

  56. void AdcObtainData(void) //ADC或出数据
  57. {
  58.         while(EOC==0);
  59.         OE=1;
  60.         getdata=P1;
  61.         if(getdata<53)
  62.         {
  63.                 getdata=53;               
  64.         }
  65.         YEWEI=(double)5*((double)(getdata)-53);//AD值是70就对应100mm的液位高度               
  66.         OE=0;
  67.          DelayMs(200);                    //延时防止采集频率过快
  68. }

  69. typedef struct PID
  70. {   
  71.         int SetPoint;//设定目标Desired Value
  72.         //long SumError; //误差累计
  73.         double Proportion; //比例常数Proportional Const
  74.         double Integral; //积分常数Integral Const
  75.         double Derivative; //微分常数Derivative Const
  76.         int LastError; //Error[-1]
  77.         int PrevError; //Error[-2]
  78. }
  79. PID;
  80. static PID sPID;
  81. static PID *sptr = &sPID;
  82. /*PID参数初始化*/
  83. void IncPIDInit(void)
  84. {
  85.         //sptr->SumError = 0;
  86.         sptr->LastError = 0; //Error[-1]
  87.         sptr->PrevError = 0; //Error[-2]
  88.         sptr->Proportion = 5; //比例常数Proportional Const
  89.         sptr->Integral = 0;//积分常数Integral Const
  90.         sptr->Derivative = 0; //微分常数Derivative Const
  91.         
  92. }

  93. /*增量式 PID 计算部分*/
  94. int IncPIDCalc(int NextPoint)
  95. {
  96.         register int iError,iIncpid; //当前误差
  97.         iError = sptr->SetPoint - NextPoint;//增量计算
  98.         iIncpid = sptr->Proportion * iError//E[k]项
  99.         - sptr->Integral*sptr->LastError//E[k-1]项
  100.         + sptr->Derivative * sptr->PrevError; //E[k-2]项
  101.         //存储误差,用于下次计算
  102.         sptr->PrevError = sptr->LastError;
  103.         sptr->LastError = iError;
  104.         //返回增量值
  105.         return(iIncpid);
  106. }

  107. void SheZhi(void)//按键设置液位高度
  108. {
  109.         if(KeyPlus==0)          //液位增加按键
  110.         {
  111.                 DelayMs(100); //防止按键抖动
  112.                 while(!KeyPlus);
  113.                 KZ=KZ+10;        
  114.         }
  115.         if(KeyMinus==0)          //液位降低按键
  116.         {
  117.                 DelayMs(100); //防止按键抖动
  118.                 while(!KeyMinus);
  119.                 KZ=KZ-10;
  120.         }               
  121. }

  122. void Control(void) //液位控制
  123. {
  124.         InitAdc();
  125.         AdcObtainData();
  126.         if(KZ>YEWEI)
  127.         {
  128.                 if(KZ-YEWEI>50)
  129.                 {
  130.                         PWM_L=250;
  131.                 }
  132.                 else
  133.                 {
  134.                         rout=IncPIDCalc(YEWEI);
  135.                         PWM_L=(uchar)(rout);
  136.                         if(PWM_L>80)
  137.                         PWM_L=80;
  138.                 }
  139.         }                        
  140. }

  141. void main(void)
  142. {
  143.     InitTimer0();
  144.         IncPIDInit(); //初始化PID
  145.         while(1)
  146.         {
  147.                 sptr->SetPoint = KZ ;
  148.                 SheZhi(); //调用设置函数
  149.                 Control();//调用控制函
  150.         }
  151. }

  152. void jishi(void) interrupt 1 using 1   //定时器中断0输出PWM
  153. {
  154.     TH0 = (65536-500)/256;           //求模        0.5ms
  155.     TL0 = (65536-500)%256;           //求余
  156.         /*用来水泵调速*/        
  157.         speed_L++;
  158.         if(speed_L < PWM_L)                 //左轮PWM调速给出高电平占空比
  159.         {
  160.                 ENA = 0;        
  161.         }
  162.         else if(speed_L > PWM_L)   //左轮PWM调速给出低电平占空比
  163.         {        
  164.                 ENA = 1;               
  165.         }
  166.         if(speed_L == 300)                   //周期至300时清零
  167.     {
  168.                 speed_L = 0;
  169.                 ENA = 0;        
  170.         }
  171.         /*ADC时钟*/
  172.         CLK=~CLK;
  173. }

  174. void Timer1Interrupt(void) interrupt 3
  175. {
  176.     TH1 = 0x0ec;
  177.     TL1 = 0x78;
  178.         switch(c)
  179.         {
  180.                 case 0:P2=0X8f;P0=dofly_DuanMa[((uint)YEWEI)/16];break;//显示2位当前液位值break;
  181.                   case 1:P2=0X4f;P0=dofly_DuanMa[((uint)YEWEI)%16];break;
  182.                 case 2:P2=0X2f;P0=dofly_DuanMa[(uint)KZ/16];break;//显示设定液位值break;
  183.                   case 3:P2=0X1f;P0=dofly_DuanMa[(uint)KZ%16];break;
  184.          }
  185.         c++;
  186.         if(c==4){c=0;}
  187. }
复制代码


评分

参与人数 6黑币 +80 收起 理由
奥呦咧 + 4 赞一个!
saki123 + 5 很给力!
672076167@qq.co + 6 赞一个!
新人1 + 3 赞一个!
zhaok2013 + 12 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:114113 发表于 2016-4-14 14:12 | 只看该作者
在么  
如果把输出量改为控制电机的正反转  当液位高于设定值是电动机正转 当液位低于设定值时电动机反转   这个程序要怎么弄啊
回复

使用道具 举报

板凳
ID:114113 发表于 2016-4-14 14:13 | 只看该作者
能给我一个你的联系方式么
回复

使用道具 举报

地板
ID:118704 发表于 2016-5-9 14:11 | 只看该作者
感谢楼主贡献资源
回复

使用道具 举报

5#
ID:168553 发表于 2017-3-9 18:50 | 只看该作者
怎样实现温度和液位一起控制啊?
回复

使用道具 举报

6#
ID:170845 发表于 2017-3-15 11:21 | 只看该作者
怎么在里面填加多个传感器实现PID控制
回复

使用道具 举报

7#
ID:170445 发表于 2017-3-19 23:14 | 只看该作者
没有protues原理图?
回复

使用道具 举报

8#
ID:130231 发表于 2017-3-20 11:40 | 只看该作者
感谢楼主你的分享
回复

使用道具 举报

9#
ID:110278 发表于 2017-7-23 16:12 | 只看该作者
感谢楼主。。。。
回复

使用道具 举报

10#
ID:156600 发表于 2017-7-24 10:22 | 只看该作者
谢谢,支持一下
回复

使用道具 举报

11#
ID:218885 发表于 2017-9-18 11:00 | 只看该作者
感谢分享,多多支持
回复

使用道具 举报

12#
ID:257343 发表于 2017-12-5 09:46 | 只看该作者
非常感谢,支持一下
回复

使用道具 举报

13#
ID:262281 发表于 2017-12-16 19:18 | 只看该作者
如果用PIC该怎么控制?
回复

使用道具 举报

14#
ID:262281 发表于 2017-12-17 19:21 | 只看该作者
zzzzk 发表于 2017-3-19 23:14
没有protues原理图?

有没有proteus?
回复

使用道具 举报

15#
ID:264431 发表于 2017-12-20 20:33 | 只看该作者
这个如何利用电机的正反转作为输出?
回复

使用道具 举报

16#
ID:260141 发表于 2018-6-14 14:53 | 只看该作者
能简单解释一下整个电路的工作原理吗?
回复

使用道具 举报

17#
ID:272186 发表于 2018-6-20 22:27 | 只看该作者
感谢楼主
回复

使用道具 举报

18#
ID:485170 发表于 2019-5-31 20:49 来自手机 | 只看该作者
非常感谢
回复

使用道具 举报

19#
ID:463023 发表于 2019-7-17 08:45 | 只看该作者
浪费黑币,谨慎下载
回复

使用道具 举报

20#
ID:1113285 发表于 2024-3-27 10:32 | 只看该作者
能有温度控制就好了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表