摘 要: 介紹了一種船舶主機(jī)燃油粘度試驗(yàn)臺(tái)中粘度控制器的設(shè)計(jì)。包括控制器人機(jī)界面的設(shè)計(jì)、控制器的嵌入式開(kāi)發(fā)平臺(tái)和開(kāi)發(fā)環(huán)境、硬件接口設(shè)計(jì)原理以及軟件設(shè)計(jì)方法等。
關(guān)鍵詞: 嵌入式;主機(jī);粘度;控制
近代船舶柴油機(jī)為降低營(yíng)運(yùn)成本,使用低質(zhì)燃油,由于在常溫下其粘度很高,在管路中難以運(yùn)輸,更不能直接噴入氣缸進(jìn)行燃燒。為了保證船舶主機(jī)燃燒良好,能正常運(yùn)行,燃油粘度必須保持在一個(gè)合適的范圍內(nèi)[1]。半實(shí)物主機(jī)燃油粘度仿真控制系統(tǒng),把船上的燃油粘度控制系統(tǒng)遷移到了教學(xué)實(shí)驗(yàn)室中。本文內(nèi)容為試驗(yàn)臺(tái)上粘度控制器的設(shè)計(jì)與實(shí)現(xiàn)。
1 粘度控制器人機(jī)界面
粘度控制器人機(jī)界面如圖1所示。矩形區(qū)域?yàn)長(zhǎng)CD顯示區(qū)域。下方8個(gè)按鍵區(qū)域?yàn)榭刂茽顟B(tài)選擇區(qū),分別有粘度控制、溫度控制、手動(dòng)控制和停止控制、主界面、設(shè)置模式、報(bào)警復(fù)位等按鍵。右邊16個(gè)按鍵的區(qū)域?yàn)閿?shù)字鍵操作區(qū)域和符號(hào)鍵區(qū)域。包括數(shù)字鍵、修改數(shù)據(jù)、移動(dòng)光標(biāo)、清除數(shù)據(jù)、確定等按鍵。
2 控制器硬件設(shè)計(jì)
在本半實(shí)物主機(jī)燃油粘度控制系統(tǒng)設(shè)計(jì)中,燃油粘度控制器需要實(shí)現(xiàn)操作模式、控制方式、開(kāi)關(guān)量、數(shù)據(jù)量等狀態(tài)的顯示,也要實(shí)現(xiàn)各個(gè)變量的修改,也可以進(jìn)行報(bào)警復(fù)位的操作。為實(shí)現(xiàn)如上功能,除需要嵌入式網(wǎng)絡(luò)模塊外還需有LCD顯示、鍵盤輸入、與上位機(jī)通信、開(kāi)關(guān)量輸出等模塊。
2.1 嵌入式網(wǎng)絡(luò)模塊
控制器以成都英創(chuàng)的EM9260嵌入式網(wǎng)絡(luò)模塊為基礎(chǔ)開(kāi)發(fā)完成。EM9260是一款面向工業(yè)自動(dòng)化領(lǐng)域的高性價(jià)比嵌入式網(wǎng)絡(luò)模塊,其內(nèi)核CPU為工業(yè)級(jí)品質(zhì)的AT91SAM9260,模塊已預(yù)裝正版Window CE5.0實(shí)時(shí)多任務(wù)操作系統(tǒng),用戶可直接使用Microsoft提供的免費(fèi)軟件開(kāi)發(fā)工具eVC(+SP4)或其他更高版本的開(kāi)發(fā)工具,在EM9260上開(kāi)發(fā)自己的應(yīng)用程序。英創(chuàng)公司針對(duì)EM9260提供了完整的接口底層驅(qū)動(dòng)以及豐富的應(yīng)用程序范例,用戶可在此基礎(chǔ)上方便、快速地開(kāi)發(fā)出各種工控產(chǎn)品。
2.2 LCD顯示部分
EM9260的主要應(yīng)用領(lǐng)域是那些需要連續(xù)工作的工業(yè)環(huán)境,甚至是無(wú)人值守的環(huán)境,因此對(duì)顯示的要求相對(duì)較低。即使使用LCD,通常也是顯示一些設(shè)備工況信息,因此可選用一些低成本LCD模塊,如控制器為KS0108、分辨率為128×64的點(diǎn)陣LCD模塊就是典型的低成本LCD。在程序設(shè)計(jì)上,LCD顯示僅僅是作為ISA總線上擴(kuò)展的簡(jiǎn)單外設(shè),而不是通常意義下的Windows顯示窗口。從CE的觀點(diǎn)來(lái)看,EM9260屬于典型的無(wú)頭設(shè)備(Headless)。對(duì)常用的幾款低成本LCD屏,EM9260的LCD驅(qū)動(dòng)程序可實(shí)現(xiàn)自動(dòng)識(shí)別,為客戶產(chǎn)品的LCD選型提供了靈活性。
控制器選用240×128 LCD屏,將信號(hào)線與模塊連接即可實(shí)現(xiàn)。LCD信號(hào)接口電路如圖2所示。
圖4是通過(guò)ISA總線擴(kuò)展矩陣鍵盤的原理圖,用1片74HCT139對(duì)總線地址譯碼,再通過(guò)74HCT273實(shí)現(xiàn)8位數(shù)字輸出用于掃描輸出,通過(guò)74HCT245回讀掃描碼,僅需要3個(gè)器件,就能實(shí)現(xiàn)8×8矩陣鍵盤擴(kuò)展。
外接矩陣鍵盤原理圖如圖5所示。
將CAN接口與CAN接口卡按信號(hào)線相接,即可實(shí)現(xiàn)與上位機(jī)的通信。
2.5 開(kāi)關(guān)量輸出部分
使用嵌入式模塊的GPIO輸出接口,可以實(shí)現(xiàn)控制器的報(bào)警聲音,以及指示燈的點(diǎn)亮。電路如圖7所示。
3 控制器軟件設(shè)計(jì)
主板安裝了操作系統(tǒng)WindowsCE,WindowsCE是微軟公司嵌入式、移動(dòng)計(jì)算平臺(tái)的基礎(chǔ),它是一個(gè)開(kāi)放的、可升級(jí)的32位嵌入式操作系統(tǒng),是基于掌上電腦類的電子設(shè)備操作系統(tǒng),Windows CE是精簡(jiǎn)的Windows 95,它的圖形用戶界面相當(dāng)出色。Windows CE是有優(yōu)先級(jí)的多任務(wù)操作系統(tǒng),它允許多重功能、進(jìn)程在相同時(shí)間系統(tǒng)中運(yùn)行Windows CE支持最大的32位同步進(jìn)程。一個(gè)進(jìn)程包括一個(gè)或多個(gè)線程,每個(gè)線程代表進(jìn)程的一個(gè)獨(dú)立部分,一個(gè)線程被指定為進(jìn)程的基本線程,進(jìn)程也能創(chuàng)造一個(gè)未定數(shù)目的額外線程,額外線程實(shí)際數(shù)目?jī)H由可利用的系統(tǒng)資源限定[2]。
軟件開(kāi)發(fā)工具為eVC,eVC是微軟針對(duì)嵌入式系統(tǒng)提供的一套功能完善且可免費(fèi)獲取的開(kāi)發(fā)工具,與PC平臺(tái)通用的VC保持了高度的一致性,同時(shí)考慮C/C++的執(zhí)行效率,因此eVC被作為EM9260應(yīng)用程序開(kāi)發(fā)的首選工具。建立好英創(chuàng)ARM9嵌入式模塊所需的硬、軟件開(kāi)發(fā)環(huán)境,并利用以太網(wǎng)將開(kāi)發(fā)主機(jī)和英創(chuàng)ARM9嵌入式模塊連接成功以后,用戶就可以通過(guò)eVC開(kāi)發(fā)、調(diào)試自己所需的應(yīng)用程序了。eVC開(kāi)發(fā)環(huán)境和普通的VC非常相似,客戶可以通過(guò)市面上很常見(jiàn)的大量VC書籍資料來(lái)進(jìn)行編程方面的學(xué)習(xí)。然而,使用eVC開(kāi)發(fā)和VC的最大區(qū)別之一在于VC開(kāi)發(fā)的程序直接運(yùn)行于普通PC機(jī);eVC開(kāi)發(fā)的應(yīng)用程序最終要在目標(biāo)機(jī)而非PC機(jī)上運(yùn)行調(diào)試。這一過(guò)程是廣大VC程序員和剛接觸嵌入式系統(tǒng)的工程師所不熟悉的。
3.1 系統(tǒng)主程序軟件設(shè)計(jì)
根據(jù)控制器系統(tǒng)設(shè)計(jì),軟件開(kāi)發(fā)涉及到LCD菜單顯示、按鍵、CAN通信等操作??刂破髦鞒绦蛄鞒虉D如圖8所示。
3.2 矩陣鍵盤軟件設(shè)計(jì)
矩陣鍵盤驅(qū)動(dòng)程序每隔20 ms掃描一次鍵盤,判斷是否有按鍵輸入,如果確認(rèn)了按鍵輸入,則產(chǎn)生WM_KEYDOWN消息,緊接著判斷按鍵是否釋放,按鍵釋放后產(chǎn)生WM_KEYUP消息,然后進(jìn)行下一次掃描,如此循環(huán)。圖9是按鍵掃描程序的流程圖。
根據(jù)上述流程圖,封裝的KEY_API類,該類提供兩個(gè)方法函數(shù),如下:
//打開(kāi)鍵盤掃描
//nRow,nCol矩陣鍵盤行列數(shù),最大為8×8
BOOL OpenKeyPad(int nRow,int nCol);
//關(guān)閉鍵盤掃描
BOOL CloseKeyPad();
通過(guò)KEY_API類,在應(yīng)用程序中,僅需要調(diào)用OpenKeyPad()函數(shù),就能打開(kāi)鍵盤掃描程序。當(dāng)鍵盤上某個(gè)鍵按下時(shí),驅(qū)動(dòng)程序?qū)a(chǎn)生WM_KEYDOWN和WM_KEYUP消息。這兩個(gè)消息的附加參數(shù)(wParam和lParam)包含的是虛擬鍵代碼和掃描碼等信息,應(yīng)用程序中可通過(guò)TranslateMessage函數(shù)將WM_KEYDOWN和WM_KEYUP消息組合轉(zhuǎn)換為一條WM_CHAR消息,該消息的wParam附加參數(shù)包含了按鍵字符的ASCII碼[3]。
3.3 CAN通信軟件設(shè)計(jì)
3.3.1 CAN報(bào)文的幀格式
在CAN2.0B中存在兩種不同的幀格式,其主要的區(qū)別在于標(biāo)識(shí)符的長(zhǎng)度,具有11位標(biāo)識(shí)符的幀稱為標(biāo)準(zhǔn)幀,而包括有29位標(biāo)識(shí)符的幀稱為擴(kuò)展幀。
3.3.2 啟動(dòng)CAN通信接口
CAN通信接口的驅(qū)動(dòng)程序采用的是WinCE下流式驅(qū)動(dòng)程序(StreamDevice Driver),并在此驅(qū)動(dòng)程序的基礎(chǔ)上為客戶封裝了一套簡(jiǎn)單實(shí)用的API函數(shù)。各個(gè)函數(shù)的定義在can_api.h文件下,在該頭文件中對(duì)于各個(gè)API函數(shù)均有相應(yīng)的中文說(shuō)明。作為流式接口函數(shù)通常是和文件系統(tǒng)的API函數(shù)(如CreateFile)緊密匹配的,因此在使用英創(chuàng)提供的CAN接口的API函數(shù)時(shí),首先需要調(diào)用CreateFile(…)來(lái)獲取CAN接口設(shè)備的句柄handle,如使用CAN1通信口,可以用以下函數(shù):
m_hCAN=CreateFile(_T(“CAN1:”),
GENERIC_READ|GENERIC_WRITE,
0,NULL,OPEN_EXISTING,0,NULL);
對(duì)于CAN2通信接口,只需將其中的名稱換成:_T(“CAN2:”)即可。在創(chuàng)建CAN設(shè)備得到有效的handle之后,就可以調(diào)用can_api.h中定義的相應(yīng)函數(shù)來(lái)啟動(dòng)CAN設(shè)備接口BOOL CAN_StartChip(HANDLE hDevice);至此CAN通信接口進(jìn)入工作模式。
3.3.3 設(shè)置CAN通信接口參數(shù)
在進(jìn)行CAN數(shù)據(jù)通信之前,需要設(shè)置和CAN通信相關(guān)的一些參數(shù),包括CAN通信的波特率設(shè)置以及對(duì)接收過(guò)濾器的設(shè)置。BOOL CAN_SetBaudRate(HANDLE hDevice,BYTE*index)用于設(shè)置CAN通信的波特率,波特率的設(shè)置范圍為:10 kb/s~1 Mb/s。具體的定義參見(jiàn)can_api.h文件中的注釋說(shuō)明。通過(guò)配置接收過(guò)濾器,CAN通信接口可以實(shí)現(xiàn)只接收標(biāo)識(shí)符也接收過(guò)濾器預(yù)設(shè)值相一致的報(bào)文。接收過(guò)濾器由接收碼寄存器ACRn和接收屏蔽碼寄存器AMRn來(lái)定義,還可以選擇兩種不同的過(guò)濾器模式,單過(guò)濾器模式或者雙過(guò)濾器模式。關(guān)于ACR、AMR中各位的定義,參見(jiàn)SJA1000的數(shù)據(jù)手冊(cè)。在英創(chuàng)提供的API函數(shù)中,用戶可以調(diào)用以下函數(shù)來(lái)實(shí)現(xiàn)接收過(guò)濾器的設(shè)置:
BOOL CAN_SetGlobalAcceptanceFilter(HANDLE hDevice,BYTE*AcceptanceFilter,BYTE size)
3.3.4 CAN通信接口的數(shù)據(jù)收發(fā)
采用的CAN通信方案中,CAN通信的數(shù)據(jù)收發(fā)均采用中斷方式,驅(qū)動(dòng)程序中已自動(dòng)完成了數(shù)據(jù)的收發(fā)以及內(nèi)部定義的CAN接收緩沖區(qū)和發(fā)送緩沖區(qū)的管理。對(duì)于用戶開(kāi)發(fā)應(yīng)用程序來(lái)說(shuō),只需要調(diào)用英創(chuàng)公司提供的CAN通信API函數(shù)中的收發(fā)函數(shù)即可[4]。
在進(jìn)行CAN通信應(yīng)用程序的開(kāi)發(fā)時(shí),對(duì)于CAN通信數(shù)據(jù)接收線程可以采用兩種方式:一種可以采用定時(shí)查詢,即定時(shí)調(diào)用函數(shù)CAN_GetNextReceivedFrame(…)檢測(cè)是否接收到CAN報(bào)文數(shù)據(jù);一種可以利用操作系統(tǒng)的消息機(jī)制,采用事件響應(yīng)的方式,一旦硬件接收到數(shù)據(jù)報(bào)文,底層的驅(qū)動(dòng)接收程序會(huì)自動(dòng)讀取報(bào)文,同時(shí)發(fā)送一個(gè)接收事件。作為應(yīng)用程序的接收線程在等待到該事件后,調(diào)用CAN_GetNextReceivedFrame(…)即可進(jìn)行CAN數(shù)據(jù)報(bào)文的讀取。需要注意的是函數(shù)CAN_GetNextReceivedFrame每執(zhí)行一次,只是讀取了1幀CAN數(shù)據(jù)報(bào)文,如果在應(yīng)用程序中需要將最新的數(shù)據(jù)全部讀出,只需反復(fù)調(diào)用該函數(shù),直到該函數(shù)的返回值為FALSE[5]。
CAN數(shù)據(jù)報(bào)文的發(fā)送比較簡(jiǎn)單,應(yīng)用程序直接調(diào)用函數(shù)CAN_SendFrame(…)即可。
在粘度控制器的開(kāi)發(fā)中,對(duì)嵌入式開(kāi)發(fā)平臺(tái)的熟悉過(guò)程至關(guān)重要。其中包括開(kāi)發(fā)板接口的使用,各個(gè)模塊的調(diào)試和實(shí)現(xiàn)。對(duì)硬件接口規(guī)劃完成后大量的工作集中在程序的編寫。包括擴(kuò)展鍵盤的實(shí)現(xiàn)中類庫(kù)的加載、數(shù)字量數(shù)據(jù)位數(shù)的調(diào)試、can通信規(guī)則的調(diào)試、光標(biāo)的實(shí)現(xiàn)過(guò)程中多線程方法的學(xué)習(xí)和使用,且解決了調(diào)試過(guò)程中發(fā)現(xiàn)的由于電磁干擾導(dǎo)致LCD復(fù)位黑屏的問(wèn)題以及LCD背光的實(shí)現(xiàn)。
經(jīng)后期在已完成的3套粘度控制試驗(yàn)臺(tái)上使用測(cè)試,該粘度控制器系統(tǒng)穩(wěn)定、使用簡(jiǎn)單方便,滿足了預(yù)期的控制和通信的功能,但是由于采用的是成品的嵌入式平臺(tái),開(kāi)發(fā)板資源配置上還可以優(yōu)化以節(jié)約資源成本。
參考文獻(xiàn)
[1] 姜淑翠.基于單片機(jī)的船舶主機(jī)燃油黏度控制[D].大連:大連海事大學(xué),2010.
[2] 王洪杰.Windows CE下多線程多路播放的設(shè)計(jì)[D].天津:天津大學(xué),2006.
[3] 胡在華.實(shí)時(shí)嵌入式系統(tǒng)的研究與應(yīng)用[D].長(zhǎng)沙:湖南大學(xué),2002.
[4] 蔡建平.關(guān)于嵌入式應(yīng)用開(kāi)發(fā)技術(shù)[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2001(3):5-11,34.
[5] 張琪君.基于面向?qū)ο蟮那度胧较到y(tǒng)軟件開(kāi)發(fā)方法研究及其應(yīng)用[D].濟(jì)南:山東大學(xué),2006.