基于單片機(jī)的智能儀器前面板的設(shè)計(jì)實(shí)現(xiàn)
引言:
許多儀器的前面板通常是由諸多的旋鈕、按鍵組成的混合界面。傳統(tǒng)的儀器前面板上通常有兩種旋鈕,一種是電位器,用于調(diào)節(jié)連續(xù)變化的量;另一種是檔位開關(guān),用于調(diào)節(jié)間隔變化的量。它們嵌入在測(cè)量電路中,可以直接改變儀器的參數(shù)和設(shè)置。而在現(xiàn)代智能儀器[1]中,這兩類調(diào)節(jié)均可以通過(guò)數(shù)字旋鈕由微控制器將用戶操作的變化量反饋給儀器的主處理器,再由主處理器改變儀器的參數(shù)和設(shè)置。所以,智能儀器上的數(shù)字旋鈕和傳統(tǒng)儀器上的旋鈕在原理和處理方法上有很大不同。為了節(jié)省成本,面板處理往往采用體積小、性價(jià)比高的單片機(jī)(MCU)。運(yùn)用單片機(jī)不但經(jīng)濟(jì)靈活,并可充分利用MCU邏輯處理的優(yōu)勢(shì),大大簡(jiǎn)化外圍連線,對(duì)旋鈕按鍵混合控制系統(tǒng)[2]的處理尤為突出。
設(shè)計(jì)采用LPC900系列的P89LPC922FLASH單片機(jī)來(lái)實(shí)現(xiàn)軟件處理。P89LPC922采用高性能的處理器結(jié)構(gòu),6倍于標(biāo)準(zhǔn)80C51器件的速率,并自帶波特率發(fā)生器。充分考慮單片機(jī)的資源和處理速度,分模塊設(shè)計(jì)——按鈕電路,旋鈕電路,串口電路,掃描電路。用protel完成電路原理圖,制作電路板,在KeilC環(huán)境下編寫軟件。軟件和硬件相結(jié)合,協(xié)同實(shí)現(xiàn)整個(gè)面板。
1 硬件設(shè)計(jì)及原理
1.1 旋鈕電路設(shè)計(jì)
1.1.1 數(shù)字旋鈕的工作原理
本設(shè)計(jì)選用常見的編碼器EC16系列作為數(shù)字旋鈕,如圖1。4、5腳供固定之用,3腳接VCC(+5V),1、2腳在轉(zhuǎn)動(dòng)時(shí)輸出連續(xù)脈沖。這種旋鈕只有兩種操作,即正旋和反旋。通過(guò)示波器可以觀察到如圖所示的旋鈕轉(zhuǎn)動(dòng)時(shí)1、2腳的波形。
每次轉(zhuǎn)動(dòng)1、2腳都會(huì)產(chǎn)生脈沖信號(hào),正旋時(shí)1腳先變高,反旋時(shí)2腳先變高。也就是說(shuō),正旋和反旋輸出信號(hào)的相位不同,只要檢測(cè)出相位,就可以識(shí)別正旋和反旋。
1.1.2鑒相電路設(shè)計(jì)
本文設(shè)計(jì)的鑒相電路見圖2,附箭頭所指數(shù)字標(biāo)號(hào)對(duì)應(yīng)的波形(以正旋為例)。旋鈕的1、2腳分別與D觸發(fā)器的D端和CLK端連接,根據(jù)上面所述旋鈕的工作原理,正旋時(shí)1腳(D)先變高,2腳(CLK)上升沿時(shí)Q端輸出1,反旋轉(zhuǎn)時(shí)輸出0, 端則相反。因此根據(jù)Q、 輸出為10還是01就可以判斷出轉(zhuǎn)動(dòng)方向。但是,如果繼續(xù)正旋,Q、 將維持現(xiàn)狀(圖2中的④③),因此還必須檢測(cè)脈沖個(gè)數(shù)來(lái)反映轉(zhuǎn)動(dòng)量。這時(shí)不用考慮1、2腳的相位,可將2個(gè)信號(hào)相與產(chǎn)生新的信號(hào)(圖2中的⑤),可利用該信號(hào)分別和Q、 相與即可分辨出每次旋鈕的轉(zhuǎn)動(dòng)。
最后的輸出為⑥和⑦,正旋時(shí)⑦線有脈沖,⑥線一直為低,反旋則兩根線相反。至此完成了鑒相,下面要解決如何與單片機(jī)接口的問(wèn)題。
1.2 掃描電路設(shè)計(jì)
用戶操作面板時(shí),為了能及時(shí)準(zhǔn)確地識(shí)別哪個(gè)按鈕和哪個(gè)旋鈕動(dòng)作,將按鈕和旋鈕統(tǒng)一掃描和編碼,發(fā)送給主機(jī)。綜合按鈕和旋鈕特點(diǎn),根據(jù)實(shí)際需要采用了8×8的矩陣式鍵盤結(jié)構(gòu)[3],前4行為按鈕,后4行為旋鈕。以列信號(hào)為掃描輸出信號(hào),行信號(hào)為檢測(cè)輸入信號(hào)。
掃描電路的核心是單片機(jī)。一般掃描電路用一個(gè)I/O口輸出掃描信號(hào),另一個(gè)I/O口讀入檢測(cè)信號(hào)。P89LPC922只有兩組I/O雙向口:P0口和P1口。P1口需要定義一些讀寫控制信號(hào),所以只用一個(gè)P0口輸出掃描信號(hào)及輸入檢測(cè)信號(hào),這樣P0口就存在讀寫控制和時(shí)序問(wèn)題。既要輸出列值又要讀入行值,必須要有數(shù)據(jù)鎖存器和緩沖器之類的芯片配合完成。設(shè)計(jì)時(shí)采用了數(shù)據(jù)鎖存器74ALS373和總線接收/發(fā)送器74ALS245。單片機(jī)的引腳P1.4控制74ALS245的輸出使能端,如圖3中的②;P1.7控制74ALS373的數(shù)據(jù)鎖存端,如圖3中的①;P1.3控制74ALS245的數(shù)據(jù)傳送方向,如圖3中的③(這里為恒為低,從245到單片機(jī)的P0口)。
掃描電路的工作原理是:?jiǎn)纹瑱C(jī)先讓②為高,使74ALS245輸出為高阻態(tài),然后從P0口輸出列掃描數(shù)據(jù),再給①高電平,延時(shí)后將①變低,使74ALS373鎖存列掃描信號(hào),將②變低使74ALS245輸出有效,由于數(shù)據(jù)方向恒定,這樣行值數(shù)據(jù)就從245輸入到單片機(jī)的P0口。
為了將按鈕和旋鈕的掃描統(tǒng)一起來(lái),我們把正旋和反旋當(dāng)做不同的兩個(gè)按鈕按下,旋鈕的正旋或反旋也對(duì)應(yīng)唯一的行值和列值。這里的巧妙之處就是采用了三態(tài)緩沖器74LS240,每個(gè)旋鈕電路的輸出信號(hào)⑥和⑦(即前面圖2鑒相電路輸出)分別接到74LS240的兩組輸入端,兩組數(shù)據(jù)的輸出都接到4根行線,由列掃描線控制輸出哪一組數(shù)據(jù)。比如:掃描第二列,⑦對(duì)應(yīng)那組輸出到4根行線供單片機(jī)讀入,此時(shí)⑥對(duì)應(yīng)那組的輸出被禁止。若第二列有旋鈕正旋,則其對(duì)應(yīng)的⑦上有脈沖,經(jīng)240反相后,單片機(jī)檢測(cè)到低電平數(shù)據(jù),與按鈕按下的情況一致。圖3中只用了一片74LS240,可以接4個(gè)旋鈕,這個(gè)電路可以擴(kuò)充到四片74LS240接16個(gè)旋鈕。
1.3 與主機(jī)通信電路設(shè)計(jì)
用串口與PC機(jī)通信要用串口連線,我們將其3、5腳引出,通過(guò)一片MAX232,即可與單片機(jī)的串口連接,其電路相對(duì)簡(jiǎn)單,這里不多做敘述了。外部晶振頻率選用高頻晶振12MHZ,用922自帶的波特率發(fā)生器,設(shè)置波特率為9600,每個(gè)字節(jié)發(fā)送時(shí)間約1ms,可以滿足高速率和準(zhǔn)確性的要求。波特率太低影響速度,太高影響串口數(shù)據(jù)傳輸?shù)恼_性。
2 軟件實(shí)現(xiàn)
2.1 按鍵的抗干擾處理
通常當(dāng)按鍵按下以后(不考慮人的操作因素),會(huì)有一個(gè)5-10ms的抖動(dòng)期,用軟件延時(shí)來(lái)進(jìn)行去抖處理。當(dāng)按鍵釋放后才向主機(jī)發(fā)送數(shù)據(jù),具體方法是用狀態(tài)機(jī),將按鍵過(guò)程分成以下幾個(gè)狀態(tài)S0—S4,如圖4所示:
沒(méi)有按鈕動(dòng)作時(shí),檢測(cè)線都為高電平,保持在S0狀態(tài);掃描面板,當(dāng)某個(gè)按鈕按下(相應(yīng)檢測(cè)線為低電平)進(jìn)入S1狀態(tài);完成去抖延時(shí)(T0中斷20次)后進(jìn)入S2狀態(tài),再次掃描面板,檢測(cè)到低電平且為同一個(gè)按鈕(行、列線相同)進(jìn)入S3狀態(tài),沒(méi)有檢測(cè)到低電平或者不為同一個(gè)按鈕則再次進(jìn)入S0狀態(tài);按鈕釋放后進(jìn)入S4狀態(tài),給主機(jī)發(fā)送按鈕編號(hào),發(fā)送完成進(jìn)入S0狀態(tài)。
2.2 旋鈕的抗干擾處理
與檔位開關(guān)一樣,旋鈕轉(zhuǎn)動(dòng)一周會(huì)有若干停頓點(diǎn)。停頓點(diǎn)較少的旋鈕[2][4]在停止轉(zhuǎn)動(dòng)時(shí)1、2腳總會(huì)處于一個(gè)穩(wěn)定的低電平。而停頓點(diǎn)較多的旋鈕在停止轉(zhuǎn)動(dòng)時(shí)則電平狀態(tài)不定,1、2腳有可能處于高電平也可能處于低電平(如圖1),所以不可用與之類似的任何檢測(cè)電平狀態(tài)的方法來(lái)判斷旋鈕的轉(zhuǎn)動(dòng)。
用示波器分析波形后得知,不管1、2腳最終狀態(tài)如何,只要轉(zhuǎn)動(dòng)旋鈕就會(huì)有電平變化,從高到低,或從低到高,所以選用動(dòng)態(tài)的邊沿掃描。除了在剛上電的時(shí)候需要掃描獲得每個(gè)旋鈕的初始狀態(tài),每過(guò)一段時(shí)間都要定時(shí)掃描旋鈕狀態(tài),一旦有電平變化(上升沿/下降沿),就認(rèn)為是一次有效的轉(zhuǎn)動(dòng)。定時(shí)的時(shí)間確定為1ms[5],因?yàn)榧词购芸燹D(zhuǎn)動(dòng)旋鈕的情況下,每次脈沖高電平寬度一般都有十幾到幾十毫秒。在設(shè)計(jì)時(shí)可用1個(gè)字的位向量pre_knob和cur_knob分別保存最近的兩次掃描結(jié)果,每位對(duì)應(yīng)一個(gè)旋鈕。低電平時(shí)相應(yīng)位置1,高電平置0,用下降沿判斷(即10時(shí))認(rèn)為對(duì)應(yīng)位的旋鈕有轉(zhuǎn)動(dòng)。
2.3 旋鈕轉(zhuǎn)動(dòng)量的計(jì)算
旋鈕轉(zhuǎn)動(dòng)量的計(jì)算方法也是本文討論的一個(gè)重點(diǎn)。旋鈕轉(zhuǎn)動(dòng)的時(shí)候,可以轉(zhuǎn)動(dòng)一個(gè)停頓點(diǎn)就發(fā)一次,但會(huì)增加通信量和主機(jī)的處理負(fù)擔(dān),而且單片機(jī)的任務(wù)非常單一,即檢測(cè)前面板的動(dòng)作,資源利用也不多,因此可以用單片機(jī)計(jì)算出旋鈕轉(zhuǎn)動(dòng)量后一起發(fā)送給主機(jī)。
方法是:給每個(gè)旋鈕配置1個(gè)字節(jié)的發(fā)送緩沖保存轉(zhuǎn)動(dòng)量。每當(dāng)旋鈕轉(zhuǎn)動(dòng)一個(gè)停頓點(diǎn),單片機(jī)就檢測(cè)發(fā)送緩沖是否為空,不為空則將緩沖中的轉(zhuǎn)動(dòng)量加1,若為空則發(fā)送旋鈕編號(hào)給主機(jī),等待主機(jī)響應(yīng),此時(shí)旋鈕繼續(xù)轉(zhuǎn)動(dòng),轉(zhuǎn)動(dòng)量不斷增加,主機(jī)響應(yīng)后再將發(fā)送緩沖里的轉(zhuǎn)動(dòng)量發(fā)送給主機(jī),發(fā)送完成后清空緩沖。
3 結(jié)論
完成硬件和軟件設(shè)計(jì)之后,仿真調(diào)試,燒錄單片機(jī),將電路板與PC機(jī)連接,操作電路板上的按鈕和旋鈕,結(jié)果表明按鈕和旋鈕識(shí)別及時(shí)準(zhǔn)確,完全符合實(shí)時(shí)操作的要求。并已應(yīng)用于課題組的數(shù)字存儲(chǔ)大功率半導(dǎo)體管特性曲線圖示儀中。
本文采用的面板設(shè)計(jì)具有成本低、周期短、可擴(kuò)展、設(shè)計(jì)靈活、安全可靠等優(yōu)點(diǎn)??梢愿鶕?jù)實(shí)際需要增加功能按鍵,而不需要重做軟件設(shè)計(jì)??梢詾橄嚓P(guān)領(lǐng)域研究人員提供一種可供參考的面板設(shè)計(jì)方法。