找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 12875|回復(fù): 22
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)PID液位控制系統(tǒng)設(shè)計 程序PCB和實訓(xùn)報告論文都有

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:102721 發(fā)表于 2016-1-11 10:06 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
用51單片機(jī)做的PID液位控制系統(tǒng) 程序PCB和設(shè)計實訓(xùn)報告一應(yīng)俱全.



51單片機(jī)PID液位控制系統(tǒng)設(shè)計所有文件下載(包含程序 論文 pcb文件): 液位控制.rar (453.09 KB, 下載次數(shù): 266)



以下是單片機(jī)pid液位控制系統(tǒng)設(shè)計的論文預(yù)覽:
桂林電子科技大學(xué)信息科技學(xué)院
《自動化儀表與過程控制》實訓(xùn)報告
級:自動化一班      
學(xué)號:     00000000000000   
                    姓  名:00
指導(dǎo)教師:xxx
               2015 6 15

            實訓(xùn)題目:液位控制系統(tǒng)

1  系統(tǒng)設(shè)計
1.1 設(shè)計要求
1.1.1 基本原理
     水箱為雙容水箱,僅使用一個作為被控對象,即單容液位控制(將水箱設(shè)為自衡系統(tǒng)),水箱采用水泵進(jìn)行給水,水泵為12V直流電機(jī)控制,可采用PWM方式。液位傳感器為壓力式,輸出為電壓信號。設(shè)計調(diào)節(jié)器(模擬或數(shù)字式),能夠根據(jù)用戶設(shè)定,將水位控制在要求值(采用PID或PI規(guī)律)。

1.1.2 性能指標(biāo)要求
1、設(shè)計制作硬件系統(tǒng)電路,標(biāo)記姓名學(xué)號及制作日期;
2、實現(xiàn)水泵的控制、信號檢測(顯示)及調(diào)節(jié)器控制規(guī)律;
3、系統(tǒng)能夠盡快的克服擾動;

1.1.3 設(shè)計方法與步驟
1、根據(jù)設(shè)計基本原理和性能指標(biāo)要求選擇總體方案,畫出設(shè)計框圖;
2、參閱相關(guān)資料,根據(jù)設(shè)計框圖進(jìn)行電路的設(shè)計;
3、列出元件清單;
4、畫原理圖,布PCB圖,并制作電路板;
5、根據(jù)器件由小到大的順序安裝電路,并進(jìn)行自檢測試;      
6、數(shù)學(xué)建模、設(shè)計合適的控制參數(shù);
7、調(diào)試所制作的電路;
1.2 設(shè)計思路及設(shè)計框圖
1.2.1設(shè)計思路
    調(diào)節(jié)器和PWM信號產(chǎn)生用51單片機(jī)執(zhí)行,單片機(jī)與驅(qū)動模塊之間使用光電耦合器進(jìn)行隔離。液位變送器根據(jù)水壓不同輸出模擬電流信號(0-20mA),然后經(jīng)250歐電阻轉(zhuǎn)成0-5V的電壓信號經(jīng)過ADC0809芯片轉(zhuǎn)換成數(shù)字信號,再把數(shù)字信號傳給單片機(jī)的P1口,用單片機(jī)進(jìn)行數(shù)據(jù)處理。用兩位數(shù)碼管顯示AD值(調(diào)試用的),經(jīng)多次測量AD值所對應(yīng)的液位高度,記下多組數(shù)據(jù),再用MATLAB,Polyfit(x,y,n)
函數(shù),擬合曲線,得到線性關(guān)系,然后再把之前顯示AD值的兩位數(shù)碼管用來顯示擬合出來的AD值所對應(yīng)的液位。另外兩位數(shù)碼管則用來顯示設(shè)定液位的高度。
水泵的驅(qū)動用達(dá)林頓三級管驅(qū)動,可以通過單片機(jī)模擬出來的PWM控制水泵的轉(zhuǎn)速。

1.2.2總體設(shè)計框圖


2 各個模塊的程序的設(shè)計
1、PID算法控制:
#include"PID.H"
/*PID參數(shù)初始化*/
voidIncPIDInit(void)
{
       //sptr->SumError = 0;
       sptr->LastError = 0; //Error[-1]
       sptr->PrevError = 0; //Error[-2]
       sptr->Proportion = 100; //比例常數(shù)Proportional Const
       sptr->Integral = 1;//積分常數(shù)Integral Const
       sptr->Derivative = 1; //微分常數(shù)Derivative Const
      
}
/*增量式 PID 計算部分*/
intIncPIDCalc(int NextPoint)
{
       register int iError,iIncpid; //當(dāng)前誤差
       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模數(shù)轉(zhuǎn)換:
voidInitAdc(void)  //ADC初始化
{
       ST=0;
       OE=0;
       ST=1;
       ST=0;
}
voidAdcObtainData(void) //ADC或出數(shù)據(jù)
{
       while(EOC==0);
       OE=1;
       getdata=P1;
       YEWEI=5*(getdata-50);
       SHI=YEWEI>>4;
       GE=YEWEI&0X0F;            
       OE=0;
      DelayMs(200);                    //延時防止采集頻率過快
}
3、數(shù)碼管顯示模塊:
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位數(shù)液位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)//按鍵設(shè)置液位高度
{
       if(KeyPlus==0)        //液位增加按鍵
       {
              DelayMs(100);//防止按鍵抖動
              while(!KeyPlus);
              KZ++;     
       }
       if(KeyMinus==0)     //液位降低按鍵
       {
              DelayMs(100);//防止按鍵抖動
              while(!KeyMinus);
              KZ--;
       }            
}
5、PWM電機(jī)控制模塊:
voidjishi(void) interrupt 1 using 1   //定時器中斷0輸出PWM
{
    TH0 = (65536-50)/256;       //求模     0.05ms
    TL0 = (65536-50)%256;            //求余
       /*用來電機(jī)調(diào)速*/  
       speed_L++;
       if(speed_L < PWM_L)                //調(diào)速給出高電平占空比
       {
              ENA= 0;      
       }
       else if(speed_L > PWM_L)   //調(diào)速給出低電平占空比
       {     
              ENA= 1;              
       }
       if(speed_L == 256)           //1S周期至256時清零
    {
              speed_L= 0;
              ENA= 0;      
       }
       CLK=~CLK;
}
3 制作與調(diào)試過程
   ①制作:本次實訓(xùn)在制作電路板的過程中,根據(jù)所查找的資料提供的原理圖進(jìn)行修改,從原理圖中減去了很多的元件。然后用AD軟件畫出原理圖,接著轉(zhuǎn)為PCB,手動布線,并將PCB轉(zhuǎn)印在板子上,腐蝕、打孔后,完成實訓(xùn)電路板。
     ②調(diào)試:當(dāng)電路板制作完成后,需要調(diào)試電路板能否完成實訓(xùn)要求的功能,在調(diào)試的過程中我發(fā)現(xiàn)了數(shù)碼管是共陽的,隨后在P2口焊上1K上拉電阻,本次實訓(xùn)沒有用到三極管導(dǎo)致數(shù)碼管不夠亮,但是并不影響參數(shù)整定,而且晶振也換為12兆。
4功能測試
4.1測試儀器和設(shè)備
萬用表、傳感器設(shè)備、雙容水箱
4.2性能指標(biāo)測試
①實現(xiàn)液位標(biāo)定(誤差%5)
②完成參數(shù)的整定
5.硬件工作模塊


51最小系統(tǒng)
  最小系統(tǒng)是指是指用最少的元件組成的單片機(jī)可以工作的系統(tǒng),它包括單片機(jī)、復(fù)位電路和時鐘電路。
  復(fù)位電路:單片機(jī)第9腳為復(fù)位信號引腳(RST),復(fù)位信號高電平有效,但高電平維持時間必須維持在24個振蕩周期以上才能完成復(fù)位。系統(tǒng)使用12MHZ晶振則復(fù)位需要兩個機(jī)器周期。通電瞬間RC電路充電,RST引腳得到了一定脈寬的信號,只要信號脈寬維持在復(fù)位允許時間,單片機(jī)即可復(fù)位。
  起振電路:在外部連接晶振和起振電容便可構(gòu)成內(nèi)部振蕩電路,產(chǎn)生振蕩時鐘脈沖。
  單片機(jī):AT89S52,它是一種低功耗、高性能CMOS8位微控制器,具有8K系統(tǒng)可編程Flash儲存器。
  

A/D轉(zhuǎn)換
  ADC0809是一款8通道復(fù)用的8位AD轉(zhuǎn)換器,數(shù)據(jù)獲取的關(guān)鍵部分是它的八位8位模/數(shù)轉(zhuǎn)換器。這個部分由三部分組成:266R的階梯網(wǎng)絡(luò),連接逼近的電阻和比較器。ADC0809為8路模擬信號的份上采集轉(zhuǎn)換器。片內(nèi)有8路模擬選通開關(guān),以及相應(yīng)的通道抵制鎖存用譯碼電路,其轉(zhuǎn)換時間為100US左右。
  


電機(jī)模塊
   

  • 原理圖:

  • PCB圖:


5.實訓(xùn)心得
    經(jīng)過本次實訓(xùn),讓我對過程控制這一門課有了更深刻的了解。特別是雙位控制和PID控制,不僅對理論有了跟深刻的了解,還對它們實際應(yīng)用有了一定的認(rèn)識。這次實訓(xùn)首先設(shè)計原理圖和布局PCB,然后做板子。在設(shè)計原理圖的時候沒有注意到數(shù)碼管是共陽的,也沒加三極管,導(dǎo)致數(shù)碼管很暗,后來在接數(shù)碼管位選的IO口上接了一個1K的上拉電阻,有效的解決了這個問題。其中本次實訓(xùn)的關(guān)鍵在于調(diào)試,這也是最難,它不僅考驗了知識,還考驗了耐心。調(diào)試主要包括了測量參數(shù),利用參數(shù)經(jīng)數(shù)學(xué)計算工具擬合出曲線,還有就是不斷的修改程序,首先就是調(diào)節(jié)P值,不讓I作用,讓水位能在設(shè)定值的附近比較穩(wěn)定的上下波動,出現(xiàn)等幅振蕩最好。最后加入I調(diào)節(jié),調(diào)整I參數(shù),是系統(tǒng)跟加好的穩(wěn)定。不過本次實訓(xùn)中我只調(diào)了P,因為調(diào)了P水位也能比較穩(wěn)定的在設(shè)定值的附近微小的波動。
附錄1:原件清單
51單片機(jī)
ADC0809 數(shù)碼管
達(dá)林頓三極管
四個獨(dú)石電容
兩個瓷片電容
多個電阻 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; //轉(zhuǎn)換結(jié)束信號
  9. sbit OE=P3^3;  //允許輸出信號
  10. sbit ST=P3^4;  //轉(zhuǎn)換啟動信號
  11. sbit CLK=P3^5; //時鐘
  12. /*按鍵*/
  13. sbit KeyPlus=P2^0;//按鍵加
  14. sbit KeyMinus=P2^1;//按鍵減
  15. /*驅(qū)動*/
  16. sbit ENA=P3^6;//進(jìn)出水控制
  17. double KZ=100;
  18. double YEWEI; //獲取液位AD對應(yīng)液位值,
  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或出數(shù)據(jù)
  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就對應(yīng)100mm的液位高度               
  66.         OE=0;
  67.          DelayMs(200);                    //延時防止采集頻率過快
  68. }

  69. typedef struct PID
  70. {   
  71.         int SetPoint;//設(shè)定目標(biāo)Desired Value
  72.         //long SumError; //誤差累計
  73.         double Proportion; //比例常數(shù)Proportional Const
  74.         double Integral; //積分常數(shù)Integral Const
  75.         double Derivative; //微分常數(shù)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參數(shù)初始化*/
  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; //比例常數(shù)Proportional Const
  89.         sptr->Integral = 0;//積分常數(shù)Integral Const
  90.         sptr->Derivative = 0; //微分常數(shù)Derivative Const
  91.         
  92. }

  93. /*增量式 PID 計算部分*/
  94. int IncPIDCalc(int NextPoint)
  95. {
  96.         register int iError,iIncpid; //當(dāng)前誤差
  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)//按鍵設(shè)置液位高度
  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(); //調(diào)用設(shè)置函數(shù)
  149.                 Control();//調(diào)用控制函
  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.         /*用來水泵調(diào)速*/        
  157.         speed_L++;
  158.         if(speed_L < PWM_L)                 //左輪PWM調(diào)速給出高電平占空比
  159.         {
  160.                 ENA = 0;        
  161.         }
  162.         else if(speed_L > PWM_L)   //左輪PWM調(diào)速給出低電平占空比
  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位當(dāng)前液位值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;//顯示設(shè)定液位值break;
  183.                   case 3:P2=0X1f;P0=dofly_DuanMa[(uint)KZ%16];break;
  184.          }
  185.         c++;
  186.         if(c==4){c=0;}
  187. }
復(fù)制代碼


