|
電路原理圖如下:
1 整機設計
1.1 設計要求
1.1.1設計任務
以實驗室的過程對象為控制對象,設計控制系統(tǒng),完成單容液位的定值控制。要求能夠顯示當前液位。
1.1.2性能指標要求
(1)設計制作系統(tǒng)硬件電路
(2)實現(xiàn)控制、信號檢測(顯示)及調節(jié)器控制規(guī)律;
(3)參數(shù)整定,使系統(tǒng)能夠快速克服擾動作用;
(4)其他功能。
1.2 整機實現(xiàn)的基本原理及框圖
1.2.1基本原理
測量變送器為壓力式液位變送器,輸出信號為0~10V電壓,執(zhí)行器采用電動調節(jié)閥,接收0~10V信號。設計調節(jié)器(模擬或數(shù)字式),能夠根據(jù)用戶設定,將液位控制在要求值(采用雙位控制,PID或PI控制規(guī)律)。
具體請下載觀看吧,有說明。
單片機源程序如下:
- #include "stc15.h"
- #include<TM1638.h>
- #include<delay.h>
- #include<KeyPro.h>
- #include<STC15_AD.h>
- #include<STC15_pca_pwm.h>
- //定時器初始化
- void T0_init(void)
- {
- TMOD=0x01;
- TH0=(0-1000)/256;
- TL0=(0-1000)%256;
- TR0=1;
- ET0=1;
- EA=1;
- }
- unsigned char u;
- unsigned char BI_POSCTR(void) //雙位控制
- {
- if(Para_V[1]<Para_V[2]-2) //當前值<設定值-2
- {
- u = 200; //開200,最大可到255
- }
- else if(Para_V[1]>Para_V[2]+2)
- {
- u = 0;
- }
- else
- u=100; //保持開度為100
- return u;
- }
- float kp,ki,kd;
- int ek,ek_1,ek_2;
- int uk,uk_1;
- unsigned char PID(void)
- {
- kp=(float)Para_V[3]/10;
- ki=(float)Para_V[4]/10;
- kd=(float)Para_V[5]/10;
- ek_2=ek_1;
- ek_1=ek;
- ek=(int)Para_V[2]-(int)Para_V[1];
- uk_1=uk;
- uk=uk_1+kp*(ek-ek_1)+ki*ek+kd*(ek-2*ek_1-ek_2); //增量型PID公式
- if(uk>255) uk=255; //限制溢出
- if(uk<0) uk=0;
- return (unsigned char)uk;
- }
- unsigned int OneusCNT=0;
- unsigned int Ones=0;
- unsigned char x=1;
- unsigned char s=1;
- unsigned char key_value;
- float H=0;
- float num=0;
- void main()
- {
- P2M0=0;
- P2M1=0;
- PWM_Init();
- InitADC();
- T0_init();
- delay_ms(10);
- delay(10);
- while(1)
- {
- key_value=Read_key();
- if(key_value!=0)
- {
- KeyPro(key_value-1);
- Cur_V[0]=Para_V[2]; //顯示區(qū)域讀取設定值
- while(key_value==Read_key()); //按一次限制只執(zhí)行一次
- }
- if(Para_V[0]==0&&x) //對象為0且采樣時間到,運行
- {
- SetPWM0(0);
- x=0; //初始化時間
- Para_V[1]=Cur_V[2]=GetADCResult(0);//讀取adc
- switch(Para_V[6]) //控制方式選擇
- {
- case 0:
- SetPWM1(Para_V[7]);
- break;
- case 1:
- BI_POSCTR();
- SetPWM1(u);
- break;
- case 2:
- PID();
- SetPWM1(uk);
- break;
- default: break;
- }
- }
- if(Para_V[0]==1&&s) //同上
- {
- SetPWM1(0);
- s=0;
- num=(float)GetADCResult(6);//獲取adc
- H=1314*num-428; //轉化成測量值,
- Para_V[1]=Cur_V[1]=(unsigned int)(H*10);
- switch(Para_V[6])
- {
- case 0:
- SetPWM0((unsigned char)Para_V[7]);
- break;
- case 1:
- BI_POSCTR();
- SetPWM0(u);
- break;
- case 2:
- PID();
- SetPWM0(uk);
- break;
- }
- }
- if(Setting) //顯示
- Display(ptPra,Para_V[ptPra],11,SetV);
- else
- Display(ptPra,Para_V[ptPra],ptCur,Cur_V[ptCur]);
- }
- }
- void T0_IRQ() interrupt 1//采樣時間
- {
- TH0=(0-1000)/256;
- TL0=(0-1000)%256;
- OneusCNT++;
- Ones++;
- if(OneusCNT>=50)
- {
- x=1;
- OneusCNT=0;
- }
- if(Ones>=300)
- {
- s=1;
- Ones=0;
- }
- }
復制代碼
所有資料51hei提供下載:
水位控制雙位+PID.7z
(1.17 MB, 下載次數(shù): 67)
2019-7-12 16:06 上傳
點擊文件名下載附件
程序+硬件+報告
|
評分
-
查看全部評分
|