LabVIEW Arduino電子稱重系統(tǒng)(項(xiàng)目篇—1)
1
項(xiàng)目概述
質(zhì)量是物理學(xué)中的7個(gè)基本量綱之一。在工業(yè)生產(chǎn)和日常生活中,我們都需要獲取一個(gè)物體的質(zhì)量,比如購(gòu)買某件商品時(shí),需要確定其質(zhì)量大小,或者以質(zhì)量作為中間量以進(jìn)一步獲得物體的其他參數(shù),如質(zhì)心、偏心等。
稱重傳感器實(shí)際上是一種將質(zhì)量信號(hào)轉(zhuǎn)變?yōu)榭蓽y(cè)量的電信號(hào)輸出的裝置。按照轉(zhuǎn)換方法的不同,稱重傳感器分為光電式、液壓式、電磁力式、電容式、磁極變形式、振動(dòng)式、陀螺儀式、電阻應(yīng)變式8類,其中,電阻應(yīng)變式的使用最為廣泛。
電阻應(yīng)變式稱重傳感器的工作原理:彈性體(彈性元件、敏感梁)在外力作用下產(chǎn)生彈性變形,使粘貼在它表面的電阻應(yīng)變片(轉(zhuǎn)換元件)也隨同產(chǎn)生變形,電阻應(yīng)變片變形后,它的阻值將發(fā)生變化(增大或減?。?,再經(jīng)相應(yīng)的測(cè)量電路把這一電阻變化轉(zhuǎn)換為電信號(hào)(電壓或電流),從而完成將外力變換為電信號(hào)的過程。
由此可見,電阻應(yīng)變片、彈性體和檢測(cè)電路是電阻應(yīng)變式稱重傳感器中不可缺少的組成部分,下面簡(jiǎn)述這三者的作用。
電阻應(yīng)變片
電阻應(yīng)變片是把一根電阻絲均勻地分布在一塊有機(jī)材料制成的基底上,即成為一片應(yīng)變片,其最重要的參數(shù)是靈敏系數(shù)K。
需要說明的是:靈敏度系數(shù)K值的大小是由制作金屬電阻絲材料的性質(zhì)決定的一個(gè)常數(shù),它和應(yīng)變片的形狀、尺寸大小無關(guān),不同的材料的K值一般在1.7~3.6。其次K值是一個(gè)無因次量,即它沒有量綱。
彈性體
彈性體是一個(gè)有特殊形狀的結(jié)構(gòu)件,有兩個(gè)功能,首先是它承受稱重傳感器所受的外力,對(duì)外力產(chǎn)生反作用力,達(dá)到相對(duì)靜平衡。其次,它要產(chǎn)生一個(gè)高品質(zhì)的應(yīng)變場(chǎng)(區(qū)),使粘貼在此區(qū)的電阻應(yīng)變片比較理想地完成機(jī)械形變至電信號(hào)的轉(zhuǎn)換。
需要說明的是,上面分析的應(yīng)力狀態(tài)均是“局部"情況,而應(yīng)變片實(shí)際感受的是“平均"狀態(tài)。
檢測(cè)電路
檢測(cè)電路的功能是把電阻應(yīng)變片的電阻變化轉(zhuǎn)變?yōu)殡妷狠敵?。因?yàn)榛菟沟请姌蚓哂泻芏鄡?yōu)點(diǎn),如可以抑制溫度變化的影響,可以抑制側(cè)向力干擾,可以比較方便地解決稱重傳感器的補(bǔ)償問題等,所以惠斯登電橋在稱重傳感器中得到了廣泛的應(yīng)用。因?yàn)槿珮蚴降缺垭姌虻撵`敏度最高,各臂參數(shù)一致,各種干擾的影響容易相互抵消,所以稱重傳感器均采用全橋式等臂電橋。
稱重傳感器的出線方式有4線和6線兩種,模塊或稱重變送器的接線也有4線和6線兩種,接線原則是:傳感器能接6線的不接4線,必須接4線的就要進(jìn)行短接。
一般的稱重傳感器都是六線制的,當(dāng)接成四線制時(shí),電源線(EXC-,EXC+)與反饋線(SEN-,SEN+)就分別短接了。SEN+和SEN-是補(bǔ)償線路電阻用的,SEN+和EXC+是通路的,SEN-和EXC-是通路的。EXC+和EXC-是給稱重傳感器供電的,但是由于稱重模塊和傳感器之間的線路損耗,實(shí)際上傳感器接收到的電壓會(huì)小于供電電壓。
每個(gè)稱重傳感器都有一個(gè)mV/V的特性,它輸出的mV信號(hào)與接收到的電壓密切相關(guān),SENS+和SENS-實(shí)際上是稱重傳感器內(nèi)的一個(gè)高阻抗回路,可以將稱重模塊實(shí)際接收到的電壓反饋給稱重模塊。在稱重傳感器上將EXC+與SENS+短接,EXC-與SENS-短接,僅限于傳感器與稱重模塊距離較近,電壓損耗非常小的場(chǎng)合,否則測(cè)量存在誤差。稱重傳感器實(shí)物如下圖所示:
2
項(xiàng)目架構(gòu)
本篇博文將介紹使用應(yīng)變式稱重傳感器、HX711模塊、Arduino Uno和LabVIEW組成上下位機(jī)小量程電子稱重系統(tǒng),系統(tǒng)框圖如下圖所示:
項(xiàng)目架構(gòu)
Arduino Uno作為下位機(jī),負(fù)責(zé)HX711的讀寫以及數(shù)據(jù)傳輸,LabVIEW編寫的顯示軟件作為上位機(jī),上下位機(jī)利用USB-TTL接口實(shí)現(xiàn)通信。另外,還可以通過此系統(tǒng)對(duì)未知傳感器進(jìn)行標(biāo)定,以修正誤差,提高測(cè)量精度。
HX711是一款專為高精度稱重傳感器而設(shè)計(jì)的24位A/D轉(zhuǎn)換器芯片。與同類型其他芯片相比,該芯片集成了包括穩(wěn)壓電源、片內(nèi)時(shí)鐘振蕩器等其他同類型芯片所需要的外圍電路,具有集成度高、響應(yīng)速度快、抗干擾性強(qiáng)等優(yōu)點(diǎn)。
HX711降低了電子稱重的整機(jī)成本,提高了整機(jī)的性能和可靠性。該芯片與后端MCU芯片的接口和編程非常簡(jiǎn)單,所有控制信號(hào)由管腳驅(qū)動(dòng),無需對(duì)芯片內(nèi)部的寄存器編程。輸入選擇開關(guān)可任意選取通道A或通道B,與其內(nèi)部的低噪聲可編程放大器相連。
3
硬件環(huán)境
將HX711模塊的VCC、GND、SCK和DOUT分別接至Arduino Uno控制器的5V、GND、D9和D10;并將HX711模塊的E+、E-、A+和A-分別接稱重傳感器的激勵(lì)電壓正、負(fù),輸出電壓正、負(fù)(具體接線請(qǐng)查閱所使用的傳感器接線說明),最后將HX711模塊的B+和B-接GND。
為了減少干擾信號(hào),HX711高精度A/D模塊與電阻式稱重傳感器之間的連接線應(yīng)盡量短,過長(zhǎng)的話會(huì)受到干擾,HX711高精度A/D模塊與Arduino Uno控制器之間的連接線也應(yīng)該盡量短。若一定需要延長(zhǎng)線,則最好使用帶電磁屏蔽的電纜線。效果如下圖所示:
4
Arduino功能設(shè)計(jì)
Arduino下位機(jī)部分需要完成以下功能:讀取和傳輸稱重傳感器的輸出信號(hào),Arduino Uno控制板通過USB-TTL電纜接收上位機(jī)發(fā)來的命令,完成稱重傳感器的數(shù)據(jù)讀取之后,并將數(shù)據(jù)回傳至LabVIEW上位機(jī)軟件。HX711模塊主要完成輸出信號(hào)的高精度A/D轉(zhuǎn)換和給稱重傳感器提供激勵(lì)電源。
另外,還需要查看具體傳感器的靈敏度,以計(jì)算滿量程電壓和增益倍數(shù)。滿量程電壓的計(jì)算公式為︰滿量程輸出電壓=激勵(lì)電壓×靈敏度。以靈敏度1.0mV/V為例,假設(shè)供電電壓為5V,則滿量程電壓為5mV。
通過實(shí)際測(cè)量,HX711高精度A/D模塊輸出的供電電壓為4V左右,則傳感器滿量程電壓為4mV。由于HX711高精度A/D模塊增益倍數(shù)為128或64對(duì)應(yīng)的滿量程差分輸入電壓分別為±20mV或±40mV。為了獲得更高的精度,選擇增益倍數(shù)為128倍。
Arduino Uno控制器負(fù)責(zé)讀取LabVIEW上位機(jī)發(fā)來的質(zhì)量測(cè)量命令,并通過HX71獲取稱重傳感器輸出的電壓值,通過串口發(fā)送回上位機(jī)LabVIEW軟件。Arduino Uno控制器的程序代碼如代碼如下所示:
#include <HX711.h>HX711 hx(9, 10,128);#define HX711_COMMAND 0x10 //采集命令字 byte comdata[3]={0}; //定義數(shù)組數(shù)據(jù),存放串口接收數(shù)據(jù) void receive_data(void); //接受串口數(shù)據(jù)void test_do_data(void); //測(cè)試串口數(shù)據(jù)是否正確,并更新數(shù)據(jù)double sum = 0; void setup(){ Serial.begin(9600); }void loop(){ while (Serial.available() > 0) //不斷檢測(cè)串口是否有數(shù)據(jù) { receive_data(); //接受串口數(shù)據(jù) test_do_data(); //測(cè)試數(shù)據(jù)是否正確并更新標(biāo)志位 }}void receive_data(void) { int i ; for(i=0;i<3;i++) { comdata[i] =Serial.read(); //延時(shí)一會(huì),讓串口緩存準(zhǔn)備好下一個(gè)字節(jié),不延時(shí)可能會(huì)導(dǎo)致數(shù)據(jù)丟失, delay(2); }} void test_do_data(void){ if(comdata[0] == 0x55) //0x55和0xAA均為判斷是否為有效命令 { if(comdata[1] == 0xAA) { if(comdata[2] == HX711_COMMAND) { for (int i = 0; i < 10; i++){ sum += hx.read();} Serial.println(sum/10,2); } } }}
5
LabVIEW功能設(shè)計(jì)
LabVIEW上位機(jī)部分需要完成以下功能:
1、向下位機(jī)Arduino控制器發(fā)送電壓采集命令,Arduino控制器通過串口接收上位機(jī)命令,完成相應(yīng)的數(shù)據(jù)采集之后并將采集的數(shù)據(jù)回傳,LabVIEW軟件將回傳的數(shù)據(jù)轉(zhuǎn)換為質(zhì)量并顯示在前面板上。
2、通過使用標(biāo)準(zhǔn)砝碼對(duì)稱重系統(tǒng)進(jìn)行標(biāo)定,以獲得稱重傳感器的輸出電壓與質(zhì)量的關(guān)系,從而擬合出傳感器的輸出電壓與質(zhì)量的標(biāo)定系數(shù),用于將傳感器的輸出電壓換算為所稱量的質(zhì)量,而且通過精確的砝碼對(duì)稱重系統(tǒng)進(jìn)行多次標(biāo)定,有利于提高整個(gè)稱重系統(tǒng)的測(cè)量精度。
5.1、前面板設(shè)計(jì)
LabVIEW前面板分為稱重和標(biāo)定兩個(gè)部分,稱重部分主要有讀取標(biāo)定系數(shù)、單次稱重、多次稱重取平均值。標(biāo)定部分主要有5階正反行程的標(biāo)定、計(jì)算擬合系數(shù)和保存擬合系數(shù)。同時(shí),在標(biāo)定部分設(shè)有一個(gè)超時(shí)測(cè)量電壓的顯示框,以實(shí)時(shí)地顯示當(dāng)前稱重傳感器輸出信號(hào)值的變化情況。小量程電子稱重系統(tǒng)的LabVIEW上位機(jī)前面板,如下圖所示:
5.2、程序框圖設(shè)計(jì)
由于在LabVIEW上位機(jī)的程序設(shè)計(jì)中需要多次調(diào)用電壓采集子程序,以向ArduinoUno控制器發(fā)送命令碼,并獲取Arduino Uno控制器返回的測(cè)量數(shù)據(jù),所以將電壓采集子程序設(shè)計(jì)成子Vl,不僅可以簡(jiǎn)化程序設(shè)計(jì),還便于調(diào)用。
電壓采集子程序的前面板和程序框圖,如下圖所示:
LabVIEW上位機(jī)主程序的結(jié)構(gòu)為順序結(jié)構(gòu)+While循環(huán)+事件結(jié)構(gòu)。首先,在順序結(jié)構(gòu)中的第一幀中,對(duì)所使用的數(shù)組、中間變量和顯示控件進(jìn)行初始化,在順序結(jié)構(gòu)的第二幀中,通過設(shè)置的串口號(hào)來初始化串口通信。然后,程序進(jìn)入While循環(huán)和事件結(jié)構(gòu),不斷地檢測(cè)是否有事件得到響應(yīng),并執(zhí)行,事件結(jié)構(gòu)有"測(cè)量_稱重”、“測(cè)量_讀取標(biāo)定系數(shù)”"、“測(cè)量_計(jì)算平均值"、“標(biāo)定_采集"、“標(biāo)定_擬合"、“標(biāo)定_保存"和“超時(shí)”。最后,關(guān)閉串口通信。
初始化程序框圖如下圖所示:
在“測(cè)量_稱重"事件結(jié)構(gòu)中,通過“采集子程序"讀取Arduino Uno控制器返回的數(shù)據(jù),并利用標(biāo)定系數(shù)計(jì)算得到所稱量的重量,同時(shí)利用稱重計(jì)數(shù)器將重量數(shù)據(jù)循環(huán)顯示在測(cè)量數(shù)據(jù)中。“測(cè)量_稱重"值改變事件程序框圖如下圖所示:
在“測(cè)量_讀取標(biāo)定系數(shù)"事件結(jié)構(gòu)中,通過“文件對(duì)話框"的選擇來讀取稱重傳感器的標(biāo)定系數(shù),以用于計(jì)算所稱量的重量,同時(shí)顯示當(dāng)前標(biāo)定系數(shù),以表示當(dāng)前所使用的標(biāo)定系數(shù),進(jìn)一步擴(kuò)大了電子稱重系統(tǒng)的適用范圍,可以通過配置不同量程的稱重傳感器來實(shí)現(xiàn)不同范圍的稱重需求。“測(cè)量_讀取標(biāo)定系數(shù)"值改變事件程序框圖如下圖所示:
在"測(cè)量_計(jì)算平均值"事件結(jié)構(gòu)中,通過對(duì)測(cè)量數(shù)據(jù)數(shù)組的5個(gè)元素累加并除以5,得到所稱量的重量,這種通過多次測(cè)量取平均值的方法可以提高稱重精度,滿足較高精度的稱重需求?!皽y(cè)量_計(jì)算平均值"值改變事件程序框圖如下圖所示:
在“標(biāo)定_采集"事件結(jié)構(gòu)中,通過“采集子程序"讀取Arduino Uno控制器返回的稱重傳感器輸出的電壓信號(hào),并利用標(biāo)定計(jì)數(shù)器和條件結(jié)構(gòu)將所采集到的數(shù)據(jù)依次顯示在正行程和反行程上。“標(biāo)定_采集"值改變事件程序框圖如下圖所示:
在“標(biāo)定_擬合"事件結(jié)構(gòu)中,通過將正行程和反行程數(shù)組中的電壓數(shù)據(jù)求平均值,與質(zhì)量標(biāo)準(zhǔn)值數(shù)組利用線性擬合函數(shù)計(jì)算出擬合系數(shù),并顯示在標(biāo)定系數(shù)上?!皹?biāo)定_擬合”值改變事件程序框圖如下圖所示:
在“標(biāo)定_保存"事件結(jié)構(gòu)中,通過“文件對(duì)話框"來選擇標(biāo)定系數(shù)的保存路徑,并檢查是否存在相同文件名的文件,如存在則提醒是否替換文件,然后將標(biāo)定系數(shù)以配置文件的格式保存,后綴名為".ini"。“標(biāo)定_保存"值改變事件程序框圖如下圖所示:
當(dāng)2秒內(nèi)無事件被觸發(fā),則事件結(jié)構(gòu)進(jìn)入“超時(shí)"分支。在“超時(shí)"事件結(jié)構(gòu)中,通過“采集子程序"讀取Arduino Uno控制器返回的稱重傳感器輸出信號(hào),并將其顯示為前面板上的當(dāng)前電壓值?!俺瑫r(shí)"事件結(jié)構(gòu)如下圖所示:
除了傳感器的非線性之外,電阻應(yīng)變式稱重傳感器溫度漂移的偏差值也不容忽視,可以在系統(tǒng)中加入溫度傳感器(例如DS18B20),并在計(jì)算重量時(shí)進(jìn)行線性溫度漂移修正。
另外,選擇較高精度的稱重傳感器,還可以利用此小量程電子稱重系統(tǒng)實(shí)現(xiàn)物體的質(zhì)量質(zhì)心的測(cè)量,例如,固體火箭發(fā)動(dòng)機(jī)的質(zhì)量質(zhì)心測(cè)量系統(tǒng)。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。