施 祥
(浙江科技學(xué)院 信息與電子工程學(xué)院,杭州310023)
對(duì)于機(jī)器設(shè)備產(chǎn)生的非穩(wěn)態(tài)噪聲,一般需要了解其任意時(shí)刻的噪聲大小。聲級(jí)計(jì)可以簡(jiǎn)便快捷地測(cè)量設(shè)備的瞬時(shí)噪聲值,但其測(cè)量顯示窗口較小,肉眼長(zhǎng)時(shí)間觀察容易疲勞,而且聲級(jí)計(jì)只能靠近機(jī)器設(shè)備測(cè)量。隨著微機(jī)軟硬件技術(shù)的不斷發(fā)展,由PC機(jī)結(jié)合單片機(jī)系統(tǒng)構(gòu)成的監(jiān)控系統(tǒng)已成為單片機(jī)技術(shù)發(fā)展的一個(gè)方向,它結(jié)合了單片機(jī)的實(shí)時(shí)數(shù)據(jù)采集和微機(jī)對(duì)圖形處理、顯示的優(yōu)點(diǎn)[1]。
基于此,筆者設(shè)計(jì)了一個(gè)基于單片機(jī)的聲級(jí)計(jì)與PC機(jī)連接的機(jī)器設(shè)備噪聲監(jiān)測(cè)系統(tǒng)。該系統(tǒng)可以實(shí)現(xiàn)PC機(jī)用戶界面與聲級(jí)計(jì)顯示窗口的測(cè)量數(shù)據(jù)實(shí)時(shí)一致,并可在PC機(jī)界面上實(shí)現(xiàn)噪聲測(cè)量值超限報(bào)警功能。
本系統(tǒng)由聲級(jí)計(jì)、PC機(jī)和RS232串口通信線聯(lián)結(jié)構(gòu)成。圖1為系統(tǒng)組成示意圖。聲級(jí)計(jì)采用AWA6228型多功能聲級(jí)計(jì),該聲級(jí)計(jì)可以以A、C、Z的3種并行頻率計(jì)權(quán)及F、S、I的3種并行的時(shí)間計(jì)權(quán),可以同時(shí)測(cè)量多種聲音評(píng)價(jià)指標(biāo)。通過(guò)RS232串口通信線可以把聲級(jí)計(jì)的瞬時(shí)噪聲測(cè)量數(shù)據(jù)傳輸?shù)接?jì)算機(jī)(最遠(yuǎn)傳輸距離可以達(dá)到15~20m)。
圖1 機(jī)器設(shè)備噪聲監(jiān)測(cè)系統(tǒng)Fig.1 Monitoring system for machines noises
在PC機(jī)上實(shí)現(xiàn)與聲級(jí)計(jì)串行通信的編程語(yǔ)言有很多,VB、C++、MATLAB等編程語(yǔ)言都可以實(shí)現(xiàn)。與VB、C++語(yǔ)言相比,MATLAB的計(jì)算機(jī)串口操作更加簡(jiǎn)化,只要幾個(gè)語(yǔ)句就能實(shí)現(xiàn)對(duì)串口數(shù)據(jù)的讀寫操作,而且擁有豐富的數(shù)據(jù)處理函數(shù),因此在設(shè)計(jì)時(shí)采用MATLAB語(yǔ)言來(lái)進(jìn)行軟件編寫[2-4]。為了方便用戶使用,進(jìn)一步利用MATLAB圖形用戶界面開(kāi)發(fā)環(huán)境(簡(jiǎn)稱GUIDE),開(kāi)發(fā)一個(gè)完整的圖形用戶界面(簡(jiǎn)稱GUI)。
在PC機(jī)上使用MATLAB軟件與其他設(shè)備進(jìn)行串口通信,一般要進(jìn)行創(chuàng)建串口、打開(kāi)串口、讀取串口、斷開(kāi)及清除串口等操作[5]。
2.1.1 創(chuàng)建串口對(duì)象并設(shè)置其屬性
用serial函數(shù)創(chuàng)建一個(gè)串口對(duì)象,語(yǔ)句格式為scom=serial(‘port’)。接著,按表1設(shè)置串口對(duì)象的常見(jiàn)屬性。
對(duì)于RS-232串口設(shè)備對(duì)象,其屬性的缺省值為波特率9 600b/s,異步方式,通信數(shù)據(jù)格式為8位數(shù)據(jù)位,無(wú)奇偶校驗(yàn)位,1位停止位。
2.1.2 打開(kāi)串口對(duì)象
用fopen函數(shù)打開(kāi)串口,聯(lián)結(jié)串口對(duì)象到外圍設(shè)備。語(yǔ)句格式為fopen(scom)。
2.1.3 讀寫串口操作
打開(kāi)串口對(duì)象之后,可以對(duì)串口設(shè)備對(duì)象進(jìn)行讀寫操作。對(duì)ASCII文本格式的數(shù)據(jù),MATLAB讀寫串口設(shè)備的命令分別是fscanf、fpritf;二進(jìn)制格式則使用fread、fwrite命令。
2.1.4 斷開(kāi)并清除串口對(duì)象
當(dāng)不再使用串口對(duì)象時(shí),使用fclose(scom)函數(shù)斷開(kāi)串口對(duì)象與外設(shè)的聯(lián)結(jié)。然后使用delete(scom)將串口對(duì)象從內(nèi)存中刪除,最后可使用clear scom命令清除工作空間中的串口對(duì)象。
可見(jiàn),在MATLAB中進(jìn)行串行通信是十分方便的,編程較為簡(jiǎn)單。而且,在MATLAB中串行通信的失誤率很低,通信較為可靠,同時(shí),也可以采用增加握手信號(hào)及數(shù)據(jù)校驗(yàn)等方式進(jìn)一步增加通信的可靠性[6]。
表1 串口對(duì)象的常見(jiàn)屬性Table 1 Common properties ofserial port object
設(shè)計(jì)的系統(tǒng)界面見(jiàn)圖2。界面主要分3個(gè)區(qū)域:測(cè)量值顯示區(qū),串口通信設(shè)置區(qū),用戶指令區(qū)。測(cè)量值顯示區(qū)用來(lái)同步顯示聲級(jí)計(jì)的測(cè)量值,串口通信設(shè)置區(qū)用來(lái)設(shè)置PC機(jī)和聲級(jí)計(jì)串行通信時(shí)的參數(shù)設(shè)置,用戶指令區(qū)可以輸入用戶指令、預(yù)設(shè)報(bào)警值。其中用戶指令區(qū)的“打開(kāi)串口”“手動(dòng)接收”“自動(dòng)接收”控件均采用表示二值狀態(tài)的切換按鈕(如“打開(kāi)串口”與“關(guān)閉串口”)。
圖2 系統(tǒng)界面Fig.2 System interface
系統(tǒng)要實(shí)現(xiàn)的功能主要有:
1)創(chuàng)建串口對(duì)象,并根據(jù)聲級(jí)計(jì)的計(jì)算機(jī)串口數(shù)據(jù)傳輸協(xié)議配置串口屬性;
2)打開(kāi)串口進(jìn)行數(shù)據(jù)傳輸;
3)PC機(jī)根據(jù)傳輸?shù)臄?shù)據(jù),與設(shè)定值進(jìn)行比較,超限報(bào)警;
4)斷開(kāi)串口聯(lián)結(jié)并清除串口對(duì)象。
根據(jù)需要實(shí)現(xiàn)的功能在各個(gè)控件對(duì)象的回調(diào)函數(shù)callback下編寫相應(yīng)的程序代碼,就可以實(shí)現(xiàn)整個(gè)設(shè)計(jì)的功能。系統(tǒng)軟件主要有以下3個(gè)程序模塊。
2.3.1 串口屬性配置
根據(jù)AWA6228聲級(jí)計(jì)的計(jì)算機(jī)串口傳輸協(xié)議,配置串口通信屬性,即可實(shí)現(xiàn)PC機(jī)與該聲級(jí)計(jì)串行通信。在“打開(kāi)串口”按鈕控件的callback函數(shù)下編寫如下程序代碼:
global scom %設(shè)置串口對(duì)象為全局變量
if get(hObject,′value′) %判斷按鈕是否按下
com_n=sprintf(′com%d′,get(handles.com,′value′)); %獲取串口號(hào)
scom=serial(com_n); %創(chuàng)建串口對(duì)象
scom.BaudRate=115200; %設(shè)置波特率
scom.Parity=odd; %設(shè)置奇校驗(yàn)
scom.InputBufferSize=39; %設(shè)置緩沖區(qū)大小
fopen(scom); %打開(kāi)串口聯(lián)結(jié)到聲級(jí)計(jì)else %當(dāng)按鈕未按下時(shí)
fclose(scom); %關(guān)閉串口
delete(scom); %從內(nèi)存刪除串口
clear scom %從工作空間刪除串口end
2.3.2 數(shù)據(jù)的手動(dòng)接送并處理
手動(dòng)接受功能,每次按鈕按下時(shí),聲級(jí)計(jì)的數(shù)據(jù)即傳輸?shù)接?jì)算機(jī)一次。根據(jù)聲級(jí)計(jì)與計(jì)算機(jī)傳輸協(xié)議里給出的數(shù)據(jù)傳輸指令和數(shù)據(jù)顯示形式,以及設(shè)計(jì)要求的報(bào)警功能,在“手動(dòng)接收”按鈕的callback函數(shù)下編寫如下程序代碼:
%%PC機(jī)發(fā)送傳輸指令給聲級(jí)計(jì),并接收測(cè)量數(shù)據(jù)
global scom
fprintf(scom,'AWAB'); %PC機(jī)發(fā)傳輸指令'AWAB'給聲級(jí)計(jì)
A=dec2hex(fread(scom)); %接收聲級(jí)計(jì)的數(shù)據(jù)
B=floor(hex2dec([A(15,:)A(14,:)])/10)/10; %讀取Z計(jì)權(quán)聲級(jí)值,轉(zhuǎn)換為十進(jìn)制
C=floor(hex2dec([A(27,:)A(26,:)])/10)/10; %讀取 A計(jì)權(quán)聲級(jí)值,轉(zhuǎn)換為十進(jìn)制
switch get(handles.huoqu,'value') %判斷“顯示值”按鈕狀況
case 1;set(handles.xianshi,'string',num2str(B,'%.1f')) %使Z計(jì)權(quán)值在顯示框顯示
case 2;set(handles.xianshi,'string',num2str(C,'%.1f')) %使 A 計(jì)權(quán)值在顯示框顯示
end
%%比較噪聲測(cè)量值與設(shè)定值,超過(guò)則報(bào)警顯示
(1) 從力平衡條件出發(fā),推導(dǎo)了裂隙開(kāi)展的間距和寬度的表達(dá)式,據(jù)此提出了開(kāi)裂最大間距和寬度的概念,提出了最大間距和最大寬度的概念,可用于判定裂隙最終規(guī)模的依據(jù)。
d=str2num(get(handles.xianshi,'string')); %獲取噪聲測(cè)量值
z=str2num(get(handles.baojing,'string')); %獲取報(bào)警值
if d>z;set(handles.xianshi,'BackgroundColor',[100]) %界面顯示區(qū)呈紅色報(bào)警顯示end
2.3.3 數(shù)據(jù)的自動(dòng)接收并處理
要使得PC機(jī)的聲音顯示與聲級(jí)計(jì)顯示同步,即實(shí)現(xiàn)自動(dòng)接收功能,則必須采用定時(shí)器對(duì)象,同時(shí)在定時(shí)周期到來(lái)時(shí)自動(dòng)執(zhí)行“手動(dòng)接收”按鈕下的callback函數(shù)。在“自動(dòng)接收”按鈕的callback函數(shù)下編寫如下程序代碼:
if get(hObject,'value') %當(dāng)“自動(dòng)接收”按鈕按下時(shí)
t1=0.001*str2num(get(handles.shijian,'string')); %獲取周期值
t=timer('BusyMode','queue','ExecutionMode',... %創(chuàng)建定時(shí)器,定時(shí)周期到來(lái)
{@fasong_Callback,handles});
start(t);%啟動(dòng)定時(shí)器
else %當(dāng)“自動(dòng)接收”按鈕未按下時(shí)
stop(t);delete(t); %停止定時(shí)器,刪除定時(shí)器
clear t
end
采用該系統(tǒng)對(duì)某機(jī)器設(shè)備噪聲進(jìn)行實(shí)際測(cè)量,設(shè)定報(bào)警值為40dB,測(cè)量結(jié)果符合設(shè)計(jì)要求。圖3顯示設(shè)備噪聲值為39.8dB,低于設(shè)定值的測(cè)量結(jié)果,與聲級(jí)計(jì)做到同步顯示。圖4顯示超過(guò)設(shè)定值時(shí),測(cè)量顯示框底色呈現(xiàn)紅色報(bào)警狀態(tài)。
設(shè)計(jì)了一個(gè)基于單片機(jī)的聲級(jí)計(jì)與PC機(jī)連接的機(jī)器設(shè)備噪聲監(jiān)測(cè)系統(tǒng)。利用MATLAB GUIDE便捷的界面設(shè)計(jì)環(huán)境,以及MATLAB簡(jiǎn)易的串口操作函數(shù),實(shí)現(xiàn)了PC機(jī)與聲級(jí)計(jì)之間的實(shí)時(shí)數(shù)據(jù)傳輸顯示,從而可以實(shí)現(xiàn)較遠(yuǎn)距離噪聲測(cè)量,并在噪聲測(cè)量值超出設(shè)定值時(shí)給出報(bào)警提示。該系統(tǒng)界面友好,易于操作,可方便地應(yīng)用在機(jī)器設(shè)備噪聲的檢測(cè)領(lǐng)域。
[1] 王文中,郭楠,葛慶平.PC機(jī)與單片機(jī)串口通信模型的設(shè)計(jì)與實(shí)現(xiàn)[J].首都師范大學(xué)學(xué)報(bào):自然科學(xué)版,2004(S1):1-3.
[2] 王戰(zhàn)軍,沈明.基于 Matlab GUI的串口通信編程實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2010(9):38-40,44.
[3] 張園,邢彥梅,何巧.基于 MATLAB數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].電聲基礎(chǔ),2010,34(9):37-39.
[4] Wang C H,Yang Z J,Wen B Y.Serial communications programming in windows95with API functions[J].Wuhan University Journal of Natural Sciences,2000,5(3):323-328.
[5] 羅華飛.MATLAB GUI設(shè)計(jì)學(xué)習(xí)手記[M].北京:北京航空航天大學(xué)出版社,2009:224-367.
[6] 趙云鵬.MATLAB串口通信在數(shù)據(jù)采集中的應(yīng)用[J].微計(jì)算機(jī)信息,2006,22(1):111-112.