標題: 51單片機PID液位控制系統設計 程序PCB和實訓報告論文都有 [打印本頁]
作者: pdh 時間: 2016-1-11 10:06
標題: 51單片機PID液位控制系統設計 程序PCB和實訓報告論文都有
用51單片機做的PID液位控制系統 程序PCB和設計實訓報告一應俱全.
0.png (32.85 KB, 下載次數: 294)
下載附件
2016-1-11 19:34 上傳
51單片機PID液位控制系統設計所有文件下載(包含程序 論文 pcb文件):
液位控制.rar
(453.09 KB, 下載次數: 266)
2016-1-11 10:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
以下是單片機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總體設計框圖
0.png (7.21 KB, 下載次數: 239)
下載附件
2016-1-11 20:01 上傳
2 各個模塊的程序的設計
1、PID算法控制:
#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[k-1]項
+ sptr->Derivative *sptr->PrevError; //E[k-2]項
//存儲誤差,用于下次計算
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--;
}
}
5、PWM電機控制模塊:
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儲存器。
clip_image005.jpg (32.82 KB, 下載次數: 277)
下載附件
2016-1-11 19:59 上傳
A/D轉換
ADC0809是一款8通道復用的8位AD轉換器,數據獲取的關鍵部分是它的八位8位模/數轉換器。這個部分由三部分組成:266R的階梯網絡,連接逼近的電阻和比較器。ADC0809為8路模擬信號的份上采集轉換器。片內有8路模擬選通開關,以及相應的通道抵制鎖存用譯碼電路,其轉換時間為100US左右。
clip_image007.jpg (36.56 KB, 下載次數: 233)
下載附件
2016-1-11 19:59 上傳
電機模塊
clip_image009.jpg (13.68 KB, 下載次數: 243)
下載附件
2016-1-11 19:59 上傳
clip_image011_0000.jpg (27.07 KB, 下載次數: 280)
下載附件
2016-1-11 19:59 上傳
clip_image013.jpg (59.36 KB, 下載次數: 215)
下載附件
2016-1-11 19:59 上傳
5.實訓心得
經過本次實訓,讓我對過程控制這一門課有了更深刻的了解。特別是雙位控制和PID控制,不僅對理論有了跟深刻的了解,還對它們實際應用有了一定的認識。這次實訓首先設計原理圖和布局PCB,然后做板子。在設計原理圖的時候沒有注意到數碼管是共陽的,也沒加三極管,導致數碼管很暗,后來在接數碼管位選的IO口上接了一個1K的上拉電阻,有效的解決了這個問題。其中本次實訓的關鍵在于調試,這也是最難,它不僅考驗了知識,還考驗了耐心。調試主要包括了測量參數,利用參數經數學計算工具擬合出曲線,還有就是不斷的修改程序,首先就是調節P值,不讓I作用,讓水位能在設定值的附近比較穩定的上下波動,出現等幅振蕩最好。最后加入I調節,調整I參數,是系統跟加好的穩定。不過本次實訓中我只調了P,因為調了P水位也能比較穩定的在設定值的附近微小的波動。
附錄1:原件清單
51單片機
ADC0809 數碼管
達林頓三極管
四個獨石電容
兩個瓷片電容
多個電阻 RS232串口芯片
DB9
1K上拉電阻
若干插針
接線柱
12M晶振 三個按鍵
一個極性電容
光耦
下載接口
附錄2:程序清單
- #include <reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- uint c=0; //獲取液位AD值,
- unsigned char code dofly_DuanMa[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
- 0x90,0X88,0X83,0Xc6,0Xa1,0X86,0X8e};// 顯示段碼值0~9
- /*ADC0809*/
- sbit EOC=P3^2; //轉換結束信號
- sbit OE=P3^3; //允許輸出信號
- sbit ST=P3^4; //轉換啟動信號
- sbit CLK=P3^5; //時鐘
- /*按鍵*/
- sbit KeyPlus=P2^0;//按鍵加
- sbit KeyMinus=P2^1;//按鍵減
- /*驅動*/
- sbit ENA=P3^6;//進出水控制
- double KZ=100;
- double YEWEI; //獲取液位AD對應液位值,
- uint rout; // PID Response (Output)
- uint getdata;
- uint PWM_L;
- uint speed_L = 0;
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- void DelayMs(unsigned char t)
- {
- while(t--)
- {
- //大致延時1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- void InitTimer0(void)
- {
- TMOD = 0x11;
- TH0 = (65536-500)/256; //求模 0.5ms
- TL0 = (65536-500)%256; //求余
- TH1 = 0x0EC;
- TL1 = 0x78;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- ET1 = 1;
- TR1 = 1;
- }
- void InitAdc(void) //ADC初始化
- {
- ST=0;
- OE=0;
- ST=1;
- ST=0;
- }
- void AdcObtainData(void) //ADC或出數據
- {
- while(EOC==0);
- OE=1;
- getdata=P1;
- if(getdata<53)
- {
- getdata=53;
- }
- YEWEI=(double)5*((double)(getdata)-53);//AD值是70就對應100mm的液位高度
- OE=0;
- DelayMs(200); //延時防止采集頻率過快
- }
- typedef struct PID
- {
- int SetPoint;//設定目標Desired Value
- //long SumError; //誤差累計
- double Proportion; //比例常數Proportional Const
- double Integral; //積分常數Integral Const
- double Derivative; //微分常數Derivative Const
- int LastError; //Error[-1]
- int PrevError; //Error[-2]
- }
- PID;
- static PID sPID;
- static PID *sptr = &sPID;
- /*PID參數初始化*/
- void IncPIDInit(void)
- {
- //sptr->SumError = 0;
- sptr->LastError = 0; //Error[-1]
- sptr->PrevError = 0; //Error[-2]
- sptr->Proportion = 5; //比例常數Proportional Const
- sptr->Integral = 0;//積分常數Integral Const
- sptr->Derivative = 0; //微分常數Derivative Const
-
- }
-
- /*增量式 PID 計算部分*/
- int IncPIDCalc(int NextPoint)
- {
- register int iError,iIncpid; //當前誤差
- iError = sptr->SetPoint - NextPoint;//增量計算
- iIncpid = sptr->Proportion * iError//E[k]項
- - sptr->Integral*sptr->LastError//E[k-1]項
- + sptr->Derivative * sptr->PrevError; //E[k-2]項
- //存儲誤差,用于下次計算
- sptr->PrevError = sptr->LastError;
- sptr->LastError = iError;
- //返回增量值
- return(iIncpid);
- }
- void SheZhi(void)//按鍵設置液位高度
- {
- if(KeyPlus==0) //液位增加按鍵
- {
- DelayMs(100); //防止按鍵抖動
- while(!KeyPlus);
- KZ=KZ+10;
- }
- if(KeyMinus==0) //液位降低按鍵
- {
- DelayMs(100); //防止按鍵抖動
- while(!KeyMinus);
- KZ=KZ-10;
- }
- }
- void Control(void) //液位控制
- {
- InitAdc();
- AdcObtainData();
- if(KZ>YEWEI)
- {
- if(KZ-YEWEI>50)
- {
- PWM_L=250;
- }
- else
- {
- rout=IncPIDCalc(YEWEI);
- PWM_L=(uchar)(rout);
- if(PWM_L>80)
- PWM_L=80;
- }
- }
- }
- void main(void)
- {
- InitTimer0();
- IncPIDInit(); //初始化PID
- while(1)
- {
- sptr->SetPoint = KZ ;
- SheZhi(); //調用設置函數
- Control();//調用控制函
- }
- }
- void jishi(void) interrupt 1 using 1 //定時器中斷0輸出PWM
- {
- TH0 = (65536-500)/256; //求模 0.5ms
- TL0 = (65536-500)%256; //求余
- /*用來水泵調速*/
- speed_L++;
- if(speed_L < PWM_L) //左輪PWM調速給出高電平占空比
- {
- ENA = 0;
- }
- else if(speed_L > PWM_L) //左輪PWM調速給出低電平占空比
- {
- ENA = 1;
- }
- if(speed_L == 300) //周期至300時清零
- {
- speed_L = 0;
- ENA = 0;
- }
- /*ADC時鐘*/
- CLK=~CLK;
- }
- void Timer1Interrupt(void) interrupt 3
- {
- TH1 = 0x0ec;
- TL1 = 0x78;
- switch(c)
- {
- case 0:P2=0X8f;P0=dofly_DuanMa[((uint)YEWEI)/16];break;//顯示2位當前液位值break;
- case 1:P2=0X4f;P0=dofly_DuanMa[((uint)YEWEI)%16];break;
- case 2:P2=0X2f;P0=dofly_DuanMa[(uint)KZ/16];break;//顯示設定液位值break;
- case 3:P2=0X1f;P0=dofly_DuanMa[(uint)KZ%16];break;
- }
- c++;
- if(c==4){c=0;}
- }
復制代碼
作者: 陳小生 時間: 2016-4-14 14:12
在么
如果把輸出量改為控制電機的正反轉 當液位高于設定值是電動機正轉 當液位低于設定值時電動機反轉 這個程序要怎么弄啊
作者: 陳小生 時間: 2016-4-14 14:13
能給我一個你的聯系方式么
作者: waz 時間: 2016-5-9 14:11
感謝樓主貢獻資源
作者: jiyidewang 時間: 2017-3-9 18:50
怎樣實現溫度和液位一起控制啊?
作者: 圖樣圖森破2號 時間: 2017-3-15 11:21
怎么在里面填加多個傳感器實現PID控制
作者: zzzzk 時間: 2017-3-19 23:14
沒有protues原理圖?
作者: zqy181818 時間: 2017-3-20 11:40
感謝樓主你的分享
作者: linnyshow 時間: 2017-7-23 16:12
感謝樓主。。。。
作者: 風中飄飄 時間: 2017-7-24 10:22
謝謝,支持一下
作者: a865138312 時間: 2017-9-18 11:00
感謝分享,多多支持
作者: 白水帶老司機 時間: 2017-12-5 09:46
非常感謝,支持一下
作者: 新人1 時間: 2017-12-16 19:18
如果用PIC該怎么控制?
作者: 新人1 時間: 2017-12-17 19:21
有沒有proteus?
作者: GROW 時間: 2017-12-20 20:33
這個如何利用電機的正反轉作為輸出?
作者: simple666 時間: 2018-6-14 14:53
能簡單解釋一下整個電路的工作原理嗎?
作者: 894977238 時間: 2018-6-20 22:27
感謝樓主
作者: 李景麗 時間: 2019-5-31 20:49
非常感謝
作者: Angelaboby 時間: 2019-7-17 08:45
浪費黑幣,謹慎下載
作者: 南-wgw 時間: 2024-3-27 10:32
能有溫度控制就好了
作者: 菲菲哥 時間: 2025-3-16 21:58
有沒有proteus?
作者: 菲菲哥 時間: 2025-3-16 23:17
有仿真嗎?
作者: 菲菲哥 時間: 2025-3-17 21:36
有仿真嗎
歡迎光臨 (http://www.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
在线观看中文字幕一区二区
|
欧美一区二区三区日韩
|
国产午夜在线
|
91av免费观看|
9色网站|
99视频网
|
午夜影院
|
成人免费观看男女羞羞视频
|
久久国产精品一区二区三区
|
精品免费国产一区二区三区四区介绍
|
www.久草
|
欧美精品区
|
韩国精品在线观看
|
中文字幕av第一页
|
日韩一区二区三区在线
|
成人在线亚洲
|
国产一区二区三区四区五区加勒比
|
亚洲精品一区中文字幕乱码
|
欧美日韩精品一区
|
亚洲成人三级
|
瑟瑟激情
|
亚洲一区二区精品视频
|
色一情一乱一伦一区二区三区
|
www日本高清视频
|
伊人欧美视频
|
欧美一级欧美一级在线播放
|
99精品免费视频
|
亚洲美女视频
|
一级黄色短片
|
日韩av大片免费看
|
人人性人人性碰国产
|
夜夜草av|
久久综合久久综合久久
|
国产欧美一区二区精品久导航
|
成人在线观看免费爱爱
|
成人在线一区二区三区
|
亚洲国产成人在线观看
|
成人一区二区三区在线观看
|
一区二区视频
|
国产97在线视频
|
麻豆一区二区三区
|