評分

參與人數(shù) 6黑幣 +80 收起 理由
奧呦咧 + 4 贊一個!
saki123 + 5 很給力!
672076167@qq.co + 6 贊一個!
新人1 + 3 贊一個!
zhaok2013 + 12 贊一個!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏10 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報

沙發(fā)
ID:114113 發(fā)表于 2016-4-14 14:12 | 只看該作者
在么  
如果把輸出量改為控制電機(jī)的正反轉(zhuǎn)  當(dāng)液位高于設(shè)定值是電動機(jī)正轉(zhuǎn) 當(dāng)液位低于設(shè)定值時電動機(jī)反轉(zhuǎn)   這個程序要怎么弄啊
回復(fù)

使用道具 舉報

板凳
ID:114113 發(fā)表于 2016-4-14 14:13 | 只看該作者
能給我一個你的聯(lián)系方式么
回復(fù)

使用道具 舉報

地板
ID:118704 發(fā)表于 2016-5-9 14:11 | 只看該作者
感謝樓主貢獻(xiàn)資源
回復(fù)

使用道具 舉報

5#
ID:168553 發(fā)表于 2017-3-9 18:50 | 只看該作者
怎樣實現(xiàn)溫度和液位一起控制�。�
回復(fù)

使用道具 舉報

6#
ID:170845 發(fā)表于 2017-3-15 11:21 | 只看該作者
怎么在里面填加多個傳感器實現(xiàn)PID控制
回復(fù)

使用道具 舉報

7#
ID:170445 發(fā)表于 2017-3-19 23:14 | 只看該作者
沒有protues原理圖?
回復(fù)

使用道具 舉報

8#
ID:130231 發(fā)表于 2017-3-20 11:40 | 只看該作者
感謝樓主你的分享
回復(fù)

使用道具 舉報

9#
ID:110278 發(fā)表于 2017-7-23 16:12 | 只看該作者
感謝樓主。。。。
回復(fù)

使用道具 舉報

10#
ID:156600 發(fā)表于 2017-7-24 10:22 | 只看該作者
謝謝,支持一下
回復(fù)

使用道具 舉報

11#
ID:218885 發(fā)表于 2017-9-18 11:00 | 只看該作者
感謝分享,多多支持
回復(fù)

使用道具 舉報

12#
ID:257343 發(fā)表于 2017-12-5 09:46 | 只看該作者
非常感謝,支持一下
回復(fù)

使用道具 舉報

13#
ID:262281 發(fā)表于 2017-12-16 19:18 | 只看該作者
如果用PIC該怎么控制?
回復(fù)

使用道具 舉報

14#
ID:262281 發(fā)表于 2017-12-17 19:21 | 只看該作者
zzzzk 發(fā)表于 2017-3-19 23:14
沒有protues原理圖?

有沒有proteus?
回復(fù)

使用道具 舉報

15#
ID:264431 發(fā)表于 2017-12-20 20:33 | 只看該作者
這個如何利用電機(jī)的正反轉(zhuǎn)作為輸出?
回復(fù)

使用道具 舉報

16#
ID:260141 發(fā)表于 2018-6-14 14:53 | 只看該作者
能簡單解釋一下整個電路的工作原理嗎?
回復(fù)

使用道具 舉報

17#
ID:272186 發(fā)表于 2018-6-20 22:27 | 只看該作者
感謝樓主
回復(fù)

使用道具 舉報

18#
ID:485170 發(fā)表于 2019-5-31 20:49 來自手機(jī) | 只看該作者
非常感謝
回復(fù)

使用道具 舉報

19#
ID:463023 發(fā)表于 2019-7-17 08:45 | 只看該作者
浪費(fèi)黑幣,謹(jǐn)慎下載
回復(fù)

使用道具 舉報

20#
ID:1113285 發(fā)表于 2024-3-27 10:32 | 只看該作者
能有溫度控制就好了
回復(fù)

使用道具 舉報

21#
ID:1142601 發(fā)表于 2025-3-16 21:58 來自手機(jī) | 只看該作者
有沒有proteus?
回復(fù)

使用道具 舉報

22#
ID:1142601 發(fā)表于 2025-3-16 23:17 來自手機(jī) | 只看該作者
有仿真嗎?
回復(fù)

使用道具 舉報

23#
ID:1142601 發(fā)表于 2025-3-17 21:36 來自手機(jī) | 只看該作者
有仿真嗎
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表