本文介紹采用STC89C52單片機為控制核心,運用稱重傳感器、運算放大器、A/D轉換器、LCD1602液晶顯示屏、蜂鳴器、上位機等器件與設備設計了一個具有超量程報警、LCD1602液晶屏實時顯示物體重量、上位機通過發送指定命令獲取所稱物體重量的功能的簡易電子秤。
最終設計出來的成品具有超量程報警功能、上位機通過發送相對應的命令獲取物體的重量并且顯示物體重量、下位機用LCD1602顯示物體重量的功能。
2 課題任務與要求
利用單片機和USB轉串口模塊設計實作串口通信壓力傳感器采集物體重量或壓力。
基本要求:將壓力資料,傳輸到上位機;上位機可發送命令,下位機回應命令發送資料,上位機具有數字顯示功能。
擴展要求:上位機LabVIEW、VC等撰寫上位機顯示、存盤功能程式,下位機液晶顯示通信資料。
3 設計需求分析
稱量重量需要一個稱重傳感器。稱重傳感器將重量轉換之后得到的是電壓,而電壓是一個模擬量,單片機只能處理數字量,因此要將壓力這個模擬量轉換成數字量,將模擬量轉換成數字量就要用到A/D轉換器;稱重傳感器的輸出只能是微弱的變化量,而A/D轉換器不能進行微弱信號的轉換,因此要先將微弱的變化量進行放大處理,那么就要用到運算放大器;要進行資料的轉換、資料顯示、串口 通信等功能就要用到單片機;將資料顯示出來要用到顯示幕,要進行超量程報警就要用報警器,報警器可以是燈光報警,也可以是聲音報警;要進行單片機與PC機串口通信就要用到USB轉串口模塊;將資料在PC機上顯示出來就要用到可視化界面顯示,可以用LabVIEW、VC等撰寫。
4 方案設計
4.1 總方案設計
電子秤可以分為7個部分。包括稱重傳感器、運算放大器電路、A/D轉換電路、單片機最小系統、報警電路、下位機顯示電路、上位機(PC機)顯示。系統總體框圖如圖4-1所示。
4.1.1 稱重傳感器
稱重傳感器是將非電量(質量或重量)轉換成電量的轉換元件,它是把支撐力變換成電壓的一種輔助元件。
4.1.2 運算放大器電路
運算放大器是將稱重傳感器所稱的重力這個非電量引數轉換成電量之后的微弱變化量進行放大處理,以便后級的A/D轉換器進行模數轉換。
4.1.3 A/D轉換電路
A/D轉換電路是用于將上一級的運算放大電路放大之后的電壓進行模數轉換,以便于后級的單片機進行資料的處理。
4.1.4 單片機最小系統
單片機最小系統包括時鐘電路及復位電路。單片機用于將A/D轉換器轉換之后的資料進行處理、具有將資料輸送至顯示電路顯示的功能、判斷所稱重量是否超過該系統傳感器的量程及判斷是否需要進行超量程報警處理、通過判斷上位機發送過來的命令判斷是否需要發送物體重量至上位機顯示。
4.1.5 報警電路
報警電路是用于通過單片機判斷所稱物體是否超過傳感器的量程來進行報警處理,可以給使用者一個直觀的提醒,以免負載過大導致電子秤損壞,造成不必要的損失。
4.1.6 下位機顯示電路
下位機顯示電路是用于顯示單片機處理之后的資料即物體的重量和一些其他必要的提示顯示等,這可以讓使用者更為直觀的看到所稱物體的重量,沒有顯示的電子秤是毫無意義。
4.1.7 上位機(PC機)
上位機可以實作單片機與其進行通信,上位機通過發送相對應的命令給單片機,單片機通過判斷上位機所發命令是否有效來判斷是否需要將所稱物體的重量發送至上位機,這樣就可以減少運程稱重使用者相對應的作業量,而且上位機還具有存盤資料的功能,還可以避免因記錄者的粗心大意出現錯誤造成不必要的損失。
圖4-1 總系統框圖
4.2系統硬體方案
4.2.1 單片機最小系統方案選擇
目前市面上有多種多樣的單片機,不同單片機有不同的功能及其優缺點,我們應該要選擇合適自己方案的單片機并且要考慮成本問題,由于該方案沒有要求什么特殊功能,所以選擇STC89C52單片機就可以實作設計要求的功能,并且該型號的單片機價格便宜,符合設計低成本的要求。
圖 4.2 STC89C52引腳圖
4.2.2顯示模塊選擇
顯示電路可以采用數碼管作為顯示電路,但是數碼管只能夠顯示數字,不能夠顯示字符,當我們需要顯示字符的時候數碼管顯示電路就不能夠實作我們的要求,因此不選擇數碼管作為顯示電路。能夠顯示字符的有LCD1602,OLED等顯示幕,但是OLED的編程控制比較復雜,并且價格也比較昂貴,因此不采用OLED顯示電路。相反,LCD1602具有撰寫代碼操作簡單,并且價格也便宜等優點,因此選擇LCD1602作為下位機的資料顯示。LCD1602實物圖如圖4-3所示。
圖 4-3 LCD1602實物圖
4.2.3傳感器方案選擇
稱重傳感器在電子稱中占有十分重要的位置,被譽為電子秤的心臟部件,它的性能好壞很大程度上決定了電子秤的精確度和穩定性。考慮到不同使用地點的重力加速度和空氣浮力對轉換的影響,稱重傳感器的性能指標主要有線性誤差、滯后誤差、重復性誤差、蠕變、零點溫度特性和靈敏度溫度特性等。在各種衡器和質量計量系統中,通常用綜合性誤差來衡量傳感器的準確度,并將綜合誤差與衡器誤差聯系起來,以便選用對應于某一種準確度衡量的稱重傳感器。國際法制計量組織規定,傳感器的誤差誤差占衡器誤差帶的70%,稱重傳感器的線性誤差、滯后誤差以及在規定溫度范圍內由于溫度對靈敏度的影響所引起的誤差等的總和不能超過誤差帶。若在惡略環境的條件下(如高溫、低溫、濕熱等),傳感器所占的誤差比例就更大。因此,在設計電子秤時,正確選擇稱重傳感器是非常重要的。
稱重傳感器按轉換方法分為光電式、電磁力式、液壓式、電容式、磁極變形式、振動式、陀螺儀式、電阻應變式等8大類,其中,電阻應變式使用范圍最廣。一下是各種不同傳感器的作業原理。
電容式傳感器:作業原理是利用電容器振蕩電路的振蕩頻率f與極板間距離d成正比的關系。極板有兩塊,一塊是固定不動的,另一塊是可移動的。在稱體加載重物時,兩極板間的距離發生變化,隨之,電路的振蕩頻率也改變。只要測出頻率的變化即可求出被測物的質量 。電容式傳感器耗電量少,造價低,準確度為1/200~1/500.
振動式傳感器的彈性元件是弦絲。當稱重臺上加有被測物時,V型弦絲的交點被拉向下,且左弦的拉力增大,右弦的拉力減小。兩根弦的固有頻率發生不同的變化。求出兩根弦的頻率之差,即可求出被測物體的質量。
陀螺儀式傳感器:轉子裝在內框架中,以角速度w繞X軸穩定旋轉。內框架經軸承與外框架連接,并可繞水平Y軸傾斜轉動。外框架經萬向聯軸節與機座聯接,并可繞垂直軸Z旋轉。轉子軸(X軸)在未受外力作用時保持水平狀態。轉子軸的一端在受到外力作用時,產生 傾斜而繞垂直Z軸轉動。進動角度w與外力成正比,通過檢測頻率的方法測出w,即可求出外力的大小,進而求出產生此外力的被測物的質量。
電阻應變式傳感器利用電阻應變片變形時其電阻也隨之改變的原理作業。主要由彈性元件、電阻應變片、測量電路和傳輸電纜4部分組成。電阻應變片貼在彈性元件上,彈性元件受力形變時,其上的應變片隨之變形,并導致電阻改變。測量電路測出應變片到電阻的變化并與外力大小成正比的電信號輸出。電信號經處理后以數字形式顯示出來被測物的質量。其計量準確度達1/1000~1/10000,結構簡單,可靠性好。
通過以上四種傳感器的作業原理及其一些特性可知,前三種傳感器都是通過測量頻率的改變數來計算出壓力的大小,但是,實際運用當中頻率的測量比較復雜,并且所用到的元器件也比較昂貴。因此,不選用前三種稱重傳感器,而是選用第四種電阻應變式稱重傳感器。電阻式稱重傳感器所需的測量量是電壓,電壓的測量比較簡單,并且其結構簡單、可靠性好、最重要的是準確度高。電阻式稱重傳感器實物圖如圖4-4所示。
圖 4-4 稱重傳感器實物圖
4.2.4 A/D轉化器及運算放大器的選擇
在實際的測量和控制系統中檢測到的通常是時間、數值都是連續變化的模擬量,模擬量要輸入到單片機當中進行處理,首先要經過模擬量到數字量的轉換,單片機才能接收、處理。目前市面上有多種型別的A/D轉換器,其型別有積分型、逐次逼近型、并行比較型、壓頻變換型等。各種不同型別的ADC各有其優缺點,并能滿足不同的要求。以下是不同A/D轉換器的作業原理及優缺點。
積分型ADC作業原理是將輸入電壓轉換成時間(脈沖寬度信號)或頻率(脈沖頻率),然后由定時器/計數器獲得數值。其優點是利用簡單的電路就能獲得高解析度,但其缺點是由于轉換精度依賴于積分時間,因此轉換速度極低。
逐次逼近型ADC由一個比較器和D/A轉換器通過逐次比較邏輯構成,從MSB開始,順序地對每一位輸入電壓與內置A/D轉換器輸出進行比較,經過n次比較而輸出數值。其優點是速度較高、功耗低、低解析度時價格低,但是高解析度時價格高。
并行比較型ADC采用多個比較器,僅做一次比較而實行轉換,又稱Flash(快速)型。由于轉換速率極高,n位的轉換需要2n-1個比較器,因此電路龐大,價格也高,只適用于視頻AD轉換器等速度特別高的領域。
由于A/D轉換器的精度取決于A/D轉換器的位數,但是位數高的A/D轉換器價格又比較高。而正好有一款芯片具有24位的A/D轉換器即HX711。HX711是一款專為高精度稱重傳感器而設計的24位A/D轉換器芯片。與同型別其它芯片相比,該芯片集成了包括穩壓電源、片內時鐘振蕩器等其它同型別芯片所需要的外圍電路,具有集成度高、回應速度快、抗干擾性強等優點。降低了電子秤的整機成本,提高了整機的性能和可靠性。該芯片與后端MCU芯片的介面和編程非常簡單,所有控制信號由管腳驅動,無需對芯片內部的暫存器編程。輸入選擇開關可任意選取通道A或通道B,與其內部的低噪聲可編程放大器相連。通道A的可編程增益為128或64,對應的滿額度差分輸入信號幅值分別為±20mV或±40mV。通道B則為固定的32增益,用于系統引數檢測。芯片內提供的穩壓電源可以直接向外部傳感器和芯片內的A/D轉換器提供電源,系統板上無需另外的模擬電源。芯片內的時鐘振蕩器不需要任何外接器件。上電自動復位功能簡化了開機的初始化程序。并且體積也很小,符合設計要求,這正好一舉兩得,不僅不用自己再設計運算放大器,而且還可以把實物體積作得更小,還可以節約成本。綜上所述,選用HX711芯片作為A/D轉換及運算放大器。HX711芯片實物圖如圖4-5所示。
圖4-5 HX711芯片
4.2.5報警電路選擇
報警可以是以聲音的形式報警,也可以是以燈光的形式報警,或則是以聲音跟燈光一起報警,為了更為直觀的知道報警,本設計采用聲音的形式進行報警。聲音形式的報警可以用揚聲器、蜂鳴器等。但考慮到成本問題,而蜂鳴器價格便宜,并且體積較小,因此選用蜂鳴器作為報警器。蜂鳴器又分為有源蜂鳴器和無源蜂鳴器,無源蜂鳴器需要脈沖才能發出響聲,而有源蜂鳴器只需要給高低電平就可以發出響聲,撰寫代碼簡單,因此,選擇有源蜂鳴器作為報警器。
4.2.6上位機顯示界面撰寫工具選擇
上位機顯示界面的撰寫工具有很多,例如:LabVIEW、VC、VB、VS、matlab等。并且它們各自有各自的優點及缺點。LabVIEW是一種用圖示代替文本行創建應用程式的圖形化編程語言。傳統文本編程語言根據陳述句和指令的先后順序決定程式執行順序,而LabVIEW則采用資料流編程方式,程式框圖中節點之間的資料流向決定了虛擬儀器及函式的執行順序,并且LabVIEW還提供很多外觀與傳統儀器(如示波器、萬用表)類似的控制元件,可用來方便地創建圖形化的界面使得編程及使用程序都生動有趣。并且撰寫框圖也比較簡單。綜上所述選擇LabVIEW作為上位機的軟體撰寫工具。
5 硬體設計
5.1 單片機最小系統設計
單片機最小系統分為三個部分,分別是電源、晶振電路、復位電路。
第一部分:電源
STC89C52單片機40腳接電源5V,20腳接電源負極,在單片機里面,負極也可以叫GND或者“地”,我們在單片機的應用中,習慣說負極為“地”,上面GND就是英文ground的縮寫,翻譯過來就是"地"的意思.
第二部分:晶振電路
因為本設計要與上位機進行通信,要用到串口,所以晶振要選擇11.0592M的,否則進行串口通信時會出現亂碼的現象。11.0592M晶振與單片機的18、19腳并聯,因為這兩只腳,就是晶振作業的引腳.30pf瓷介電容C2一端接18腳,一端接地.30pf瓷介電容C3一端接19腳,一端接地.這兩個電容,我們在10~30P之間選擇都是可以的,主要作用是,過濾掉晶振部分的高頻信號,讓晶振作業的時候更加穩定.
第三部分:復位組
復位電路由四角按鍵S1與10uf電解電容C1并聯,電解電容C1正極接5V電源,電解電容C1負極接單片機的復位腳即第9腳,10K電阻R2一端接單片機的復位腳即第9腳,另一端接地.就是通過這個10u和1k,就可以通過按下按鍵S1讓單片機進行復位,即從頭開始執行程式,這個就是復位的概念。
因為在本設計當中用到了P0口作為普通I/O口,因此要給P0口接上10k的上拉電阻。若不接上拉電阻則P0口的電平到不到高電平,即P0口不能作為普通I/O口使用。
圖 5-1 單片機最小系統
5.2 A/D轉換器及運算放大器設計(即HX711設計)
HX711分為兩端,一端為輸入端與稱重傳感器相連接,另一端為輸出與單片機相連。
串口通訊線由管腳PD_SCK和DOUT組成,用來輸出資料,選擇輸入通道和增益。當資料輸出管腳DOUT為高電平時,表明A/D轉換器還未準備好輸出資料,此時串口時鐘輸入信號PD_SCK應為低電平。當DOUT從高電平變低電平后,PD_SCK應輸入25至27個不等的時鐘脈沖。其中第一個時鐘脈沖的上升沿將讀出輸出24位資料的最高位(MSB),直至第24個時鐘脈沖完成,24位輸出資料從最高位至最低位逐位輸出完成。第25至27個時鐘脈沖用來選擇下一次A/D轉換的輸入通道和增益,參見表5.1。
表 5.1 輸入通道和增益選擇
PD_SCK的輸入時鐘脈沖數不應少于25或多于27,否則會造成串口通訊錯誤。當A/D轉換器的輸入通道或增益改變時,A/D轉換器需要4個資料輸出周期才能穩定。DOUT在4個資料輸出周期后才會從高電平變低電平,輸出有效資料。為了實作更高的精確度選擇增益為128的A通道與稱重傳感器相連接。
數字電源(DVDD)應使用與MCU芯片相同的的數字供電電源。HX711芯片內的穩壓電路可同時向A/D轉換器和外部傳感器提供模擬電源。穩壓電源的供電電壓(VSUP)可與數字電源(DVDD)相同。穩壓電源的輸出電壓值(VAVDD)由外部分壓電阻R4、R5和芯片的輸出參考電壓VBG決定,VAVDD=VBG(R4+R5)/R5。應選擇該輸出電壓比穩壓電源的輸入電壓(VSUP)低至少100mV。該電壓通過VAVDD=VBG(R4+R5)/R2計算。VBG為模塊基準電壓1.25v,R1=20K,R2=8.2K因此得出 VAVDD=4.3V。
圖5-2 HX711(即A/D與運放相結合)
5.3 LCD1602設計
LCD1602采用直接控制的方式進行資料顯示。即LCD1602的8根資料線與單片機的P1口相連進行資料輸入,3根控制線RS、R/W和EN分別與單片機的P0^1、P0^2、P0^3口相連后即可正常作業。一般應用中只須往LCD1602中寫入控制命令和相對應的顯示資料即可顯示。VO引腳是液晶對比度除錯端,通常連接一個10kΩ的滑動變阻器即可實作對比度的調整;也可采用將一個適當大小的電阻從該引腳接地的方法進行調整,不過電阻的大小應通過除錯決定,為了可以實作隨意調節對比度最終選擇接10K的滑動變阻器進行分壓處理,因為這樣可以方便除錯。圖5-3為LCD1602設計原理圖。
圖 5-3 LCD1602液晶顯示電路
5.4 蜂鳴器報警電路設計
由于自激蜂鳴器是直流電壓驅動的,不需要利用交流信號進行驅動,只需對驅動口輸出驅動電平并通過三極管放大驅動電流就能使蜂鳴器發出聲音,因此利用三極管9012對其進行電流驅動,9012基極接VCC,發射極接一個1K電阻再接到單片機P0^0口,集電極接有源蜂鳴器的正極,有源蜂鳴器負極接地。其電路圖如圖5-4所示。
圖5-4 蜂鳴器報警電路
6 軟體設計
6.1 總體流程圖
本電子秤系統的總流程圖如下圖所示
在使用任何外部設備即單片機內部硬體資源前都要對其進行初始化,因為該系統要用到單片機內部的串口和外部硬體設備LCD1602,所以首先對串口及LCD1602進行初始化。
通過判斷weight_shiwu的大小判斷有無物體放在稱臺上,若沒有則weight_shiwu=0,若有則進行A/D轉換及資料資料轉換。
判斷weight_shiwu的大小是否超出了稱重傳感器的量程范圍,若超出則進行蜂鳴器報警及1602超量程顯示提示,不超則1602顯示重量。
串口中斷判斷上位機是否向下位機發送命令,若發送命令則判斷命令是否有效,若有效則置flag=1,否則flag=0;
主程式通過判斷flag是否為1,為1則單片機向上位機發送給物體重量,并在上位機顯示。
以下為主程式部分代碼:
void main()
{
Uart_Init();
Init_LCD1602();
LCD1602_write_com(0x80);
Delay_ms(2000); //延時¨
Get_Maopi(); //獲取毛皮重量
while(1)
{
Get_Weight(); //獲取物體重量
LCD1602_write_com(0x01);
LCD1602_write_word("The weight is:"); //1602第一行顯示The weight is:
if( Flag_ERROR == 1) //判斷是否超量程
{
LCD1602_write_com(0x01);
Send_Word("out of the range!");
LCD1602_write_com(0x80+0x40);
LCD1602_write_word("out of the range!");
beep=0;
}
else if(Weight_Shiwu/1000==0)
{
beep=1;
if(Weight_Shiwu%1000/100==0)
{
if(Weight_Shiwu%100/10==0)
{
LCD1602_write_com(0x80+0x40);
LCD1602_write_data(Weight_Shiwu%10+0X30);
LCD1602_write_com(0x80+0x41);
LCD1602_write_word("g");
}
else {
LCD1602_write_com(0x80+0x40);
LCD1602_write_data(Weight_Shiwu%100/10+0X30);
LCD1602_write_com(0x80+0x41);
LCD1602_write_data(Weight_Shiwu%10+0X30);
LCD1602_write_com(0x80+0x42);
LCD1602_write_word("g");
}
}
else {
LCD1602_write_com(0x80+0x40);
LCD1602_write_data(Weight_Shiwu%1000/100+0X30);
LCD1602_write_com(0x80+0x41);
LCD1602_write_data(Weight_Shiwu%100/10+0X30);
LCD1602_write_com(0x80+0x42);
LCD1602_write_data(Weight_Shiwu%10+0X30);
LCD1602_write_com(0x80+0x43);
LCD1602_write_word("g");
}
}
else {
}
delay500ms();
if(flag==1)
{
ES=0;
if(Weight_Shiwu/1000==0)//第一位不為0的數開始顯示
{
if(Weight_Shiwu%1000/100==0)//
{
if(Weight_Shiwu%100/10==0)//
{
Send_ASCII(Weight_Shiwu%10 + 0X30);
Send_Word(" g\n");
}
else {
Send_ASCII(Weight_Shiwu%100/10 + 0X30);
Send_ASCII(Weight_Shiwu%10 + 0X30);
Send_Word(" g\n");
}
}
else {
Send_ASCII(Weight_Shiwu%1000/100 + 0X30);
Send_ASCII(Weight_Shiwu%100/10 + 0X30);
Send_ASCII(Weight_Shiwu%10 + 0X30);
Send_Word(" g\n");
}
}
else {
Send_ASCII(Weight_Shiwu/1000 + 0X30);
Send_ASCII(Weight_Shiwu%1000/100 + 0X30);
Send_ASCII(Weight_Shiwu%100/10 + 0X30);
Send_ASCII(Weight_Shiwu%10 + 0X30);
Send_Word(" g\n");
}
ES=1;
flag=0;
}
}
}
N
Y
Y Y
N
N
Y
圖 6-1 總體流程圖
6.2 串口中斷子程式流程圖
串口中斷子程式主要是判斷上位機發送該單片機的指令是否有效。
(1)若上位機發送命令給單片機則進入串口中斷
(2)令a等于內部緩沖暫存器的值,即上位機發送過來的命令
(3)判斷是否接受完,接受完軟體將RI清0
(4)判斷發送的命令是否有效,有效則置flag=1,否則置flag=0;
如圖6-2為串口中斷流程圖
N
Y
Y
圖 6-2 串口中斷子程式流程圖
串口子程式如下:
void ser() interrupt 4
{
if(RI)//檢測是否接受完
{
a=SBUF;
RI=0;//軟體對RI清0
if(a=='1')
flag=1;
else
flag=0;
}
}
6.3 HX711內部A/D轉換子程式流程圖
HX711是根據脈沖進行A/D轉換的,HX711_SCK每來一個脈沖進行一次A/D轉換,因為是24位A/D,所以需要24個脈沖進行A/D轉換,第25個脈沖進行資料轉換及通道選擇和增益的選擇。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/96276.html
標籤:單片機/工控
