1. 設計要求  如右圖所示,以MCS-51系列單片機為核心設計一個具有獨創功能的計量控制系統,控制瓶裝產品包裝生產流水線,每計滿一定瓶數產品時發出一個包裝控制信號,通過相關電路驅動包裝機完成一次包裝動作。要求: 1. 每箱產品的瓶數為51瓶,可記錄已封裝箱數; 2. 系統具有人機交互功能,可由用戶控制流水線工作速度,并實時顯示已計量瓶數和封裝箱數; 3. 流水線使用48V 2000W直流電機進行傳動,設計MCU與該電機的接口電路,實現流水線傳動的啟停和速度 控制,并仿真其可行性; 4. 設計用于檢測瓶子的 傳感器應用電路,實現對瓶數的感測; 5. 包裝機數據接口為 RS-485接口,設計MCU與包裝機的接口電路; 6. 包裝機的數據通信采用 10位異步串行通信幀標準格式,即1位起始位、8 位數據位、1 個停止位,無奇偶校驗和硬件數據流控制,通信波特率為 4800 bps,幀格式為:
每幀包含3個字節,第1個字節為同步頭字節“0xAA”,第2個字節為命令字節(“0x33”啟動包裝,“0x55”停機),第3個字節為校驗和(前面兩個字節的無符號代數和),設計、 編寫具體的通信程序并仿真; 7. 創新功能:在達到51瓶是蜂鳴器鳴叫提醒; 8. 設計、繪制系統電路PCB,手寫簽名在Top Layer的正中位置。 2. 硬件總體設計 2.1 總體設計方案 由設計要求可知,需使用MCS-51系列單片機,構建控制系統,實現系統的控制。所以采用AT89C52 單片機為核心,以6個彈跳按鈕和光電傳感器作為輸入端,達到控制直流電機的正轉、反轉、停止、加速、減速、數據清除及瓶子數量采集功能,并且由LCD1602顯示模塊可以顯示瓶子數量、箱子數量以及電機轉速。在設計中,采用 PWM 技術對電機進行控制,并通過485通訊協議控制包裝機的啟停。 該直流電機控制系統的設計,在總體上大致可分為以下8個部分組成:AT89C52單片機最小系統,按鍵輸入模塊,瓶數檢測模塊,1602顯示模塊,電機驅動模塊,包裝機控制模塊,包裝機控制模塊以及直流電機。系統總體方案圖如圖 1 所示。 圖 1 系統總體方案圖 2.2 工作原理 2.2.1 電機控制原理 根據勵磁方式不同, 直流電機分為自勵和他勵兩種類型。 不同勵磁方式的直流電機機械特性曲線有所不同。對于直流電機來說,認為機械特性方程式為:  (公式1) 式中U N,φN----------額定電樞電壓、額定磁通量; Ke,Kt ---與電機有關的常數; Rad,Ra -----電樞外加電阻、電樞內電阻; n,△n—理想空載轉速、轉速降。 分析公式1可得,當分別改變UN、φN和Rad時,可以得到不同的轉速n,從而實現對速度的調節。由于φ=T,當改變勵磁電流If時,可以改變磁通量φ的大小,從而達到變磁通調速的目的。但由于勵磁線圈發熱和電動機磁飽和的限制,電動機的勵磁電流If和磁通量φ只能在低于其額定值的范圍內調節,故只能弱磁調速。而對于調節電樞外加電阻 Rad時,會使機械特性變軟,導致電機帶負載能力減弱。 PWM是通過控制固定電壓的直流電源開關頻率,從而改變負載兩端的電壓,進而達AT89C52輸入模塊電源模塊驅動模塊直流電機達到控制要求的一種電壓調整方法。PWM可到控制要求的一種電壓調整方法。PWM 可以應用在許多方面,如電機調速、溫度控制、壓力控制等。 在 PWM 驅動控制的調整系統中,按一個固定的頻率來接通和斷開電源,并根據需要改變一個周期內“接通”和“斷開”時間的長短。通過改變直流電機電樞上電壓的“占空比”來改變平均電壓的大小,從而控制電動機的轉速。因此,PWM 又被稱為“開關驅動裝置”。在脈沖作用下,當電機通電時,速度增加;電機斷電時,速度逐漸減少。只要按一定規律,改變通、斷電的時間,即可讓電機轉速得到控制。當我們改變占空比時,可以得到不同的電機平均速度,從而達到調速的目的。以應用在許多方面,如電機調速、溫度控制、壓力控制等。在PWM 驅動控制的調整系統中,按一個固定的頻率來接通和斷開電源,并根據需要改變一個周期內“接通”和“斷開”時間的長短。通過改變直流電機電樞上電壓的“占空比”來改變平均電壓的大小,從而控制電動機的轉速。因此,PWM又被稱為“開關驅動裝置”。在脈沖作用下,當電機通電時,速度增加;電機斷電時,速度逐漸減少。只要按一定規律,改變通、斷電的時間,即可讓電機轉速得到控制。當我們改變占空比時,可以得到不同的電機平均速度,從而達到調速的目的。 2.2.2 光電傳感器原理 光電傳感器是通過把光強度的變化轉換成電信號的變化來實現控制的。 光電傳感器在一般情況下,有三部分構成,它們分為:發送器、接收器和檢測電路。 發送器對準目標發射光束,發射的光束一般來源于半導體光源,發光二極管(LED)、激光二極管及紅外發射二極管。光束不間斷地發射,或者改變脈沖寬度。接收器有光電二極管、光電三極管、光電池組成。在接收器的前面,裝有光學元件如透鏡和光圈等。在其后面是檢測電路,它能濾出有效信號和應用該信號。 此外,光電開關的結構元件中還有發射板和光導纖維。 三角反射板是結構牢固的發射裝置。它由很小的三角錐體反射材料組成,能夠使光束準確地從反射板中返回,具有實用意義。它可以在與光軸0到25的范圍改變發射角,使光束幾乎是從一根發射線,經過反射后,還是從這根反射線返回。 2.3 AT89C52最小系統 2.3.1 AT89C52芯片簡介 采用AT89C52是MSC-51系列單片機的升級版,由世界著名半導體公司 ATMEL在購買MSC-51設計結構后,利用自身優勢技術——閃存生產技術對舊技術進行改進和擴展,同時使用新的半導體生產工藝,最終得到成型產品。與此同時,世界上其他的著名公司也通過基本的51內核,結合公司自身技術進行改進生產,推廣了一批如51F020等高性能單片機。AT89C52片內集成256字節程序運行空間, 8K字節Flash存儲空間,支持最大64k外部存儲擴展。根據不同的運行速度和功耗的要求,時鐘頻率可以設置在0-33M之間。片內資源有4組I/O控制端口、3個定時器、8個中斷、軟件設置低耗能模式、看門狗和斷電保護。可以在4V到5.5V寬電壓范圍內正常工作。不斷發展的半導體工藝也讓該單片機的功耗不斷降低。同時,該單片機支持計算機并口下載,簡單的數字芯片就可以制成下載線,僅僅幾塊錢的價格讓該型號單片機暢銷 10 年不衰。根據不同場合的要求,這款單片機提供了多種封裝,本次設計根據最小系統有時需要更換單片機的具體情況,使用雙列直插PID-40 的封裝。 2.3.2 AT89C52最小系統組成 AT89C52最小系統由AT89C52芯片、復位電路和時鐘電路組成。復位電路和時鐘電路是維持單片機最小系統運行的基本模塊。時鐘電路采用12M晶振組成。復位電路通常分為兩種:上電復位和手動復位。有時系統在運行過程中出現程序跑飛的情況,在程序開發過程中,經常需要手動復位,所以本次設計選用手動復位。 圖2 AT89C52最小系統圖 2.4輸入模塊 正轉、反轉、停止、加速、減速、清除數據六個按鈕分別與單片機的 P1.0、P1.1、P1.2、P1.3、P1.4、P1.5相連,然后再與地相連,當按鈕被按下時51芯片管腳電壓被拉低,檢測管腳電平實現按鈕檢測。正轉實現直流電機的正轉,反轉實現直流電機的反轉,停止實現直流電機的停轉,加速實現直流電機的加速,減速實現直流電機的減速,清除數據實現瓶子數量和箱子數量的清除,具體輸入模塊如下: 圖3 按鍵輸入模塊 2.5 LCD1602顯示模塊 2.5.1 LCD1602簡介 點陣圖形式液晶由M×N個顯示單元組成,假設LCD顯示屏有64行,每行有128列,每8列對應1字節的8位,即每行由16字節,共16×8=128個點組成。顯示屏上64×16個顯示單元與顯示RAM區的1024字節相對應,每一字節的內容與顯示屏上相應位置的亮暗對應。例如顯示屏第一行的亮暗由RAM區的000H~00FH的16字節的內容決定,當(000H)=FFH時,屏幕左上角顯示一條短亮線,長度為8個點;當(3FFH)=FFH時,屏幕右下角顯示一條短亮線;當(000H)=FFH,(001H)=00H,(002H)=00H…,(00EH)=00H,(00FH)=00H時,在屏幕的頂部顯示一條由8條亮線和8條暗線組成的虛線。這就是LCD顯示的基本原理。 字符型液晶顯示模塊是一種專門用于顯示字母、數字和符號等的點陣式LCD,目前常用16×1,16×2,20×2和40×2等的模塊。一般的LCD1602字符型液晶顯示器的內部控制器大部分為HD44780,能夠顯示英文字母、阿拉伯數字、日文片假名和一般性符號。 2.5.2 LCD1602連接與控制 LCD1602顯示模塊與單片機P2.5、P2.6、P2.7以及P0口連接,通過單片機編寫LCD控制子程序,實現LCD1602的數據傳輸和顯示控制。 圖4 轉速顯示模塊 2.6 包裝機控制模塊 通過兩片MAX487芯片連接構成485通信模塊,通過單片機P3.0和P3.1實現單片機與MAX487芯片的串口通信傳輸數據,以實現包裝機的啟停控制。 通過51單片機自帶的串口通訊實現連接,設置定時器1實現串口通訊的控制,定時器1設置工作于方式2,開啟定時器的串口通信的相關寄存器,通過SBUF寄存器發送數據。 定時器1寄存器設置: TMOD=0x21;//定時器1工作于方式2 TL1=0xfa;//波特率設置為4800 TH1=0xfa;//波特率設置為4800 SCON=0x50;//串行口設置為方式1,REN置1時允許接收數據 PCON &= 0xef;//PCON寄存器設置 TR1=1;//開定時器1
圖5 包裝機控制模塊
2.7 蜂鳴器控制模塊 通過三極管控制電路的通斷以實現蜂鳴器的鳴叫控制,實現包裝機開動提醒。通過P1.6的通斷時間控制蜂鳴器的鳴叫? 圖6蜂鳴器控制模塊 2.8電機驅動模塊 由設計要求可知,電機為額定電壓為48V的直流電機,PWM的頻率為50HZ,電機控制的最高轉速為450rpm,最低轉速為50rpm。采用L6203芯片驅動直流電機,連接單片機的P3.0、P3.1、P3.7口,P3.0、P3.1分別控制電機的正反轉,P3.7控制L6203芯片的通斷。當P3.0=1,P3.1=0時,電機正轉,當P3.0=0,P3.1=1時,電機反轉。為了控制直流電機的轉速,為1的單片機I/O口采用PWM控制的方法控制電機的電壓,以控制電機的轉速。 PWM的實現:通過單片機的定時中斷,實現頻率為50HZ,即周期接近0.02s的PWM。為了實現占空比控制,將中斷的時間設置為.1ms,通過20次的中斷實現以頻率為50HZ。 中斷的初值:  ;// 1ms中斷  ; 轉速計算:轉速 = 占空比*500 圖7電機驅動模塊
2.9瓶子檢測模塊 由于PROTUES沒有光電傳感器的仿真模型,只能使用光耦模擬瓶子經過是遮住光電傳感器,通過單片機P1.7口檢測瓶子經過時的電平拉高,實現瓶數計數。 圖8 瓶子檢測模塊 3. 程序設計 3.1主程序:
- ///*************************************************************************
- /// 工業生產中的產品數量自動計量系統創新設計
- ///功能:流水線電機控制,產品數量檢測,LCD1602顯示以及包裝機控制
- ///*************************************************************************
- #include<reg52.h> ///包含頭文件
- #include<MAIN.h>
- #include<lcd1602.h>
-
- //#define uint unsigned int
- //#define uchar unsigned char
- //#define ulong unsigned long
-
- sbit zheng = P1^0;
- sbit fan = P1^1;
- sbit ting = P1^2;
- sbit jia = P1^3;
- sbit jian = P1^4;
- sbit clear = P1^5;
- sbit bee = P1^6;
- sbit pingzi = P1^7;
- sbit PWM1 = P2^0;
- sbit PWM2 = P2^1;
- sbit ena = P2^2;
- sbit max = P2^3;
-
-
- uint bottle=0;
- uint box=0;
- uint zhuansu[4]={0,0,0,0};
- uint PZ[4]={0,0,0,0};
- uchar str1[16]="bottle:00 box:00";
- uchar str2[16]="speed:0000 ";
- uchar time;
- uchar count;
- ulong zhuan;
- flag=1;
-
- ///*************************************************************************
- /// MAIN函數
- ///功能:
- ///*************************************************************************
- void main()
- {
- timer_init();
- LCD_Init();
- ena=0;
- bee=0;
- max=1;
- while(1)
- {
- cleardate();
- zhengz();
- fanz();
- tingz();
- jias();
- jians();
- LCD();
- pingshu();
-
- }
- }
- ///*************************************************************************
- /// 延時函數
- ///功能:
- ///*************************************************************************
- void delay1(uint z)// 延時程序,zms.
- {
- uint x,y;
- for(y=z;x>0;x--)
- for(y=110;y>0;y--);
- }
-
-
- ///*************************************************************************
- /// 數據計算函數
- ///功能:
- ///*************************************************************************
- void chuli()
- {
-
- zhuan=count*500/20;
- zhuansu[0]=(count*10/1000); //轉換轉速的千位
- zhuansu[1]=(zhuan/100%10); //轉換轉速的百位
- zhuansu[2]=(zhuan/10%10); //轉換轉速的十位
- zhuansu[3]=(zhuan%10); //轉換轉速的個位
- PZ[0]= (bottle/10%10); //瓶數十位
- PZ[1]= (bottle%10);//瓶數個位
- PZ[2]= (box/10%10);// 箱數十位
- PZ[3]= (box%10); // 箱數個位
-
- }
-
- ///*************************************************************************
- /// 清除數據函數
- ///功能:
- ///*************************************************************************
- void cleardate()
- {
- if(clear==0)
- {
- delay1(2);
- if(clear==0)
- {
- LCD_Clear();
- LCD_Init();
- bottle=0;
- box=0;
- chuli();
- }
- }
- }
-
-
-
- ///*************************************************************************
- /// LCD顯示函數
- ///功能:
- ///*************************************************************************
- void LCD()
- {
- LCD_Manifest(1,7,PZ[0]);
- LCD_Manifest(1,8,PZ[1]);
- LCD_Manifest(1,14,PZ[2]);
- LCD_Manifest(1,15,PZ[3]);
-
- LCD_Manifest(2,6,zhuansu[0]);
- LCD_Manifest(2,7,zhuansu[1]);
- LCD_Manifest(2,8,zhuansu[2]);
- LCD_Manifest(2,9,zhuansu[3]);
-
- }
- ///*************************************************************************
- /// 蜂鳴器控制函數
- ///功能:
- ///*************************************************************************
- void beebee()
- {
- bee=0;
- delay(100);
- bee=1;
- delay(100);
- bee=0;
-
- }
-
- //*************************************************************************
- /// rs485發送
- ///功能:
- ///*************************************************************************
- void rs485send(uchar date) //rs485發送
- {
- SBUF=date;
- while(!TI);
- TI=0;
- }
-
- void rs485open() //包裝機rs485開啟指令
- {
- rs485send((uchar)0xAA);
- delay1(100);
- rs485send((uchar)0x33);
- delay1(100);
- rs485send((uchar)0xDD);
- delay1(100);
- }
-
- void rs485stop() //包裝機rs485停止指令
- {
- rs485send((uchar)0xAA);
- delay1(100);
- rs485send((uchar)0x55);
- delay1(100);
- rs485send((uchar)0xFF);
- delay1(100);
- }
-
- ///*************************************************************************
- ///流水線控制
- ///功能:流水線瓶子數量測量,箱數測量及包裝機控制
- ///*************************************************************************
-
- void pingshu()
- {
- if(pingzi==1)
- {
- delay1(2);
- if(pingzi==1)
- {
- bottle+=1;
- if(bottle>51)
- {
- ulong i;
- beebee();
- bottle=1;
- if(box<=99) {box+=1;}
- else box=0;
- delay1(100);
- rs485open();
- for(i=0;i<1000;i++)
- {delay1(200);}
- rs485stop();
- }
- chuli();
- }
- while(!pingzi);
- }
- }
-
-
- ///*************************************************************************
- ///按鍵輸入模塊
- ///功能:實現正轉,反轉,啟停,加速,減速、清除數據
- ///*************************************************************************
- void zhengz()
- {
- if(zheng==0)
- {
- delay1(2);
- if(zheng==0)
- {
- flag=1;
- }
- while(!zheng);
- }
- }
-
- void fanz()
- {
- if(fan==0)
- {
- delay1(2);
- if(fan==0)
- {
- flag=0;
- }
- while(!fan);
- }
- }
-
- void tingz()
- {
- if(ting==0)
- {
- delay1(2);
- if(ting==0)
- {
- ena=~ena;
- if(ena==0)
- {
- count=0;
- }
- else count=10;
- chuli();
- }
- while(!ting);
- }
- }
-
- void jias()
- {
- if(jia==0)
- {
- delay1(2);
- if(jia==0)
- {
- if(count<18)
- {
- count+=2;
- }
- else
- {
- count=18;
- }
- chuli();
- }
- while(!jia);
- }
- }
-
- void jians()
- {
- if(jian==0)
- {
- delay1(2);
- if(jian==0)
- {
- if(count>2)
- {
- count-=2;
- }
- else
- {
- count=2;
- }
- chuli();
- }
- while(!jian);
- }
- }
- ///*************************************************************************
- /// 定時器0初始化
- ///功能:
- ///*************************************************************************
- void timer_init(void)
- {
- TMOD=0x21;//定時器0工作于方式1,定時器1工作于方式2
- TH0=(65536-1000)/256;//1ms中斷
- TL0=(65536-1000)%256;
- TL1=0xfa;//波特率設置為4800
- TH1=0xfa;//波特率設置為4800
- SCON=0x50;//串行口方式設置為方式1,REN置1時允許接收數據
- PCON &= 0xef;//PCON寄存器設置
- TR0=1;
- TR1=1;
- ET0=1;
- EA=1;
- }
-
- ///*************************************************************************
- /// 定時器0中斷程序
- ///功能:
- ///*************************************************************************
- void timer0_int(void) interrupt 1
- {
- TR0=0;//設置定時器初值期間,關閉定時器
- TH0=(65536-1000)/256;//1ms中斷
- TL0=(65536-1000)%256;
- TR0=1;
- time++;
- if(flag==1)// 電機正轉
- {
- PWM2=0;
- if(time<count)
- {
- PWM1=1;
- }
- else
- PWM1=0;
- if(time>20)
- {
- time=0;
- }
- }
- else // 電機反轉
- {
- PWM1=0;
- if(time<count)
- {
- PWM2=1;
- }
- else
- PWM2=0;
- if(time>20)
- {
- time=0;
- }
- }
- }
-
- 3.2 LCD1602子程序:
- ///*************************************************************************
- /// LCD1602子程序
- ///功能:實現LCD1602的控制程序集成
- ///*************************************************************************
- #include<lcd1602.h>
-
-
- sbit LCD_RS=P2^6;//數據命令選擇端
- sbit LCD_WR=P2^5;//數據讀寫端
- sbit LCD_E=P2^7;//液晶使能端
-
-
- void delay(uchar z)//延時函數
- {
- unsigned char x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
-
- void LCD_Write_Cmd(uchar com)//液晶寫命令
- {
- LCD_RS=0;//選擇寫命令模式
- LCD_WR=0;
- delay(1);
- LCD_E=1;//使能端給一高脈沖,高脈沖有效
- delay(1);
- LCDdate=com;//將要寫的命令字送到數據總線上
- delay(1);
- LCD_E=0;
- }
-
- void LCD_Write_Data(uchar date)//數據寫命令
- {
- LCD_RS=1;//選擇寫數據模式
- LCD_WR=0;
- delay(1);
- LCD_E=1;//使能端給一高脈沖,高脈沖有效
- delay(1);
- LCDdate=date;
- delay(1);
- LCD_E=0;
- }
-
- void LCD_Clear(void) // 清屏函數
- {
- LCD_Write_Cmd(0x01);
- delay(5);
- }
-
- void LCD_Init()//液晶初始化
- {
- uchar i;
- LCD_Write_Cmd(0x38);//設置16*2顯示,5*7點陣,8位數據接口
- delay(5);
- LCD_Write_Cmd(0x08); //設置顯示關閉
- LCD_Clear();//清屏
- LCD_Write_Cmd(0x06);//寫一個字符后地址指針自動加1
- delay(5);
- LCD_Write_Cmd(0x0c);//設置開顯示,不顯示光標
- LCD_Write_Cmd(0x80);//數據指針定位到第一行第一個字處
- for(i=0;i<16;i++)
- LCD_Write_Data(str1[i]);//液晶顯示第一行寫數據
- LCD_Write_Cmd(0x80+0x40);//將數據指針定位到第二行第一個
- for(i=0;i<16;i++)
- LCD_Write_Data(str2[i]);//液晶顯示第二行寫數據
- }
-
- void LCD_Manifest(uchar row,uchar add,uchar date)
- {
- if(row==1) LCD_Write_Cmd(0x80+add);
- if(row==2) LCD_Write_Cmd(0xc0+add);
- LCD_Write_Data(0x30+date);
- }
復制代碼
4. 系統仿真 4.1系統仿真圖: 圖9 系統仿真圖 4.2 PCB圖 圖10 PCB圖
4.3 3D視圖
圖11 3D視圖 5. 元器件清單列表
6. 設計總結 設計之中,我遇到了很多現實的問題, PROTUES中的沒有仿真模型,以及AD16軟件中有些元件沒有原理圖和PCB封裝,需要自己按照手冊自己畫出來,所以自己需要想辦法進行模擬仿真,AD16沒有的封裝需要去網上尋找別人的設計的,實在找不到的只能自己畫PCB。在10天的時間,經過查閱資料,發現擁有驅動48V3A的直流電機的芯片非常少,很不容易才找到了L6203芯片,但是也沒能達到合適的要求,經過自己搭建H橋,但是三極管的查找花費了許多的時間。所以最終只能實現電機的啟停控制,正反轉控制,加減速控制,數據清除。在這次的設計中,發現一個簡單的系統并不容易實現,需花費大量時間在查閱資料上面,并且最好將系統分成小塊來一個一個解決,這樣才能思路清晰,所以要加強自己的基礎知識積累以及學習的方式方法。
全部資料51hei下載地址:
工廠自動化.zip
(588.75 KB, 下載次數: 43)
2020-1-5 14:39 上傳
點擊文件名下載附件
內含protues仿真文件,希望有能提供48V電機控制的大佬
|