找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4566|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)水位控制雙位+PID源程序+電路圖

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
電路原理圖如下:



1  整機(jī)設(shè)計(jì)
1.1 設(shè)計(jì)要求
1.1.1設(shè)計(jì)任務(wù)
以實(shí)驗(yàn)室的過(guò)程對(duì)象為控制對(duì)象,設(shè)計(jì)控制系統(tǒng),完成單容液位的定值控制。要求能夠顯示當(dāng)前液位。
1.1.2性能指標(biāo)要求
(1)設(shè)計(jì)制作系統(tǒng)硬件電路                                                                          
(2)實(shí)現(xiàn)控制、信號(hào)檢測(cè)(顯示)及調(diào)節(jié)器控制規(guī)律;                                 
(3)參數(shù)整定,使系統(tǒng)能夠快速克服擾動(dòng)作用;                                            
(4)其他功能。                     
1.2 整機(jī)實(shí)現(xiàn)的基本原理及框圖
1.2.1基本原理
測(cè)量變送器為壓力式液位變送器,輸出信號(hào)為0~10V電壓,執(zhí)行器采用電動(dòng)調(diào)節(jié)閥,接收0~10V信號(hào)。設(shè)計(jì)調(diào)節(jié)器(模擬或數(shù)字式),能夠根據(jù)用戶設(shè)定,將液位控制在要求值(采用雙位控制,PID或PI控制規(guī)律)。

具體請(qǐng)下載觀看吧,有說(shuō)明。

單片機(jī)源程序如下:
  1. #include "stc15.h"
  2. #include<TM1638.h>
  3. #include<delay.h>
  4. #include<KeyPro.h>
  5. #include<STC15_AD.h>
  6. #include<STC15_pca_pwm.h>

  7. //定時(shí)器初始化
  8. void T0_init(void)                  
  9. {
  10.         TMOD=0x01;
  11.         TH0=(0-1000)/256;
  12.         TL0=(0-1000)%256;
  13.         TR0=1;
  14.         ET0=1;
  15.         EA=1;
  16. }
  17. unsigned char u;
  18. unsigned char BI_POSCTR(void)  //雙位控制
  19. {
  20.         if(Para_V[1]<Para_V[2]-2) //當(dāng)前值<設(shè)定值-2
  21.           {
  22.            u = 200;                 //開(kāi)200,最大可到255
  23.           }
  24.         else if(Para_V[1]>Para_V[2]+2)
  25.           {
  26.            u = 0;
  27.           }
  28.          else
  29.                  u=100;                        //保持開(kāi)度為100
  30.          return u;
  31. }

  32. float kp,ki,kd;
  33. int ek,ek_1,ek_2;
  34. int uk,uk_1;
  35. unsigned char PID(void)
  36. {
  37.    kp=(float)Para_V[3]/10;
  38.    ki=(float)Para_V[4]/10;
  39.    kd=(float)Para_V[5]/10;
  40.    ek_2=ek_1;
  41.    ek_1=ek;
  42.    ek=(int)Para_V[2]-(int)Para_V[1];
  43.    uk_1=uk;
  44.    uk=uk_1+kp*(ek-ek_1)+ki*ek+kd*(ek-2*ek_1-ek_2);        //增量型PID公式
  45.         if(uk>255) uk=255;        //限制溢出
  46.         if(uk<0) uk=0;
  47.    return (unsigned char)uk;
  48. }

  49. unsigned int OneusCNT=0;
  50. unsigned int Ones=0;
  51. unsigned char x=1;
  52. unsigned char s=1;
  53. unsigned char key_value;
  54. float H=0;
  55. float num=0;
  56. void main()
  57. {       
  58.         P2M0=0;
  59.         P2M1=0;       
  60.         PWM_Init();
  61.         InitADC();
  62.         T0_init();
  63.         delay_ms(10);
  64.         delay(10);
  65.    while(1)
  66.    {
  67.         key_value=Read_key();
  68.         if(key_value!=0)
  69.         {
  70.         KeyPro(key_value-1);
  71.         Cur_V[0]=Para_V[2];                 //顯示區(qū)域讀取設(shè)定值
  72.         while(key_value==Read_key()); //按一次限制只執(zhí)行一次
  73.         }

  74.            if(Para_V[0]==0&&x)          //對(duì)象為0且采樣時(shí)間到,運(yùn)行
  75.         {
  76.           SetPWM0(0);
  77.           x=0;           //初始化時(shí)間
  78.       Para_V[1]=Cur_V[2]=GetADCResult(0);//讀取adc

  79.           switch(Para_V[6])                //控制方式選擇
  80.           {
  81.                   case 0:
  82.                           SetPWM1(Para_V[7]);
  83.                          break;
  84.                 case 1:
  85.                          BI_POSCTR();
  86.                          SetPWM1(u);
  87.                          break;                                  
  88.                 case 2:
  89.                         PID();
  90.                         SetPWM1(uk);
  91.                         break;

  92.                 default:  break;
  93.           }
  94.         }
  95.         if(Para_V[0]==1&&s)         //同上
  96.         {
  97.           SetPWM1(0);
  98.           s=0;
  99.           num=(float)GetADCResult(6);//獲取adc
  100.                 H=1314*num-428; //轉(zhuǎn)化成測(cè)量值,
  101.       Para_V[1]=Cur_V[1]=(unsigned int)(H*10);
  102.           switch(Para_V[6])
  103.           {
  104.                   case 0:
  105.                           SetPWM0((unsigned char)Para_V[7]);
  106.                          break;
  107.                 case 1:
  108.                          BI_POSCTR();
  109.                          SetPWM0(u);
  110.                          break;                                  
  111.                 case 2:
  112.                         PID();
  113.                         SetPWM0(uk);
  114.                         break;
  115.           }
  116.         }
  117.         if(Setting)           //顯示
  118.                 Display(ptPra,Para_V[ptPra],11,SetV);
  119.         else
  120.                 Display(ptPra,Para_V[ptPra],ptCur,Cur_V[ptCur]);
  121.    }
  122. }

  123. void T0_IRQ() interrupt 1//采樣時(shí)間
  124. {
  125.         TH0=(0-1000)/256;
  126.         TL0=(0-1000)%256;
  127.         OneusCNT++;
  128.         Ones++;

  129.         if(OneusCNT>=50)
  130.         {
  131.          x=1;
  132.          OneusCNT=0;       
  133.         }
  134.         if(Ones>=300)
  135.         {
  136.          s=1;
  137.          Ones=0;       
  138.         }
  139. }
復(fù)制代碼

所有資料51hei提供下載:
水位控制雙位+PID.7z (1.17 MB, 下載次數(shù): 67)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:668361 發(fā)表于 2021-1-20 12:39 | 只看該作者
請(qǐng)問(wèn)一下前輩,有整套PCB嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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