徐鵬飛,李燁,熊勇,齊海濤
(北京航空航天大學(xué),北京,102206)
北京航空航天大學(xué)工程訓(xùn)練中心的《綜合創(chuàng)新訓(xùn)練》課程歷史悠久、內(nèi)容豐富、深受學(xué)生好評,而四層模擬電梯控制是其中一個(gè)重要的內(nèi)容,為了實(shí)現(xiàn)電梯的教學(xué)活動,工程訓(xùn)練中心設(shè)計(jì)了CTS1600-I 四層模擬電梯代替真實(shí)電梯,不僅可以直觀顯示電梯活動過程,而且還可以擴(kuò)展實(shí)現(xiàn)其它內(nèi)容;為了實(shí)現(xiàn)對四層模擬電梯的控制,就需要設(shè)計(jì)一款運(yùn)行速度快、成本低、體積小、功能強(qiáng)大、支持C 語言開發(fā)的控制電路板。STM32F103 是增強(qiáng)型產(chǎn)品系列,其處理運(yùn)算主頻可以達(dá)到72MHz,是同類產(chǎn)品中性能較高的產(chǎn)品[1]。STM32F103 是Cortex ?-M3 內(nèi)核的單片機(jī),Cortex ?-M3內(nèi)核性能強(qiáng)勁、功耗低、實(shí)時(shí)性好[2]。綜合考慮了成本、性能等因素,經(jīng)過篩選,STM32F103RBT6 可以滿足要求。
圖1 電梯接口
CTS1600-I 四層模擬電梯有一個(gè)可以上下運(yùn)動的轎廂,轎廂內(nèi)有1、2、3、4 層和開關(guān)門請求輕觸開關(guān)。轎廂由一個(gè)12V 直流電機(jī)控制,電機(jī)輸入控制端有2 個(gè)I/O,分別為“選通”和“上行”,當(dāng)“選通”和“上行”分別為高、低電平時(shí),轎廂下行運(yùn)動;當(dāng)“選通”和“上行”分別為高、高電平時(shí),轎廂上行運(yùn)動;當(dāng)“選通”為低電平時(shí),無論“上行”為高還是低電平,轎廂均停止運(yùn)動;通過2 個(gè)I/O 的高低電平組合,轎廂可以實(shí)現(xiàn)停止、上行、下行三種運(yùn)動狀態(tài);將“上行”I/O 直接關(guān)聯(lián)到電梯的上下行指示燈,用于指示電梯的運(yùn)動狀態(tài)和停止時(shí)的上一次運(yùn)動狀態(tài)。在電梯的每層都內(nèi)置了轎廂到達(dá)行程開關(guān),可以檢測轎廂的位置。電梯外面中間每層有上請求、下請求輕觸開關(guān),頂層只有下請求輕觸開關(guān),底層只有上請求輕觸開關(guān),在輕觸開關(guān)內(nèi)部內(nèi)置了可以被控制的發(fā)光二極管。開關(guān)門電機(jī)也是1 個(gè)12V 直流電機(jī),與轎廂電機(jī)控制類似,可以由2 個(gè)I/O 控制,分別實(shí)現(xiàn)停止、開門、關(guān)門三個(gè)運(yùn)動狀態(tài)。在門的內(nèi)部內(nèi)置了關(guān)門到位和開門到位行程開關(guān)。在電梯上方位置有一個(gè)顯示樓層號的8 段LED 顯示器。
CTS1600-I 四層模擬電梯有一個(gè)40 針的控制接口,此接口信號可以分為輸入、輸出、電源三部分。在電梯內(nèi)部有光耦進(jìn)行隔離,所以控制板需要對接口進(jìn)行供電,經(jīng)過測試,直流5V 供電可以滿足要求,所以輸入輸出接口信號均使用5V 供電下的邏輯電平即可。由于電梯使用了光耦隔離,減小了外部噪聲的干擾,所以系統(tǒng)運(yùn)行穩(wěn)定,并且連接接口可以選用長一些的電纜線。
圖2 SWD 下載接口
系統(tǒng)硬件設(shè)計(jì)分為單片機(jī)部分和接口驅(qū)動部分。
單片機(jī)電路由下載接口、晶振、電源、I/O、復(fù)位、指示燈等幾部分組成。
圖3 單片機(jī)電源電路
單片機(jī)下載接口使用的是SWD 接口,因?yàn)镾WD 接口不僅可以實(shí)現(xiàn)下載、調(diào)試等功能,而且其引腳比JTAG 接口少很多,只需要SWCLK、SWDIO、復(fù)位、地等信號即可,其占電路板面積也很少。
單片機(jī)使用的是由5V 經(jīng)過LM1117 穩(wěn)壓后形成的3.3V 電壓,為了防止靜電等原因形成的瞬時(shí)高壓燒毀電路芯片,在LM1117 的輸入和輸出端對地均連接了瞬態(tài)抑制二極管。
單片機(jī)使用的是無源8MHz晶振。
單片機(jī)復(fù)位由上電復(fù)位和輕觸開關(guān)復(fù)位兩部分組成。為了得到可靠的上電復(fù)位,單片機(jī)的復(fù)位引腳通過一個(gè)10Ω電阻連接到MAX809的輸出引腳。在上電時(shí),MAX809輸出一個(gè)維持140ms 的低電平復(fù)位脈沖,此脈沖使單片機(jī)STM32F103RBT6 復(fù)位。輕觸開關(guān)按下時(shí),單片機(jī)復(fù)位引腳連接到地,使單片機(jī)復(fù)位。MAX809 的輸出端和輕觸開關(guān)之間并不是直接連接,而是串接了一個(gè)10Ω 的電阻,其起到保護(hù)MAX809 芯片的作用。這樣設(shè)計(jì)的目的是為了兼顧上電復(fù)位和開關(guān)復(fù)位,并且電路實(shí)現(xiàn)起來比較簡單。MAX809 的上電復(fù)位的可靠性比RC 上電復(fù)位要高很多。
圖4 單片機(jī)復(fù)位電路
為了直觀查看電路情況,設(shè)計(jì)了電源指示燈和單片機(jī)運(yùn)行狀態(tài)指示燈。電源指示燈用于觀察電路是否供電正常。單片機(jī)PA7 引腳連接發(fā)光二極管的陰極,當(dāng)單片機(jī)程序運(yùn)行時(shí),在主循環(huán)程序里操作PA7,使其定時(shí)輸出高低電平,從而D3 閃爍,此設(shè)計(jì)可以觀察單片機(jī)程序的工作狀態(tài),比如其是否進(jìn)入了死循環(huán)等情況。
圖5 單片機(jī)核心電路
單片機(jī)的核心電路就是GPIO 引腳的輸入輸出連接。這些引腳如果直接連接電梯接口,那么經(jīng)過電纜線就容易引入噪聲干擾,使得單片機(jī)工作不穩(wěn)定,容易造成硬件損壞、程序停機(jī)、程序丟失等問題,并且容易出現(xiàn)在SWD 方式下進(jìn)行下載、調(diào)試時(shí)出現(xiàn)錯(cuò)誤,所以這些引腳都通過74HC245進(jìn)行了隔離。
圖6 指示燈電路
接口驅(qū)動電路部分由74HC245 芯片構(gòu)成,其目的是為了實(shí)現(xiàn)增強(qiáng)輸出電壓、電流能力,提高抗干擾能力。74HC245 的1 腳連接+5V,19 腳連接地,數(shù)據(jù)傳輸是從A 口進(jìn)入,B 口輸出。單片機(jī)對外輸出的GPIO 引腳連接74HC245 的輸入,經(jīng)過驅(qū)動后連接到電梯接口的輸入引腳上;電梯接口的輸出引腳連接在74HC245 的輸入,經(jīng)過驅(qū)動后連接到單片機(jī)GPIO 對外輸入引腳上。如果STM 單片機(jī)處于復(fù)位狀態(tài),此時(shí)GPIO 引腳是浮空輸入模式,不對外輸出確定電平,此時(shí)電梯容易出現(xiàn)誤動作,所以在74245的輸入引腳連接有對地電阻,使得74245 的輸出為低電平,從而電梯接口輸入引腳收到的都是低電平信號,上下行和開關(guān)門電機(jī)都處于停止?fàn)顟B(tài),不會由于運(yùn)動而造成事故,這是一個(gè)簡單而重要的設(shè)計(jì)。74HC245 的電源使用的是直流5V,這樣設(shè)計(jì)的目的不僅可以延長電梯接口電纜的長度,而且也考慮了STM 的GPIO 可以接受5V 電平下的邏輯信號的情況。
圖7 電梯驅(qū)動電路
在系統(tǒng)軟件設(shè)計(jì)中,把電梯程序分為驅(qū)動和邏輯兩層,兩層是獨(dú)立的。
指針是C 語言中的一個(gè)重要概念,也是C 語言的一個(gè)重要特色。正確而靈活地運(yùn)用它,可以使程序簡潔、緊湊、高效[3]。在驅(qū)動層,通過定義結(jié)構(gòu)體,內(nèi)置指針指向正確的寄存器,主程序操作指針即可完成對硬件的操作。GPIO外設(shè)分為輸入和輸出兩種,分別對應(yīng)不同的結(jié)構(gòu)體。輸出GPIO 的結(jié)構(gòu)體定義如下:
判斷轎廂是否到達(dá)1 層的代碼如下:
if( (*gs_IO_Input_LayerSensor[0].pul_IDR) & gs_IO_Input_LayerSensor[0].ulPin)
圖8 電梯程序流程圖
驅(qū)動層用結(jié)構(gòu)體變量,而不是直接使用GPIO 寄存器來進(jìn)行讀寫有很大的優(yōu)點(diǎn),可以很容易做到修改IO 和電梯硬件的關(guān)系,如果修改了電路板,或者更換了單片機(jī),只需要修改定義時(shí)的初始化值即可,軟件容易修改,如果不使用結(jié)構(gòu)體變量而是在代碼里有IO操作,則軟件很不容易修改正確。
在邏輯層,把電梯抽象為停止和運(yùn)動兩種行為,這兩種行為可以在一定條件下相互轉(zhuǎn)化。在停止?fàn)顟B(tài)下,程序判斷是否本層內(nèi)外按鍵按下過,如果按下過則產(chǎn)生請求,如果請求存在,執(zhí)行開關(guān)門過程;如果上層請求存在而下層請求不存在或者上下請求均存在但是電梯上次運(yùn)行狀態(tài)是上行,則啟動電梯向上運(yùn)行;如果下層請求存在而上層請求不存在或者上下請求均存在但是電梯上次運(yùn)行狀態(tài)是下行,則啟動電梯向下運(yùn)行。在運(yùn)行狀態(tài)下,如果發(fā)現(xiàn)轎廂到達(dá)某樓層,如果此層是頂層或者底層,或者此層有請求,則電梯停止運(yùn)行,執(zhí)行開關(guān)門過程。在同時(shí)有上下層請求時(shí),根據(jù)上次電梯運(yùn)行狀態(tài)啟動電梯運(yùn)行,這樣設(shè)計(jì)的目的是防止電梯轎廂在某些層之間出現(xiàn)反復(fù)上下運(yùn)動,而其他層的請求長時(shí)間得不到響應(yīng),只有盡量保持電梯運(yùn)行方向不變,才可以使每一層的請求響應(yīng)機(jī)會均等。
如何做到驅(qū)動層和邏輯層進(jìn)行通信呢?在main 函數(shù)初始化代碼里,啟用了SysTick 定時(shí)中斷,在此中斷里,把驅(qū)動I/O 的值和電梯結(jié)構(gòu)體變量的各個(gè)成員變量進(jìn)行了相互交換,對邏輯層的各個(gè)行為完成了物理實(shí)現(xiàn)。
在調(diào)試電梯控制板時(shí),可以直接寫一些I/O 的讀寫語句,然后設(shè)斷點(diǎn)或者單步運(yùn)行,觀察電梯的各個(gè)部分是否正常工作。對于電機(jī)的調(diào)試有一些復(fù)雜,需要在運(yùn)行語句之后寫停止語句,防止電梯運(yùn)行出現(xiàn)故障。
圖9 電梯控制電路板3D 顯示圖
由于驅(qū)動層和邏輯層在定時(shí)中斷里完成數(shù)據(jù)交換,所以在操作一些I/O 時(shí),需要添加一些延時(shí)語句或者是判斷語句,比如:啟動了電機(jī)運(yùn)行向上之后,需要判斷本層傳感器是否輸出為0,然后延時(shí)幾百毫秒,再進(jìn)行其它的處理,這樣做的好處是確保轎廂離開了本層,程序工作起來比較可靠。
通過對CTS1600-I 四層模擬電梯的控制電路板的設(shè)計(jì),有了很多收獲,并且《綜合創(chuàng)新訓(xùn)練》課程也能如期正常進(jìn)行,對于學(xué)生的編程能力、機(jī)械相關(guān)能力、電路設(shè)計(jì)能力、電路焊接能力等方面有了很大的提高。