標(biāo)題: 工業(yè)生產(chǎn)現(xiàn)場的光照強(qiáng)度控制系統(tǒng)設(shè)計(jì) 附單片機(jī)程序Proteus仿真 [打印本頁]
作者: age1111 時(shí)間: 2020-1-5 14:31
標(biāo)題: 工業(yè)生產(chǎn)現(xiàn)場的光照強(qiáng)度控制系統(tǒng)設(shè)計(jì) 附單片機(jī)程序Proteus仿真
用單片機(jī)控制總裝車間中的LED照明系統(tǒng),使其輸出恒定照度的光,以滿足總裝生產(chǎn)工序中的照明需要。
要求:
1. 設(shè)計(jì)一個(gè)給LED供電的可控恒流源電路;
2. 要求恒流源輸出電流大小可調(diào),調(diào)節(jié)范圍:下限為(學(xué)號(hào)末兩位×100)mA ,上限為(學(xué)號(hào)末兩位×10)mA;(310mA—3100mA)
3. 設(shè)計(jì)用戶輸入環(huán)節(jié)(硬件線路和程序),實(shí)現(xiàn)人工設(shè)定給LED供電的恒流源的電流大小;
4. 設(shè)計(jì)恒流源輸出電流檢測電路和顯示電路,編程實(shí)現(xiàn)輸出電流大小的檢測和顯示;
5. 構(gòu)建閉環(huán)系統(tǒng),并運(yùn)用 數(shù)字控制算法(如PID)使輸出電流相對(duì)穩(wěn)定在用戶設(shè)定的數(shù)值,利用Matlab作為輔助工具整定算法參數(shù)、仿真驗(yàn)證算法性能,并通過編程用單片機(jī)實(shí)現(xiàn);
6. 設(shè)計(jì)、繪制系統(tǒng)電路 PCB,設(shè)計(jì)包含手寫簽名的 Logo,并放置在Top Layer的正中位置。
2. 硬件總體設(shè)計(jì)
2.1 總體設(shè)計(jì)方案
由設(shè)計(jì)要求可知,需使用MCS-51系列單片機(jī),構(gòu)建控制系統(tǒng),實(shí)現(xiàn)LED燈亮度的控制。所以采用AT89C52 單片機(jī)為核心,以3*3按鍵鍵盤作為輸入端,以達(dá)到控制所需輸出電流的功能,并且由LCD1602顯示模塊可以顯示輸入電流的大小和電流源輸出的電流大小。在設(shè)計(jì)中,采用PCF8591芯片進(jìn)行AD/DA轉(zhuǎn)換,單片機(jī)通過I2C通信協(xié)議控制PCF8591 AD轉(zhuǎn)換輸出的電壓所需電壓,輸入壓控電壓源,通過采樣電阻的電壓DA轉(zhuǎn)換獲得電流源輸出的電流值,經(jīng)過單片機(jī)計(jì)算最后顯示實(shí)際輸出電流。
該直流電機(jī)控制系統(tǒng)的設(shè)計(jì),在總體上大致可分為以下6個(gè)部分組成:AT89C52單片機(jī)最小系統(tǒng),3*3按鍵鍵盤,直流穩(wěn)壓源,1602顯示模塊,AD/DA轉(zhuǎn)換模塊,可控電流源模塊。系統(tǒng)總體方案圖如圖 1 所示。
圖 1 系統(tǒng)總體方案圖
2.2 工作原理
2.2.2 直流穩(wěn)壓電源原理
本設(shè)計(jì)共用到電源有四種:即± 12V、+5V、負(fù)載電源?蛇x用的有開關(guān)電源和穩(wěn)壓電源兩種,由于開關(guān)電源的紋波系數(shù)比較大。因此采用常用的穩(wěn)壓電源來作為整個(gè)系統(tǒng)的電源。穩(wěn)壓電源由電源變壓器、整流電路、濾波電路和穩(wěn)壓電路組成,如圖 2 所示:
圖2 直流穩(wěn)壓電源原理圖
整流和濾波電路:整流作用是將交流電壓 變換成脈動(dòng)電壓。濾波電路一般由電容組成, 其作用是脈動(dòng)電壓中的大部分紋波加以濾除,以得到較平滑的直流電壓。再通過穩(wěn)壓電路得到平直的直流電壓。
圖2 直流穩(wěn)壓電源仿真圖
2.2.2 電流源原理
首先,在數(shù)控方面采用單片機(jī)比 CPLD 和 FPGA 等可編程邏輯器件好,因?yàn)榇颂幹皇且话阌猛镜目刂,沒有必要選用價(jià)格昂貴的 CPLD 和 FPGA,而且他們用在此處并不合適,控制起來顯得很麻煩。而單片機(jī)則不同,他有著非常成熟的技術(shù),這方面的參考文獻(xiàn)也很多,而且他從來就是用于控制方面的,在這方面有著天生的優(yōu)勢。還有他價(jià)格也不貴,僅幾元人民幣。對(duì)于這樣的應(yīng)用系統(tǒng)比較劃得來。其次在恒流源方面,我們方案也很好。從理論上看,運(yùn)放是接成比較器的,作為模擬反饋的,這樣在只要運(yùn)放的輸入不變,那么三極管的Vbe是不變的,根據(jù)三極管的共射極輸入特性可知,Vbe不變時(shí),Ie和Ic也保持不變,而且Ic=βIb, Ie=(1+β)Ib 。當(dāng)β比較大時(shí)Ic≈Ie 。當(dāng)運(yùn)放的輸入改變時(shí),也改變了Vbe值,這樣也就改變了Ic和Ie的值,而且這個(gè)變化基本也是呈線性的。這也就是本系統(tǒng)的恒流原理。由于器件受溫度的影響以及局部非線性的存在,這樣的恒流源不能做到真正的恒流,因此,當(dāng)外界條件發(fā)生變化時(shí),我們要及時(shí)給予補(bǔ)償,只有這樣才能做到真正的恒流。這也就是為什么要加入模數(shù)轉(zhuǎn)換器的真正原因,他能實(shí)時(shí)測量電流的變化并按照一定的算法及時(shí)給予補(bǔ)償,采用數(shù)字補(bǔ)償逐次逼近的方式作為反饋調(diào)整環(huán)節(jié),由程序控制調(diào)節(jié)功率管的輸出。當(dāng)改變負(fù)載大小時(shí),基本上不影響電流的輸出。模數(shù)轉(zhuǎn)換器還起到測量的作用,同時(shí)送顯示讓我們知道實(shí)際的電流輸出值。
2.3 AT89C52最小系統(tǒng)
2.3.1 AT89C52芯片簡介
采用AT89C52是MSC-51系列單片機(jī)的升級(jí)版,由世界著名半導(dǎo)體公司 ATMEL在購買MSC-51設(shè)計(jì)結(jié)構(gòu)后,利用自身優(yōu)勢技術(shù)——閃存生產(chǎn)技術(shù)對(duì)舊技術(shù)進(jìn)行改進(jìn)和擴(kuò)展,同時(shí)使用新的半導(dǎo)體生產(chǎn)工藝,最終得到成型產(chǎn)品。與此同時(shí),世界上其他的著名公司也通過基本的51內(nèi)核,結(jié)合公司自身技術(shù)進(jìn)行改進(jìn)生產(chǎn),推廣了一批如51F020等高性能單片機(jī)。AT89C52片內(nèi)集成256字節(jié)程序運(yùn)行空間, 8K字節(jié)Flash存儲(chǔ)空間,支持最大64k外部存儲(chǔ)擴(kuò)展。根據(jù)不同的運(yùn)行速度和功耗的要求,時(shí)鐘頻率可以設(shè)置在0-33M之間。片內(nèi)資源有4組I/O控制端口、3個(gè)定時(shí)器、8個(gè)中斷、軟件設(shè)置低耗能模式、看門狗和斷電保護(hù)?梢栽4V到5.5V寬電壓范圍內(nèi)正常工作。不斷發(fā)展的半導(dǎo)體工藝也讓該單片機(jī)的功耗不斷降低。同時(shí),該單片機(jī)支持計(jì)算機(jī)并口下載,簡單的數(shù)字芯片就可以制成下載線,僅僅幾塊錢的價(jià)格讓該型號(hào)單片機(jī)暢銷 10 年不衰。根據(jù)不同場合的要求,這款單片機(jī)提供了多種封裝,本次設(shè)計(jì)根據(jù)最小系統(tǒng)有時(shí)需要更換單片機(jī)的具體情況,使用雙列直插PID-40 的封裝。
2.3.2 AT89C52最小系統(tǒng)組成
AT89C52最小系統(tǒng)由AT89C52芯片、復(fù)位電路和時(shí)鐘電路組成。復(fù)位電路和時(shí)鐘電路是維持單片機(jī)最小系統(tǒng)運(yùn)行的基本模塊。時(shí)鐘電路采用12M晶振組成。復(fù)位電路通常分為兩種:上電復(fù)位和手動(dòng)復(fù)位。有時(shí)系統(tǒng)在運(yùn)行過程中出現(xiàn)程序跑飛的情況,在程序開發(fā)過程中,經(jīng)常需要手動(dòng)復(fù)位,所以本次設(shè)計(jì)選用手動(dòng)復(fù)位。
圖3 AT89C52最小系統(tǒng)圖
2.4 3*4按鍵鍵盤
鍵盤使用12個(gè)彈跳按鈕形成3*4輸入鍵盤,按鈕鍵值為“0-9”、“確定”和“設(shè)置”。“0-9”一共10個(gè)按鈕實(shí)現(xiàn)所需輸出電流值的輸入控制,控制范圍為310mA-3100mA; “確定”鍵實(shí)現(xiàn)數(shù)據(jù)計(jì)算并輸出所需電壓,以控制電流源的輸出電流;“設(shè)置”鍵實(shí)現(xiàn)二次數(shù)據(jù)輸入,按下時(shí)會(huì)使數(shù)值返回默認(rèn)值,以達(dá)到電流值的重新輸入。
圖4 3*4按鍵輸入模塊
2.5 LCD1602顯示模塊
2.5.1 LCD1602簡介
點(diǎn)陣圖形式液晶由M×N個(gè)顯示單元組成,假設(shè)LCD顯示屏有64行,每行有128列,每8列對(duì)應(yīng)1字節(jié)的8位,即每行由16字節(jié),共16×8=128個(gè)點(diǎn)組成。顯示屏上64×16個(gè)顯示單元與顯示RAM區(qū)的1024字節(jié)相對(duì)應(yīng),每一字節(jié)的內(nèi)容與顯示屏上相應(yīng)位置的亮暗對(duì)應(yīng)。例如顯示屏第一行的亮暗由RAM區(qū)的000H~00FH的16字節(jié)的內(nèi)容決定,當(dāng)(000H)=FFH時(shí),屏幕左上角顯示一條短亮線,長度為8個(gè)點(diǎn);當(dāng)(3FFH)=FFH時(shí),屏幕右下角顯示一條短亮線;當(dāng)(000H)=FFH,(001H)=00H,(002H)=00H…,(00EH)=00H,(00FH)=00H時(shí),在屏幕的頂部顯示一條由8條亮線和8條暗線組成的虛線。這就是LCD顯示的基本原理。
字符型液晶顯示模塊是一種專門用于顯示字母、數(shù)字和符號(hào)等的點(diǎn)陣式LCD,目前常用16×1,16×2,20×2和40×2等的模塊。一般的LCD1602字符型液晶顯示器的內(nèi)部控制器大部分為HD44780,能夠顯示英文字母、阿拉伯?dāng)?shù)字、日文片假名和一般性符號(hào)。
2.5.2 LCD1602連接與控制
LCD1602顯示模塊與單片機(jī)P2.5、P2.6、P2.7以及P0口連接,通過單片機(jī)編寫LCD控制子程序,實(shí)現(xiàn)LCD1602的數(shù)據(jù)傳輸和顯示控制。以顯示用戶輸入電流的值以及電流源最后輸出的值。通過LCD1602實(shí)現(xiàn)人機(jī)交互的功能,以達(dá)到實(shí)時(shí)顯示輸出電流大小的顯示。
圖5 LCD1602顯示模塊
2.6 AD/DA轉(zhuǎn)換模塊
2.6.1 PCF8591簡介
PCF8591是一個(gè)單片集成、單獨(dú)供電、低功耗、8-bit CMOS數(shù)據(jù)獲取器件。PCF8591具有4個(gè)模擬輸入、1個(gè)模擬輸出和1個(gè)串行I2C總線接口。PCF8591的3個(gè)地址引腳A0, A1和A2可用于硬件地址編程,允許在同個(gè)I2C總線上接入8個(gè)PCF8591器件,而無需額外的硬件。在PCF8591器件上輸入輸出的地址、控制和數(shù)據(jù)信號(hào)都是通過雙線雙向I2C總線以串行的方式進(jìn)行傳輸。
2.6.2 PCF8591轉(zhuǎn)換模塊
由于系統(tǒng)要求同時(shí)要求AD/DA轉(zhuǎn)換,而如果采用單獨(dú)的AD/DA芯片,需要的控制引腳比較多,而PCF8591芯片集成了4個(gè)AD轉(zhuǎn)換引腳和一個(gè)DA轉(zhuǎn)換引腳,適合系統(tǒng)的所需的要求,同時(shí)使用I2C通信協(xié)議,只需要連接單片機(jī)兩個(gè)引腳,節(jié)約了單片機(jī)的引腳,并且使用簡單,控制方便。
圖6 AD/DA轉(zhuǎn)換模塊
2.7 可控電流源模塊
用“運(yùn)放 +大功率三極管”的結(jié)構(gòu)構(gòu)成恒流源。大功率三極管選用 TIP122 型號(hào),它是應(yīng)用范圍廣、功率小、頻率低的達(dá)林頓,NPN 極性型,特征頻率 :1000(MHz),集電極允許電流:8(A),集電極最大允許耗散功率:48(W)。其性能滿足本設(shè)計(jì)要求,同時(shí)可以通過功率管的不同容量來滿足不同的應(yīng)用要求。采用常用的大功率電阻作為采樣電阻,輸出電流波動(dòng)比較大,而康錳銅絲是一種溫度特性佳的阻性元件,選其作為取樣電阻,其兩端電壓正比于流過的電流,因此該電壓的反饋就是負(fù)載電流的反饋。
圖7可控電流源模塊
3. 程序設(shè)計(jì)
3.1主程序:
- ///*************************************************************************
- ///工業(yè)生產(chǎn)中的產(chǎn)品數(shù)量自動(dòng)計(jì)量系統(tǒng)創(chuàng)新設(shè)計(jì)
- ///功能:通過MUC-51芯片控制電流源輸出電流,實(shí)現(xiàn)LED燈亮度控制
- ///*************************************************************************
- #include<reg52.h>
- #include<iic.h>
- #include<lcd1602.h>
-
- #define KEY_PRESET(code) { P1=code; temp=P1; temp=temp&code; delay(10);}
-
- uchar str1[16]="310mA<=I<=3100mA";
- uchar str2[16]="set: out: ";
- uchar str3[16]=" Error occurred ";
- uchar dianliu[4]={0,0,0,0};
-
- uchar key_num,key_flag,key_count=0,OK_flag;
- ulong pian,bai,shi,ge,set_value;
- float key_value;
- uchar h,l,temp;
- ulong back_voltage1,back_current;
-
- void get_Data();
- void set_Data();
- uchar keyscan();
- bit DACconversion(uchar sla,uchar c,uchar Val);
- bit ISendByte(uchar sla,uchar c);
- uchar IRcvByte(uchar sla);
- void delay1(uint j);
- ///*************************************************************************
- ///主函數(shù)
- ///*************************************************************************
- void main()
- {
- INIT_I2c();//iic總線初始化
- LCD_Init();//LCD1602初始化
- while(1)
- {
- get_Data();
- set_Data();
- }
-
- }
-
- //*******************************************************************
- //DAC 變換, 轉(zhuǎn)化函數(shù)
- //*******************************************************************
- bit DACconversion(uchar sla,uchar c, uchar Val)
- {
- Start_I2c(); //啟動(dòng)總線
- SendByte(sla); //發(fā)送器件地址
- if(ack==0)return(0);
- SendByte(c); //發(fā)送控制字節(jié)
- if(ack==0)return(0);
- SendByte(Val); //發(fā)送DAC的數(shù)值
- if(ack==0)return(0);
- Stop_I2c(); //結(jié)束總線
- return(1);
- }
- //*******************************************************************
- //ADC發(fā)送字節(jié)[命令]數(shù)據(jù)函數(shù)
- //*******************************************************************
- bit ISendByte(uchar sla,uchar c)
- {
- Start_I2c(); //啟動(dòng)總線
- SendByte(sla); //發(fā)送器件地址
- if(ack==0)return(0);
- SendByte(c); //發(fā)送數(shù)據(jù)
- if(ack==0)return(0);
- Stop_I2c(); //結(jié)束總線
- return(1);
- }
- //*******************************************************************
- //ADC讀字節(jié)數(shù)據(jù)函數(shù)
- //*******************************************************************
- uchar IRcvByte(uchar sla)
- {
- uchar c;
- Start_I2c(); //啟動(dòng)總線
- SendByte(sla+1); //發(fā)送器件地址
- if(ack==0)return(0);
- c=RcvByte(); //讀取數(shù)據(jù)0
- Ack_I2c(1); //發(fā)送非就答位
- Stop_I2c(); //結(jié)束總線
- return(c);
- }
- ///*************************************************************************
- ///按鍵掃描函數(shù)
- ///*************************************************************************
- uchar keyscan()
- {
- KEY_PRESET(0X0F);
- if(temp!=0X0F)//是否有鍵按下
- {
- delay(10);
- temp=P1;
- temp=temp&0X0F;
- if(temp!=0X0F) //確實(shí)有鍵按下
- {
- key_flag=1;//按下鍵標(biāo)志位
- switch(temp)
- {
- case 0X0E:h=0;break; //行
- case 0X0D:h=1;break;
- case 0X0B:h=2;break;
- case 0X07:h=3;break;
- default:break;
- }
- KEY_PRESET(0XF0);
- switch(temp)
- {
- case 0XE0:l=0;break; //列
- case 0XD0:l=1;break;
- case 0XB0:l=2;break;
- case 0X70:l=3;break;
- default:break;
- }
- key_num=3*h+l;//按下鍵的鍵值
- if(key_num<=9) key_count++;
- while(temp!=0XF0)//等待釋放
- {
- temp=P1;
- temp=temp&0XF0;
- }
- }
- }
- return key_num;//返回鍵值
- }
- void get_Data()
- {
- uchar i;
- keyscan(); //鍵盤掃描
- if(key_flag==1)//有鍵按下
- {
- if(key_num<=9&&key_count<5) //只允許輸入一個(gè)四位的數(shù)值
- {
- if(key_count==1)//輸入電流值第一位
- {
- LCD_Manifest(2,4,keyscan());
- pian=keyscan();
- }
- if(key_count==2)//輸入電流值第二位
- {
- LCD_Manifest(2,5,keyscan());
- bai=keyscan();
- }
- if(key_count==3)//輸入電流值第三位
- {
- LCD_Manifest(2,6,keyscan());
- shi=keyscan();
- }
- if(key_count==4)//輸入電流值第四位
- {
- LCD_Manifest(2,7,keyscan());
- ge=keyscan();
- }
- key_flag=0; //按下鍵標(biāo)志位清零
- }
- if(key_num==10&&key_count>=4)//確認(rèn)鍵按下
- OK_flag=1;//確認(rèn)鍵按下標(biāo)志位
- if(key_num==11)//設(shè)置鍵按下
- {
- OK_flag=0;//確認(rèn)鍵按下標(biāo)志位清零
- key_count=0; //按下數(shù)字計(jì)數(shù)清零
- LCD_Write_Cmd(0x80);//數(shù)據(jù)指針定位到第一行第一個(gè)字處
- for(i=0;i<16;i++)
- LCD_Write_Data(str1[i]);//液晶顯示第一行待?
-
- LCD_Write_Cmd(0x80+0x40);//將數(shù)據(jù)指針定位到第二行第一個(gè)
- for(i=0;i<16;i++)
- LCD_Write_Data(str2[i]);//液晶顯示第二行寫
-
- }
- }
-
- }
- void set_Data()
- {
- if(OK_flag==1) //按下確定鍵,將數(shù)值送給DA
- {
- uchar i;
- key_value=pian*1000+bai*100+shi*10+ge;
- if(key_value>=310&&key_value<=3100)
- {
- key_value=key_value/5000*255;
- set_value=(uchar)key_value;//將按鍵輸入值變成整形賦給變量
-
- DACconversion(0x90,0x40,set_value) ; //DAC轉(zhuǎn)換
- delay(100);
-
- ISendByte(0x90,0x40);//通道一ADC轉(zhuǎn)換
- delay(100);
- back_voltage1=IRcvByte(0x90);
-
- back_current=back_voltage1*5000/255;
- dianliu[0]=back_current/1000;
- dianliu[1]=back_current%1000/100;
- dianliu[2]=back_current%1000%100/10;
- dianliu[3]=back_current%1000%100%10;
-
-
- LCD_Manifest(2,12,dianliu[0]);//輸出電流值千位
- LCD_Manifest(2,13,dianliu[1]);//輸出電流值百位
- LCD_Manifest(2,14,dianliu[2]);//輸出電流值十位
- LCD_Manifest(2,15,dianliu[3]);////輸出電流值個(gè)位
- }
- else
- {
-
- LCD_Write_Cmd(0x80+0x40);//將數(shù)據(jù)指針定位到第二行第一個(gè)
- for(i=0;i<16;i++)
- LCD_Write_Data(str3[i]);//液晶顯示第二行寫
- }
- }
- }
復(fù)制代碼
4. 系統(tǒng)仿真
4.1系統(tǒng)仿真圖:
圖8 系統(tǒng)仿真圖
4.2 PCB圖
圖9 PCB圖
4.3 3D視圖
圖10 3D視圖
5. 元器件清單列表
6. 設(shè)計(jì)總結(jié)
在查找資料的過程中,由于參數(shù)比較苛刻,所以很少有例子進(jìn)行參考,只得盡可能完成自己的設(shè)計(jì),在數(shù)模和模數(shù)轉(zhuǎn)換的芯片中,由于ADC0809和DAC0832兩個(gè)芯片所需引腳比較多,所以選擇比較簡單的PCF8591芯片,進(jìn)行設(shè)計(jì),但是同時(shí)也是導(dǎo)致電流難以達(dá)到設(shè)計(jì)要求,只能加大負(fù)載電壓,在電流源的設(shè)計(jì)中,由于做簡單模型,實(shí)際應(yīng)用仍需加許多的支路已達(dá)到供電電壓的濾波作用,本設(shè)計(jì)還有許多不能不完善的地方。在這次設(shè)計(jì)中,我發(fā)現(xiàn)一個(gè)完整的方案仍然會(huì)有很多不足之處,在實(shí)際的使用可能還有不穩(wěn)定的情況,所以,還需要努力學(xué)習(xí)。
51hei.png (4.52 KB, 下載次數(shù): 31)
下載附件
2020-1-6 01:49 上傳
全部資料51hei下載地址:
工業(yè)控制系統(tǒng)綜合設(shè)計(jì).zip
(695.03 KB, 下載次數(shù): 65)
2020-1-5 14:30 上傳
點(diǎn)擊文件名下載附件
內(nèi)含protues仿真文件
下載積分: 黑幣 -5
作者: 51hei團(tuán)團(tuán) 時(shí)間: 2020-1-6 02:11
好資料,51黑有你更精彩!!!
作者: leiteme 時(shí)間: 2020-6-30 19:37
這個(gè)設(shè)計(jì)好的不得了
作者: Lzin 時(shí)間: 2021-9-18 10:01
真不錯(cuò),很有用
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |