卜云祥 黃巧亮 華明公
(1.江蘇科技大學電子信息學院 鎮(zhèn)江 212000)(2.常州今創(chuàng)集團 常州 213011)
國外塞拉門的發(fā)展已經有多年歷史,國內塞拉門的發(fā)展也有近 20年歷史[1~2],自動化、智能化、高密封性[3~4]、高安全性與可靠性應是高鐵塞拉門的發(fā)展趨勢,而塞拉門門控器的設計則成為重要設計內容之一。
本文基于OMAPL138芯片的門控器設計,是對現有塞拉門控制器采用兩個獨立核心板進行控制所存在的占用空間大、硬件成本高、后期軟硬件維護難度大等缺陷進行優(yōu)化設計。本設計采用TI公司的DSP+ARM雙核異構處理器,有效解決了原設計存在的缺陷并提高了塞拉門控制的精確性和穩(wěn)?定性。
塞拉門控制的具體功能要求如下。
1)數據采集。塞拉門控制器通過傳感器采集門的狀態(tài)信息,每個門對應一個特定的ID,通過采集電路將采集到的門ID,開/關門按鈕指令信息、氣壓信息、速度值等,送入控制器的CPU芯片中進行診斷處理。
2)狀態(tài)檢測。門控器核心板上處理器在判斷出當前開門/關門/障礙物/故障狀態(tài)后,根據不同情況作出不同反饋動作。障礙物/故障類別主要有敏感膠條觸發(fā)、關門卡滯、開門受阻。開門受阻和關門卡滯情況,連續(xù)出現三次后,門停止開關門嘗試,停在當前位置并向總控臺發(fā)送診斷信息。故障信息則包括網絡故障、氣壓故障、門鎖未鎖死/未打開故障、開到位/關到位檢測故障等。處理器需要對檢測過程中的診斷信息進行存儲。
3)數據通信。處理器可與外界進行通信,通信對象可以是其他門控器、或上位機。
為滿足塞拉門控制的功能要求,本設計的門控器核心硬件設計采用主從處理器模式,即主處理器(ARM核)主要用于對上位機通信及數據存儲;從處理器(DSP核)主要用于對采集來的車門狀態(tài)進行分析和判斷并對塞拉門驅動電機的控制。從處理器對車門狀態(tài)的診斷信息能傳輸給主處理器進行存儲。
主處理器的硬件框圖如圖1所示。主處理器(ARM核)用于門控器之間數據通信、門控器與總控臺之間的以太網通信[5]、診斷信息的存儲處理及通信等。
NAND FLASH存儲模塊,NAND FLASH芯片選用S34ML01G1_04G1,用于存放主處理器運行Linux系統所需文件系統、內核文件、u-boot引導文件[6]。
DDR2共享存儲模塊,芯片選用MT47H64M16HR-25EITH,用于雙核芯片DSP核和ARM核間的診斷信息數據的共享存儲和讀寫。
串口模塊,主處理器通過UART2_RXD和UART2_TXD引腳連接UART接口,以便于連接上位機軟件進行串口調試。
以太網通信模塊,主處理器通過RMII_RXD和RMII_TXD引腳連接以太網通信接口用于和總控臺進行數據通信。
SD Card模塊,通過MMCSD0_DAT數據引腳與主處理器相連,主要用于芯片ARM端運行的Linux系統的更新。
圖1 主處理器硬件框圖
從處理器(DSP核)用于對采集來的車門狀態(tài)進行分析和判斷。通過采樣,檢測到塞拉門出現故障時,能及時判斷發(fā)生的故障。故障分為A、B、C三級:A級,車門立刻停止動作,進入釋放狀態(tài),等待手動操作;B級:車門將繼續(xù)進行開/關門嘗試;C級:不影響門運行狀態(tài)。故障不論級別,均會通過雙核通信將診斷信息傳送到主處理器(ARM核)存儲,而正常運行時開關門信息則不進行診斷數據傳輸與存儲。從處理器還能實現對塞拉門驅動電機的控制[7]。該部分硬件框圖如圖2所示。
圖2 從處理器硬件框圖
從處理器通過ADC采樣引腳(Current1/2),連接外設系統的電流電壓采樣電路,用于對采集來的車門狀態(tài)進行分析和判斷。
從處理器通過eCAP口,與捕獲電路相連,使得從處理器具有故障診斷功能。
從處理器通過普通GPIO口接口,與門控器電路相連,實現對塞拉門主鎖、輔助鎖、報警裝置等硬件設備的控制,檢測到開/關門信號(GPIO)時能及時執(zhí)行開關門命令。
從處理器通過3路ePWM引腳連接電機驅動電路,實現對塞拉門驅動電機的控制。電機采用無刷直流電機。
DDR2共享存儲模塊,用于雙核芯片DSP核和ARM核間對車門診斷信息數據的共享存儲和讀寫。
從處理器通過普通GPIO口與外圍設備蜂鳴器相連,用于對嚴重故障信息的報警發(fā)聲。
OMAPL138是DSP+ARM雙核異構處理器[8],在本設計中,ARM核選用Linux系統環(huán)境Ubuntu 12.04取代之前的裸機開發(fā),該版本內核支持OMAPL138的雙核通信所用到的SYSLINK組件。DSP核則選擇在Linux系統中安裝Code Composer Studio 5.5(CCS 5.5)作為開發(fā)平臺以降低后期軟件維護難度。
本設計中,根據塞拉門控制器的功能需求以及雙核芯片的硬件特點,控制器軟件設計主要分為主處理器軟件設計和從處理器軟件設計,本系統軟件設計總框圖如圖3所示。
圖3 系統軟件設計流程總圖
Syslink組件部分由主處理器進行啟動并分配共享內存空間[9~10],依賴于主處理器啟動,從處理器啟動Syslink組件時只為從處理器本身分配雙核通信空間。
由于塞拉門故障信息反饋對實時性要求較高,故Syslink組件啟動[11]后,主處理器不進行組件的注銷,Syslink組件隨門控器運行而運行,使得主從處理器一直處于雙核通信的同步連通狀態(tài)。從而保證了故障反饋的實時性,增加了塞拉門控制的可靠性和安全性。
Syslink中的處理器間通信協議(IPC Protocols)有很多類[12],本設計綜合使用了多種組件和協議來傳輸診斷信息,共享內存地址范圍為:0xc200 0000~0xc400 0000。Syslink 進 程 創(chuàng) 建 函 數 syslink_main()包含兩步,程序如下:
在主處理中,啟動Syslink組件的啟動函數Syslink*dual_core_link_new()處理流程如圖4所示。主要實現總圖中,分配ARM端地址空間、初始化Syslink組件、連接IPC接口部分的功能。
通過函數dual_core_link_start()實現雙核間通信建立流程如圖5所示。主要實現總圖中,IPC通信啟動及連接部分的功能。
圖4 Syslink創(chuàng)建流程圖
圖5 Syslink啟動流程圖
通信的建立只能由主處理器發(fā)起,從處理器則在上電自動啟動Syslink組件后進入等待狀態(tài)。
1)通過dual_core_link_new()函數創(chuàng)建雙核通信進程。
首先主處理器需要為Syslink組件分配一個連續(xù)的內存空間以及為從處理器DSP分配一個存儲空間:
Syslink*dual_core_linkspace=(Syslink*)calloc(1,sizeof(Syslink));
內存空間分配完成后,調用Syslink啟動函數SysLink_setup(),初始化 Syslink組件,該函數為Syslink API接口函數,且必須在調用其他Syslink API函數之前調用。該函數調用時,若啟動失敗,則將錯誤信息存儲到指定文件夾“stderr”中,延時1ms后再次嘗試啟動,最多嘗試啟動100次?!皊tderr”存儲信息時,通過記錄信息條數stderr_msg_count來確定是否初始化失敗,若失敗,則門控器數碼管顯示故障代碼init_error_code。此時需要斷電后重新給門控器上電。
if(stderr_msg_count>=100){Dig_display(init_error_code);break;}
調用Syslink API接口函數MultiProc_getId()獲取從處理器ID(從處理器ID此后不可更改),然后返回Syslink組件分配到的內存空間首地址。
2)通過函數dual_core_link_start()實現雙核通信建立。
根據新建雙核進程時獲得的從處理器ID:Processor_dsp_address,主處理器調用Syslink API接口函數Ipc_control()函數,先后進行加載、啟動雙核通信進程:
status_load=Ipc_control(*Processor_dsp_address,0xBABE0000,NULL);
if(status_load < 0){return false;}
0xBABE0000為IPC加載回調函數控制命令的ID,本段程序功能為發(fā)送加載雙核通信組件命令給從處理器,Ipc_control()函數若通信加載成功則返回0,失敗返回負值,根據其返回值,從而判斷雙核間通信是否成功加載。
加載后需要發(fā)送啟動雙核通信組件命令給從處理器,啟動命令的判斷過程與加載命令的判斷過程相同,啟動命令名為Ipc_CONTROLCMD_STARTCALLBACK,啟 動 命 令 ID為0xBABE0001。
dual_core_link_start()函數返回值為布爾型,根據返回值可判斷雙核通信是否啟動成功。若成功,則開始進行雙核同步處理;若失敗,則報錯并在門控器數碼管顯示故障代碼后等待門控器核心板斷電重啟。
if(! dual_core_link_start){Dig_display(start_error_code);break;}
雙核同步處理過程,首先使用進程間信號量進行初始化并占用線程,然后使用Syslink IPC協議中的Notify_registerEvent()函數注冊雙核同步事件,最后解除進程間信號量阻塞,實現雙核間通信同步。
主處理器在進入同步等待狀態(tài)后,創(chuàng)建共享內存,通過Syslink IPC協議中的NameServer通信協議上傳共享內存地址到Syslink組件。創(chuàng)建共享內存、設置共享內存大小由函數SharedRegion_getH-eap()、Memory_calloc()完成,由于傳輸數據內容較多,所以創(chuàng)建的共享內存空間要取較大值,本設計取共享內存空間大小為1M。
從處理器即DSP端啟動流程如圖3右側所示,Syslink組件的創(chuàng)建和初始化過程和主處理器相同,初始化Syslink組件后進入循環(huán)等待狀態(tài),DSP每隔1ms查詢一次IPC端口狀態(tài)。在收到主處理器端發(fā)送的Ipc_CONTROLCMD_LOADCALLBACK加載命令[13]后啟動IPC通信。在收到主處理器端Ipc_CONTROLCMD_STARTCALLBACK命令后,退出循環(huán)等待狀態(tài),完成Syslink組件的創(chuàng)建和IPC通信連接[14]。
在雙核通信連接建立后,DSP開始進入工作狀態(tài),進入車門診斷流程,DSP端診斷出故障信息時,獲取共享內存地址,寫入診斷信息(車門ID、故障代碼、IO狀態(tài)、網絡信息、發(fā)生時間等)。其中,對敏感膠條的長時間觸發(fā)診斷流程圖如圖6所示,診斷功能為內側敏感元件一直有效,報此故障。
根據模塊化的設計要求,向共享內存寫入故障信息主要由Message_store()函數實現。Dig_display()函數為顯示函數,用于控制數碼管上故障代碼顯示。Timer_start()函數用于啟動定時器,Timer_reset()函數用于復位定時器。
在內部敏感膠條被按下時,內部敏感膠條信號置1,同時檢測定時器0的狀態(tài)若定時器未啟動則啟動定時器0。開始計時,若已啟動定時器0,則繼續(xù)計時;若計時未到60s,則繼續(xù)采集內部敏感膠條信號:
若敏感膠條持續(xù)觸發(fā)且時間超過seted_time(60s)時,判定為已觸發(fā)此故障。通過Message_store()函數對故障信息進行記錄并存入共享內存中,通過Dig_display()函數在門控器上顯示故障代碼。從而實現了對內部敏感膠條故障的診斷。
其余診斷流程與敏感膠條診斷流程類似,就不再贅述了。至此,塞拉門控制器的軟件設計全部完成。
圖6 敏感膠條故障診斷流程圖
本設計基于OMAPL138的塞拉門控制器研究,減小了塞拉門控制器占用空間,通過SyslinkIPC雙核通信保證了數據傳輸的快速性[15~16],增強了控制系統的精確性,降低了后期軟硬件維護難度,為開發(fā)提供了便利,并且在實際應用中驗證了可行性。
接下來的研究中,將嘗試加入LCD顯示屏數據接口。由于目前進行后期軟件維護時,需要攜帶電腦,數據線等設備,而在調試現場的操作空間并沒有那么大,現場維護有一定難度。使用LCD顯示屏可以使后期的軟件維護更加方便快速。