蒙 艷,孫旭華,姜鐵梅
(上海自動(dòng)化儀表股份有限公司技術(shù)中心,上海 200072)
隨著工業(yè)控制現(xiàn)場(chǎng)中分散控制系統(tǒng)(DCS)的發(fā)展,需要特定的DCS操作員鍵盤對(duì)系統(tǒng)進(jìn)行控制。該鍵盤使操作員能對(duì)系統(tǒng)的操作更加直觀、操作方法更加簡(jiǎn)捷,以降低對(duì)操作員的操作技能要求,進(jìn)一步減少誤操作的可能,從而提高整個(gè)生產(chǎn)線的自動(dòng)化能力。DCS操作員鍵盤正是基于這個(gè)目的產(chǎn)生的。該鍵盤在功能上除了兼容標(biāo)準(zhǔn)PC鍵盤的功能外,增加了DCS功能擴(kuò)展區(qū)和用戶自定義擴(kuò)展區(qū)。在該鍵盤按鍵殼體上印刷按鍵功能,如邏輯開、邏輯關(guān)、手動(dòng)、自動(dòng)、報(bào)警、輸出步長(zhǎng)等等,一旦有按鍵動(dòng)作,鍵盤立刻響應(yīng)并將按鍵編碼發(fā)給主機(jī),主機(jī)根據(jù)接收到的按鍵編碼調(diào)用相應(yīng)的子函數(shù)來完成響應(yīng)功能。同時(shí)該鍵盤支持目前廣泛流行的USB接口的標(biāo)準(zhǔn)PC鍵盤通信協(xié)議。USB協(xié)議專門為人機(jī)交互設(shè)備提供了接口描述,即HID設(shè)備類。用戶可以按照HID設(shè)備類的協(xié)議設(shè)計(jì)通用鍵盤,也可以根據(jù)自己的需要設(shè)計(jì)特殊的鍵盤,以滿足不同的應(yīng)用場(chǎng)合。USB通信協(xié)議的設(shè)備一旦接入主機(jī)USB接口,主機(jī)調(diào)用底層驅(qū)動(dòng)自動(dòng)完成USB設(shè)備的枚舉,實(shí)現(xiàn)方便快捷的即插即用。另外該鍵盤可記掛標(biāo)準(zhǔn)PC鍵盤,即便在DCS操作員鍵盤故障或在高級(jí)工程師操作管理模式下,可使用標(biāo)準(zhǔn)PC鍵盤做進(jìn)一步的操作。在基本功能上與標(biāo)準(zhǔn)PC鍵盤保持一致,可相互控制Capslock狀態(tài)。本文描述的正是這樣一個(gè)基于ARM的DCS專用工業(yè)鍵盤的研究與實(shí)現(xiàn)。
該鍵盤硬件主要由ARM MCU、USB HUB等控制電路以及矩陣式鍵盤組成。
ARM MCU控制電路主要負(fù)責(zé)與主機(jī)的通信,完成USB通信建立、按鍵掃描、鍵碼確認(rèn)以及發(fā)送。ARM其他部分電路包括JTAG調(diào)試電路接口、復(fù)位模塊、晶振介入電路等常規(guī)電路。另外還有一個(gè)GPIO端口做指示燈,用于指示鍵盤CAPS鍵。
本設(shè)計(jì)微處理器選用ST公司的STM32F103R6T6。STM32F103R6T6是ARM公司具有突破性的Cortex-M3內(nèi)核的STM32系列32 bit閃存微控制器的增強(qiáng)型產(chǎn)品。具有高性能、低功耗、實(shí)時(shí)應(yīng)用且具有競(jìng)爭(zhēng)力價(jià)格等多項(xiàng)優(yōu)點(diǎn),其工作頻率為72 MHz,1.25 DMIPS/MHz;片上集成了32 KB的Flash代碼存儲(chǔ)器和10 KB的SRAM用戶數(shù)據(jù)存儲(chǔ)器;通過APB總線連接豐富和增強(qiáng)的外設(shè)和I/O;集成3個(gè)定時(shí)器、51個(gè)快速 I/O端口以及SPI、I2C、USART、CAN等多種標(biāo)準(zhǔn)通信接口[1];嵌入了一個(gè)支持全速USB2.0總線的USB外設(shè),實(shí)現(xiàn)了全速(12 Mb/s)功能接口;可通過軟件配置端點(diǎn),也可以通過軟件控制掛起/恢復(fù);時(shí)鐘來自內(nèi)部PLL產(chǎn)生的48 MHz專用時(shí)鐘源。
該電路主要用于檢測(cè)鍵盤矩陣上的按鍵情況,并處理包括特殊功能鍵在內(nèi)的數(shù)據(jù)傳輸,具體功能由軟件編程實(shí)現(xiàn)。本設(shè)計(jì)中鍵盤需要支持86個(gè)按鍵,接口部分為矩陣式鍵盤,列線通過電阻接正電源,用MCU的11個(gè)I/O口做通用輸出口,作為鍵盤掃描信號(hào)的輸出口;行線用8個(gè)I/O口做通用輸入口,作為鍵盤反饋信號(hào)的輸入口。這樣總共使用19個(gè)I/O端口即可控制多達(dá)11×8=88個(gè)按鍵,減少了I/O口的占用,滿足了86個(gè)按鍵的需要。將全部列線置低電平輸出,然后讀行線有無低電平出現(xiàn)。當(dāng)沒有按鍵按下時(shí),所有的輸入端都是高電平,代表無鍵按下;一旦有鍵按下,則輸入線就會(huì)被拉低,這樣通過讀入輸入線的狀態(tài)就可得知是否有鍵按下。
此外本項(xiàng)目采用IAR System公司為ARM微處理器開發(fā)的一個(gè)集成開發(fā)環(huán)境IAR EWARM,需要配套的IAR J-LINK仿真器。J-LINK一端通過PC機(jī)USB口與PC連接,另一端通過標(biāo)準(zhǔn)20芯JTAG插頭與目標(biāo)板連接,并將目標(biāo)板的電源接上,即可進(jìn)行應(yīng)用程序的在線調(diào)試。
單片機(jī)控制設(shè)計(jì)電路如圖1所示。
USB HUB控制電路主要是為該鍵盤作冗余,將USB數(shù)據(jù)分成兩路,一路接收和發(fā)送鍵盤的數(shù)據(jù),另一路作為獨(dú)立的USB口,可與其他的標(biāo)準(zhǔn)USB 2.0設(shè)備通信(如標(biāo)準(zhǔn)PC鍵盤),以防工業(yè)現(xiàn)場(chǎng)惡劣環(huán)境下鍵盤故障。USB HUB芯片采用賽普拉斯的CYC765621,主要接口是 1路和上位機(jī)通信的 USB接口(D-、D+),另 2路為HUB分出來的2路USB接口,其中一路作為外接USB口,另一路則接到ARM作為鍵盤通信的數(shù)據(jù)傳輸口(DD1-DD1+DD2-DD2+)。另有 MIC2026-2YM的電源保護(hù)關(guān)斷芯片,作為保護(hù)電路與CYC765621相連。
電源部分電路采用USB供電。USB為5 V供電,通過LM1117MPX-3.3的線性電源芯片轉(zhuǎn)換為3.3 V電源,為USB HUB和ARM芯片供電。
本設(shè)計(jì)中軟件主要是對(duì)硬件電路的驅(qū)動(dòng),實(shí)現(xiàn)與USB口的通信以及鍵盤的響應(yīng)功能。首先對(duì)ARM MCU進(jìn)行系統(tǒng)初始化,包括系統(tǒng)時(shí)鐘設(shè)置、GPIO口的初始化設(shè)置;其次對(duì)USB模塊中斷配置與使能,中斷包括USB低優(yōu)先級(jí)中斷、USB喚醒中斷、按鍵控制中斷等,并對(duì)USB模塊時(shí)鐘設(shè)置和使能,然后初始化。對(duì)定時(shí)器TIM2進(jìn)行設(shè)置,之后進(jìn)入循環(huán)任務(wù)函數(shù)。循環(huán)任務(wù)函數(shù)有兩個(gè):一是主機(jī)枚舉響應(yīng);另一個(gè)是使用定時(shí)器中斷方式實(shí)現(xiàn)鍵盤任務(wù)。鍵盤主程序流程圖如圖2所示。
圖2 鍵盤主程序流程圖
USB鍵盤是HID類設(shè)備的一種,遵循著USB設(shè)備啟動(dòng)過程。即每次設(shè)備接入總線,先進(jìn)入設(shè)備檢測(cè)狀態(tài),總線對(duì)設(shè)備進(jìn)行總線復(fù)位;其次是設(shè)備枚舉過程,在這里USB設(shè)備將被枚舉為標(biāo)準(zhǔn)的HID類鍵盤。主機(jī)通過默認(rèn)端點(diǎn)0發(fā)送SETUP包,得到設(shè)備描述符,然后給設(shè)備分配新的地址,分配成功后,主機(jī)將通過新的設(shè)備地址向設(shè)備依次發(fā)送標(biāo)準(zhǔn)USB請(qǐng)求來獲取設(shè)備的配置信息,即獲得設(shè)備描述符、配置描述符、接口描述符、端點(diǎn)描述符、HID描述符和報(bào)表描述符。通過設(shè)備的這些描述符,主機(jī)就知道了設(shè)備的詳細(xì)信息,并根據(jù)設(shè)備的配置情況對(duì)設(shè)備的端點(diǎn)進(jìn)行操作。這些操作包括:初始化端點(diǎn)數(shù)目,分配各端點(diǎn)所需使用的Packet Buffer;初始化所使用的端點(diǎn),配置端點(diǎn)的傳輸類型、傳輸方向、Packet Buffer地址和初始狀態(tài)。在需要發(fā)送數(shù)據(jù)或接收數(shù)據(jù)的時(shí)候,使能端點(diǎn);并在該端點(diǎn)的中斷回調(diào)函數(shù)中處理數(shù)據(jù),如果需要?jiǎng)t使能下一次傳輸。以上便是實(shí)現(xiàn)USB鍵盤設(shè)備的步驟。
USB設(shè)備描述符如下:
在實(shí)際設(shè)計(jì)與開發(fā)中,由于STM32提供豐富的USB標(biāo)準(zhǔn)函數(shù)庫(kù),充分使用該函數(shù)庫(kù)會(huì)加快開發(fā)進(jìn)程。下面是一段對(duì)IN端點(diǎn)的初始化和使能以及IN傳輸?shù)年P(guān)鍵代碼:
圖3 鍵盤任務(wù)處理函數(shù)keyboard()流程圖
鍵盤任務(wù)處理函數(shù)keyboard()流程圖如圖3所示。先對(duì)按鍵進(jìn)行掃描,若無按鍵按下,則每隔10 ms掃描一次。若有按鍵按下,記錄下按鍵所處鍵盤的位置代碼,轉(zhuǎn)向消抖處理。所按下按鍵若通過消抖處理,則確認(rèn)其位置代碼,進(jìn)入到按鍵處理階段,將位置代碼轉(zhuǎn)換為按鍵HID碼并發(fā)送。否則釋放其位置代碼,轉(zhuǎn)到按鍵掃描處重新掃描。發(fā)送完其HID碼的按鍵再進(jìn)行消抖處理判斷其釋放否。若按鍵未釋放則繼續(xù)等待,若已釋放則轉(zhuǎn)向按鍵掃描處重新掃描。
在具體設(shè)計(jì)中引入狀態(tài)轉(zhuǎn)移分析法和定時(shí)器中斷。將按鍵的所有狀態(tài)分為4種:狀態(tài)0為按鍵掃描,狀態(tài)1為按鍵消抖處理并確認(rèn),狀態(tài)2為按鍵鍵碼轉(zhuǎn)換并發(fā)送,狀態(tài)3為等待按鍵釋放狀態(tài)。以上的函數(shù)流程實(shí)際上是在這4個(gè)狀態(tài)中轉(zhuǎn)移,如圖4所示。設(shè)置一個(gè)狀態(tài)標(biāo)志位key_state來表示按鍵所處的不同狀態(tài),采用多分支結(jié)構(gòu)swich-case,可以很方便地實(shí)現(xiàn)。
圖4 按鍵狀態(tài)轉(zhuǎn)移圖
定時(shí)器中斷是使MCU的TIM2定時(shí)器產(chǎn)生10 ms的定時(shí)中斷。主程序每隔 10 ms中斷調(diào)用 keyboard()函數(shù)一次。當(dāng)無按鍵按下時(shí),key_state=0,執(zhí)行case0,即實(shí)現(xiàn)了每10 ms執(zhí)行一次鍵盤掃描。若有按鍵按下,則定位其按下按鍵的位置代碼,并使key_state=1。當(dāng)10 ms后再次調(diào)用 keyboard()函數(shù),這時(shí) key_state=1而進(jìn)入 case1,在case1中對(duì)前面所定位的按鍵位置再次進(jìn)行確認(rèn),若還在,則再次確定其位置代碼,并使key_state=2。如此時(shí)按鍵已經(jīng)釋放,說明為假按鍵,則使key_state=0,返回按鍵掃描。這里巧妙利用了兩次定時(shí)中斷的10 ms間隔實(shí)現(xiàn)按鍵的消抖處理。若key_state=2,10 ms后再次調(diào)用keyboard()函數(shù)時(shí)則進(jìn)入 case2,這里將已確認(rèn)的按鍵位置代碼轉(zhuǎn)化為按鍵代碼以及最終的HID碼,建立鍵盤報(bào)表并發(fā)送給主機(jī),然后使key_state=3。當(dāng)下一個(gè)10 ms,key_state=3則進(jìn)入csae3,等待按鍵釋放狀態(tài),此時(shí)再次掃描前面已確定按鍵的位置,若按鍵已釋放,則key_state=0,下一個(gè) 10 ms來臨則進(jìn)入case0重新按鍵掃描;否則仍然key_state=3,繼續(xù)等待釋放。這里也巧妙地利用了這10 ms進(jìn)行按鍵釋放時(shí)的去抖動(dòng)處理。
另外在多鍵(含雙鍵)、特殊功能鍵和復(fù)合鍵的實(shí)現(xiàn)中,該軟件也設(shè)計(jì)了比較好的實(shí)現(xiàn)方法。譬如多鍵,設(shè)置內(nèi)部緩存器,在逐行掃描中將每個(gè)按下按鍵在矩陣鍵盤中的位置代碼存入其中。之后的消抖處理等操作的對(duì)象便是緩存器中的按鍵位置代碼值。系統(tǒng)處理的普通鍵數(shù)最多為6個(gè),超過則為溢出。對(duì)于特殊功能鍵,其形式上是單鍵,實(shí)際實(shí)現(xiàn)的是多鍵的功能。只要將單鍵在發(fā)送前轉(zhuǎn)換成需要的多鍵HID碼,即可方便實(shí)現(xiàn)。對(duì)于復(fù)合鍵,理論上是兩個(gè)以上按鍵同時(shí)按下所完成的功能,實(shí)際情況很難實(shí)現(xiàn)真正的“同時(shí)按下”,它們的時(shí)間差別可能長(zhǎng)達(dá)50 ms。譬如對(duì)引導(dǎo)鍵SHIFT鍵的設(shè)計(jì),需設(shè)置專門標(biāo)志位Shiftkey_flag,有SHIFT按下則 Shiftkey_flag=1,否則為0。在第一次檢測(cè)出SHIFT單按鍵時(shí),改變狀態(tài)標(biāo)志位為1。隨后的按鍵掃描中,若再無其他按鍵按下,則key_state=0,直到有其他按鍵按下,key_state=1。這在軟件中實(shí)際上是對(duì)狀態(tài)0的細(xì)化。同理,在各個(gè)狀態(tài)中,因?yàn)樵撴I的特殊性,也有相應(yīng)的細(xì)化過程。
從以上分析可見,這樣的軟件設(shè)計(jì)不僅結(jié)構(gòu)清晰,代碼簡(jiǎn)潔、實(shí)現(xiàn)便捷,而且使得當(dāng)無按鍵按下,鍵盤每10 ms掃描一次;當(dāng)有確定非復(fù)合按鍵按下(即通過消抖處理),則鍵盤響應(yīng)速度在30 ms以內(nèi),如此的響應(yīng)速度大大提高了鍵盤的靈敏度。
DCS系統(tǒng)是目前工業(yè)控制領(lǐng)域的核心系統(tǒng),其專用鍵盤是提高整個(gè)生產(chǎn)線自動(dòng)化能力的關(guān)鍵一環(huán)。該專用鍵盤的設(shè)計(jì)避免了現(xiàn)有鍵盤電路特殊按鍵實(shí)現(xiàn)復(fù)雜、軟硬件成本高的情況。本文研究開發(fā)的基于ARM的DCS專用工業(yè)鍵盤,實(shí)現(xiàn)了對(duì)多達(dá)86個(gè)按鍵的控制。采用STM32芯片及有效率的軟件開發(fā)大大提高了產(chǎn)品開發(fā)的速度。經(jīng)過實(shí)驗(yàn)結(jié)果與實(shí)際應(yīng)用證明,該專用鍵盤易用性、可靠性達(dá)到了工業(yè)要求,并可產(chǎn)生很大的經(jīng)濟(jì)效益。
[1]王永虹,徐煒,郝立平.STM32系列 ARM Cortex-M3微控制器原理與實(shí)踐[M].北京:北京航天航空大學(xué)出版社,2008.
[2]馬潮.AVR單片機(jī)嵌入式系統(tǒng)原理與應(yīng)用實(shí)踐 [M].北京:北京航天航空大學(xué)出版社,2007.
[3]劉榮.圈圈教你玩USB[M].北京:北京航天航空大學(xué)出版社,2009.
[4]廖濟(jì)林.USB2.0應(yīng)用系統(tǒng)開發(fā)實(shí)例精講[M].北京:電子
工業(yè)出版社,2006.