基于uC/OS-II的變頻器變結構控制系統設計
摘 要:介紹了抽油電機變頻器變結構控制系統功能原理,如何利用uC/OS-II的多任務(wù)功能實(shí)現控制系統的算法結構變換,操作系統的移植、多任務(wù)的建立和SDK下的軟件設計;最后總結了在應用中需注意的問(wèn)題。
關(guān)鍵詞:uC/OS-II 多任務(wù) DSP56F803 變結構控制
在油田生產(chǎn)中為了節省電能并減小故障率,變頻器得到越來(lái)越多的應用。但由于油井負載的非周期大脈動(dòng)性質(zhì),從能量的流向來(lái)看,變頻器有兩種運行狀態(tài)——電動(dòng)運行和回饋制動(dòng)。不同運行狀態(tài)的控制變量和控制方法是不同的,這就要采用所謂的變結構控制。本應用是實(shí)現抽油電機變頻驅動(dòng)中的變結構控制,不同的控制結構通過(guò)任務(wù)間的切換實(shí)現。
系統控制核心采用DSP56F803,它是Motorola公司推出的16位DSP型微控制器,運算速度可達40MIPS,片內資源豐富,有強大的軟件支持,是嵌入式應用的理想選擇。本系統應用了其SPI、SCI、PWM、鍵盤(pán)中斷及通用I/O口等功能模塊。
1 系統設計
1.1 uC/OS-II的移植與配置
Motorola公司提供的軟件開(kāi)發(fā)工具包SDK為使用uCC/OS-II做好了鋪墊工作,與硬件相關(guān)的文件OS_CPU.H、OS_CPU_A.ASM和OS_CPU_C.C已經(jīng)給出,只需購得系統源代碼,然后將其考入指定的文件目錄,系統的移植就完成了。本文采用最新版本uCC/OS-II V2.51。
系統移植成功后,需要對操作系統進(jìn)行配置(裁剪),把用不到的功能去掉,以最大限度地節省存儲空間。這項工作是通過(guò)os_cfg.h中的宏定義進(jìn)行的,本文只用到了多任務(wù)管理、信號量、互斥量等功能。在本應用中,uCC/OS-II內核經(jīng)過(guò)剪裁后只有3KB左右,相對DSP56F803的32KB內部程序Flash只用了不到十分之一。需注意的另一個(gè)關(guān)鍵設置是時(shí)鐘節拍中斷頻率OS_TICKS_PER_SEC,它是系統多任務(wù)運行所依賴(lài)的時(shí)間基準,也決定了任務(wù)重復調用的最快頻率。這里缺省設為1000,要比文獻[3]中的推薦值高出一個(gè)數量級。但實(shí)際應用表明,DSP56F803以其高運算速度在這個(gè)設置下是完全勝任的。
1.2 系統功能
根據油田生產(chǎn)的要求,系統要實(shí)現以下功能:鍵盤(pán)輸入、參數顯示、三相電流采集、直流側電壓采集、溫度采集、變頻指令輸出以及保護等。系統對電流、電壓、溫度進(jìn)行周期性采樣,采樣值經(jīng)過(guò)數字信號處理,作為控制器的參數,最后由控制算法得出控制量,經(jīng)PWM和D/A轉換器發(fā)送給變頻器,形成反饋閉環(huán)控制。系統運行過(guò)程中實(shí)時(shí)顯示電流、溫度等參數,并可以通過(guò)鍵盤(pán)對控制器進(jìn)行參數在線(xiàn)設定。另外,高溫、過(guò)流等保護功能必不可少。系統原理如圖1??刂破鞲鶕绷鱾入娙軨上電壓的大小來(lái)確定以哪一種控制結構運行。當直流側電壓不超過(guò)設定值時(shí),系統以電動(dòng)狀態(tài)運行。超過(guò)設定值時(shí)要以回饋制動(dòng)方式運行,要求兩種工作狀態(tài)要互鎖,切換要準確、及時(shí)。
1.3 任務(wù)的創(chuàng )建及變結構控制的實(shí)現
根據功能要求,本著(zhù)盡量減少任務(wù)數以減輕CPU運行負擔的原則,本文設計了AD采集、電動(dòng)運行、回饋制動(dòng)和顯示四個(gè)任務(wù)。另外還設計了兩個(gè)中斷服務(wù)子程序:用PortA口的中斷功能實(shí)現8個(gè)鍵盤(pán)輸入,用外部中斷IrqA實(shí)現短路、過(guò)流、缺相保護功能。
每個(gè)任務(wù)都有自己的名稱(chēng)、內存空間和優(yōu)先級。不同的任務(wù)必須有不同的優(yōu)先級,它們可以是0~62之間的任意值,數值越小優(yōu)先級越高。優(yōu)先級的設置有不同的依據,以本文為例,回饋運行任務(wù)對時(shí)間要求最苛刻,如果不能及時(shí)啟動(dòng)或過(guò)早結束都會(huì )對變頻器造成危害,所以其優(yōu)先級設為最高;AD采集任務(wù)運行最頻繁,必須為其它任務(wù)提供可靠的參數,優(yōu)先級設為次高;電動(dòng)運行任務(wù)是常規運行狀態(tài),優(yōu)先級低于A(yíng)D采集任務(wù);顯示任務(wù)只實(shí)現人機交互,顯示狀態(tài)和參數對控制器性能沒(méi)有直接影響,優(yōu)先級設為最低。uCC/OS-II要求為每個(gè)任務(wù)分配OS_STK類(lèi)型的堆??臻g,并且它們占用的RAM存儲空間必須是連續的。
任務(wù)延時(shí)是指任務(wù)執行完畢處于掛起等待狀態(tài)到下一次重新運行之間的時(shí)間間隔,它的單位是時(shí)鐘中斷節拍。由于OS_TICKS_PER_SEC為1000,每一拍為1ms。每個(gè)任務(wù)的調用間隔不能小于一個(gè)節拍,它將影響模擬量的采樣頻率。各個(gè)任務(wù)的屬性定義如表1所示。
1.4 任務(wù)間的通信
各個(gè)任務(wù)是通過(guò)搶占CPU的使用權來(lái)運行的,它們之間存在一定的邏輯關(guān)系,彼此互相聯(lián)系又互相制約。信號量、郵箱、消息隊列等功能為實(shí)現任務(wù)間通信提供了有力工具,它們的使用方法靈活多變,如用信號量設置事件標志,喚醒任務(wù)、用郵箱在任務(wù)間傳遞參數、用消息隊列的循環(huán)尋址功能進(jìn)行模擬通道的數據采集等。本文設計了兩個(gè)信號量,在系統運行開(kāi)始后,任務(wù)TASK_AD檢測直流側電壓的大小。當電壓未超過(guò)設定值時(shí),發(fā)出信號DC_NORM喚醒任務(wù)Task_NORMAL;當電壓高出設定值時(shí),發(fā)出信號DC_OVER喚醒任務(wù)Task_FEBACK。雖然這兩個(gè)任務(wù)基于不同的控制結構,采用不同的算法,但都要使用PWM輸出和SPI通信口,所以在喚醒一個(gè)任務(wù)的同時(shí)必須讓另外一個(gè)任務(wù)掛起。這里引入了互斥型信號量T_MUTEX實(shí)現這個(gè)功能。得到T_MUTEX信號的任務(wù)將獨自占有共享資源的使用權,兩個(gè)任務(wù)不會(huì )因資源沖突而同時(shí)掛起,解決了任務(wù)間優(yōu)先級反轉問(wèn)題,避免了系統功能失效。任務(wù)間邏輯關(guān)系如圖2所示。
操作系統為任務(wù)間通信提供了多種途徑,但最簡(jiǎn)單有效的方法是共享全局變量。本文使用共享全局變量的方法實(shí)現了顯示任務(wù)與鍵盤(pán)中斷服務(wù)之間的通信,代碼如下:
鍵盤(pán)中斷:
static void KeyboardISR(void)
{
UWord16 cpu_sr;
OS_ENTER_CRITICAL(); //臨界區代碼保護
asm{
move X:$0FB7,A1 //讀鍵盤(pán)中斷狀態(tài)表
move A1,state1 //將中斷狀態(tài)放入全局變量
};
OS_EXIT_CRITICAL(); //臨界區代碼保護結束
}
這里state1是全局變量,鍵盤(pán)中斷的工作僅僅是將PORTA口中斷狀態(tài)寄存器(IESR,地址$0FB8)讀入state1中。為防止其他任務(wù)在此期間對state1的修改,使用了臨界區代碼保護。
顯示任務(wù)的部分代碼:
switch(state1)
{case 1: //PTA_0對應的鍵被按下
…… //相應的服務(wù)程序,略
case 128: //PTA_7對應的鍵被按下
break; }
asm{move $00,X:$0FB8}; //清鍵盤(pán)中斷狀態(tài), 以備下次中斷
顯示任務(wù)中采用多分支結構,根據statel=2n,(n=0,1,2,3,,4,5,6,7),不同的值代表不同的鍵被按下,程序進(jìn)行相應的處理;最后將IESR寄存器清零。用同樣的方法,兩位之間互相組合可擴展形成16個(gè)按鍵。這樣只用一個(gè)全局變量就完成了中斷與任務(wù)間的通信,程序用內嵌匯編的C來(lái)寫(xiě),簡(jiǎn)捷高效。
2 系統設計中需注意的問(wèn)題
首先是存儲器分配問(wèn)題。多任務(wù)、郵箱等功能的使用會(huì )增加RAM的額外開(kāi)銷(xiāo),在不擴展外部RAM的情況下,可用的只有片內2KB數據RAM和512字的程序RAM,資源相對有限,存儲空間的合理分配就顯得很重要。任務(wù)堆棧所占用的RAM空間要根據實(shí)際應用來(lái)確定,必須考慮任務(wù)調用的嵌套情況、任務(wù)中函數為局部變量所分配的內存數目。另外,它必須能保存DSP的所有22個(gè)寄存器和16個(gè)存儲器字。如果為任務(wù)分配的存儲空間富余過(guò)多則造成資源緊張,甚至會(huì )因內存溢出導致系統崩潰。解決方法是調用系統函數OSTaskStkChk(),它可以檢測每個(gè)任務(wù)運行時(shí)使用的內存大小,為合理分配內存空間提供了依據。另外,可采用一些簡(jiǎn)化方法節省RAM空間。例如SDK為AD采集的每個(gè)通道都定義一個(gè)結構體,它包括三個(gè)元素:句柄、數值長(cháng)度和采樣值;如果使用五路AD采集,就得定義五個(gè)結構體。通常不進(jìn)行初始化,DSP內核在運行時(shí)將它們放入RAM空間,占用RAM較多。通常關(guān)心的只是采樣值一個(gè)元素,其他兩個(gè)只完成輔助功能。如果使用一個(gè)存放采樣值的變量代替這個(gè)結構體,或直接采用匯編語(yǔ)言寫(xiě)這段代碼,就可大幅度地節省RAM空間。本文的AD采集程序就是用匯編完成。
SDK沒(méi)有提供在DSP56F803下使用SPI函數的例程。
仿照在807中的成功應用,筆者調用spiWrite()函數,通過(guò)SPI驅動(dòng)D/A轉換芯片。但在編譯連接時(shí)出現系統錯誤,數據類(lèi)型unsigned short與const void不匹配,在const.c中將spiWrite做強制類(lèi)型轉換(void*)(&spiWrite),解決了這一問(wèn)題。
利用SDK與uC/OS-II相配合,充分發(fā)揮了DSP型控制器DSP56F803的功能,采用內嵌匯編的C語(yǔ)言編程,大大提高了代碼的可讀性和可移植性,縮短了系統開(kāi)發(fā)周期,成功實(shí)現了系統的變結構控制功能,也體現了操作系統的多任務(wù)功能在實(shí)現多算法結構上的優(yōu)越性。
參考文獻
1 Motolora DSP56F80X User´s Manual. 2000
2 Motolora SDK Programmer´s Guide. 2001
3 Labrosse Jean J.,邵貝貝譯.嵌入式實(shí)時(shí)操作系統μC/OS-II.北京:北京航空航天大學(xué)出版社,2003
4 邵貝貝.Motolora DSP型16位單片機原理與實(shí)踐. 北京:北京航空航天大學(xué)出版社,2003
評論