基于μC/OS-II的數(shù)字化UPS設(shè)計(jì)與實(shí)現(xiàn)方案
(6) 實(shí)時(shí)時(shí)鐘:利用串行外設(shè)接口SPI 實(shí)現(xiàn)與LF2407A控制器的通信,為整個(gè)系統(tǒng)提供統(tǒng)一、標(biāo)準(zhǔn)的時(shí)鐘基準(zhǔn),另外,利用時(shí)鐘芯片的存儲(chǔ)器來(lái)存儲(chǔ)系統(tǒng)掉電保護(hù)參數(shù)。
3 μC/OS-II在LF2407A上的移植
μC/OS-II的硬件和軟件體系結(jié)構(gòu)如圖2所示。
圖2 μC/OS-II的硬件和軟件體系結(jié)構(gòu)圖
要使μC/OS-II正常運(yùn)行,LF2407A滿(mǎn)足以下要求:處理器的C編譯器能產(chǎn)生可重入代碼,支持可擴(kuò)展和可鏈接匯編語(yǔ)言模塊;用C語(yǔ)言就可打開(kāi)和關(guān)閉中斷;處理器支持中斷,并能產(chǎn)生定時(shí)中斷;處理器有將堆棧指針以及其他CPU寄存器的內(nèi)容讀出、并存儲(chǔ)到堆?;騼?nèi)存中去的指令。
由于μC/OS-II 是源碼公開(kāi)的操作系統(tǒng),且其結(jié)構(gòu)化設(shè)計(jì)便于把與處理器相關(guān)的部分分離出來(lái),因此μC/OS-II在LF2407A處理器上移植的主要工作是修改與處理器相關(guān)部分的代碼。由圖2 可以看出,它們主要集中在三個(gè)文件中:頭文件OS_CPU.H、C 文件OS_CPU_C.C、匯編文件OS_CPU_A.ASM.
(1) 修改OS_CPU.H:其中包含兩部分的代碼,數(shù)據(jù)類(lèi)型定義代碼和與處理器相關(guān)的代碼。LF2407A的堆棧數(shù)據(jù)類(lèi)型定義為:typedef unsigned intOS_STK;所有的堆棧用OS_STK 聲明,地址由高向低遞減,OS_STK_GROWTH設(shè)置為1.
OS_CPU.H 剩下部分是移植必須定義底層函數(shù)的聲明,為使低層接口函數(shù)與處理器狀態(tài)無(wú)關(guān),同時(shí)使任務(wù)調(diào)用相應(yīng)的函數(shù)不需知道函數(shù)位置,采用軟中斷指令SWI作為底層接口,使用不同的功能號(hào)來(lái)區(qū)分各函數(shù)。其定義格式如下:
__swi (0x00) void OS_TASK_SW(void);//任務(wù)切換函數(shù)
其中,swi 為軟中斷標(biāo)志,0x00 是分配的中斷號(hào),OS_TASK_SW 是函數(shù)名,兩個(gè)void 分別表示返回類(lèi)型和參數(shù)類(lèi)型。其它的底層函數(shù)接口定義與此相似。
(2)修改OS_CPU_C.C:初始化任務(wù)堆棧函數(shù)和軟中斷函數(shù)的實(shí)現(xiàn)。修改OSTaskStkInit()函數(shù),代碼如下:
OS_STK *OSTaskStkInit (void (*task)(void*pd), void *pdata, OS_STK *ptos, INT16U opt)
{ 模擬帶參數(shù)(pdata)的函數(shù)調(diào)用;定義任務(wù)堆棧;使用滿(mǎn)棧遞減方式初始化任務(wù)堆棧結(jié)構(gòu);返回堆棧結(jié)構(gòu);}
軟中斷函數(shù)的實(shí)現(xiàn):
void SWI_Exception(int SWI_Num, int *Regs)
{ /*根據(jù)不同Num 值(功能號(hào))跳轉(zhuǎn)到不同的底層服務(wù)函數(shù)地址,如:*/ case 0x00:任務(wù)切換函數(shù)OS_TASK_SW;}
(3)修改OS_CPU_A.S:包括4 個(gè)簡(jiǎn)單的匯編語(yǔ)言函數(shù):OSStartHighRdy():使就緒態(tài)任務(wù)中優(yōu)先級(jí)最高的任務(wù)開(kāi)始運(yùn)行;OSCtxSw():實(shí)現(xiàn)任務(wù)級(jí)的任務(wù)切換功能;OSIntCtxSw():在中斷級(jí)實(shí)現(xiàn)任務(wù)間的切換;OSTickISR():時(shí)鐘節(jié)拍中斷服務(wù)子程序。
(5) μC/OS-II主程序框架:調(diào)用任何服務(wù)之前,μC/OS-II 要求首先調(diào)用系統(tǒng)函數(shù)OSInit()初始化所有變量和數(shù)據(jù)結(jié)構(gòu),同時(shí)建立一個(gè)空閑任務(wù)。多任務(wù)的啟動(dòng)通過(guò)OSStart()實(shí)現(xiàn),但啟動(dòng)前至少需建立一個(gè)應(yīng)用任務(wù)。當(dāng)調(diào)用OSStart()時(shí),OSStart()從任務(wù)就緒表中找出用戶(hù)建立的優(yōu)先級(jí)最高任務(wù)的任務(wù)控制塊,然后調(diào)用任務(wù)啟動(dòng)函數(shù),接下來(lái)就完全交給實(shí)時(shí)操作系統(tǒng)來(lái)管理,實(shí)時(shí)內(nèi)核不斷地對(duì)任務(wù)進(jìn)行切換調(diào)度,管理各個(gè)應(yīng)用任務(wù)和系統(tǒng)資源。系統(tǒng)主程序清單如下:
5 實(shí)驗(yàn)結(jié)果
根據(jù)前述控制系統(tǒng)設(shè)計(jì),成功研制了一臺(tái)3.75KVAUPS 樣機(jī)。以下為該樣機(jī)實(shí)時(shí)性、可靠性、穩(wěn)定性測(cè)試運(yùn)行情況,測(cè)試設(shè)備與儀表包括:泰克TDS3043B 數(shù)字示波器、Gad-2016 失真度測(cè)試儀、FLUKE189 數(shù)字萬(wàn)用表、FLUKE36 鉗型電流表、紅外線(xiàn)溫度計(jì)、負(fù)載三相3KW 燈泡(約3.75KW爐絲)。
(1)市電輸入380V,負(fù)載變化:輸出相電壓穩(wěn)定度220V±1%,U 相頻率穩(wěn)定度50Hz±0.4%,波形失真度2%,其他兩相與U 相基本相同,任何兩相相位差120°±1°。圖5 為空載與滿(mǎn)載逆變輸出波形。
(a) 空載
(b) 滿(mǎn)載
圖5 U相輸出逆變電壓波形。
(2)市電逆變互切,切換時(shí)間及可靠性測(cè)試:市電輸入384V,電池電壓490V,3.75KW額定負(fù)載運(yùn)行,市電斷電或按下強(qiáng)起按鈕,逆變器帶負(fù)載正常啟動(dòng),啟動(dòng)時(shí)間約60ms.市電、逆變切換時(shí)間經(jīng)多次反復(fù)試驗(yàn),均小于120ms.圖6 所示為市電到逆變的切換波形,切換時(shí)間約60ms,圖中波形經(jīng)檢測(cè)變壓器隔離降壓;市電來(lái)電,逆變器立即停止工作。
圖6 市電到逆變的切換波形
(3)逆變應(yīng)急長(zhǎng)時(shí)間工作,輸出電壓情況測(cè)試與系統(tǒng)穩(wěn)定性驗(yàn)證:電池513V開(kāi)始放電,帶3.75KW爐絲額定負(fù)載,運(yùn)行約80分鐘,IGBT及散熱器溫度始終低于32℃,系統(tǒng)工作正常且穩(wěn)定,測(cè)試參數(shù)如表2所示。
表2 逆變運(yùn)行溫升測(cè)試
6 結(jié)論
本文針對(duì)數(shù)字化UPS,給出了基于LF2407A 的系統(tǒng)總體設(shè)計(jì)結(jié)構(gòu),實(shí)現(xiàn)了實(shí)時(shí)操作系統(tǒng)μC/OS-II在LF2407A 上的移植,對(duì)UPS系統(tǒng)任務(wù)進(jìn)行設(shè)計(jì)和實(shí)現(xiàn)調(diào)度,給出了部分參數(shù)設(shè)定和主程序清單。該設(shè)計(jì)方案已經(jīng)成功應(yīng)用于青島創(chuàng)統(tǒng)3.75KVA 數(shù)字化UPS 的設(shè)計(jì)項(xiàng)目中。實(shí)踐證明,μC/OS-II 在嵌入式UPS 控制系統(tǒng)中的應(yīng)用有效地提高了系統(tǒng)控制的實(shí)時(shí)性以及系統(tǒng)整體可靠性與穩(wěn)定性。
鎖相環(huán)相關(guān)文章:鎖相環(huán)原理
評(píng)論