基于 DSP 的電子負載:電子負載控制系統(tǒng)軟件設計
5.1軟件架構(gòu)
研究課題的軟件系統(tǒng)較為簡單,主要任務是根據(jù)電流、電壓的AD采樣結(jié)果,經(jīng)過數(shù)字控制環(huán)運算,由DA輸出運算結(jié)果,這是最重要也是實時性最高的任務。
此外,還要處理人機交互的任務,諸如串口通信、按鍵,顯示等等,這些任務并不是時刻都存在的,實時性要求不高。
軟件的架構(gòu)由前臺和后臺兩部分組成。前臺是一個預設輸入和結(jié)果輸出,如圖5.1左圖所示,包括讀取按鍵編碼值、LCD顯示所處的測試模式和串口通信數(shù)據(jù)進行處理。后臺如圖5.1右圖所示,以事件管理器A周期匹配中斷為核心中斷,整個反饋回路都是以此中斷為基礎,完成AD采樣,數(shù)字控制環(huán)計算,更DA輸出,實時調(diào)整負載電流。在軟件系統(tǒng)中,需要保證實時性的任務只有反饋環(huán)的任務,在TMS320LF2812的ISR進行中,不能進行嵌套中斷,別的中斷是不能得到DSP響應的。
為了防止串口中斷(后臺執(zhí)行程序)的ISR執(zhí)行時間過長,影響到反饋環(huán)的執(zhí)行,在串口中斷的ISR中避免代碼的冗繁。主循環(huán)通過檢測標志位,查看串口通信的事件發(fā)生,然后到指定位置讀取相應數(shù)據(jù),最大限度的避免數(shù)字控制環(huán)的執(zhí)行被打斷。
5.2數(shù)字控制環(huán)軟件設計
采樣控制系統(tǒng)都是有延遲的,保證控制環(huán)的數(shù)字處理和延遲時間在一個最小的周期以內(nèi),是本課題研究的重點。由于事件管理器的定時器中斷和AD采樣中斷服務處理程序的指令數(shù)固定,而AD轉(zhuǎn)換的時間由硬件決定,因而每周期內(nèi)AD采樣對于數(shù)字環(huán)執(zhí)行周期,占用的時間是固定的。設計如圖5.2所示的結(jié)構(gòu)。
在整個數(shù)字控制環(huán)的執(zhí)行周期內(nèi),包括AD轉(zhuǎn)換,AD轉(zhuǎn)換結(jié)果的保存,控制算法的調(diào)用和執(zhí)行,運算結(jié)果的保存和輸出,執(zhí)行周期內(nèi)預留下一定的空閑時間,方便調(diào)用不同的控制算法時留下一定的時間余量。整個控制算法執(zhí)行周期為4微妙,每個周期DA執(zhí)行一次輸出。
(1)中斷
主程序里面一共開放了三個中斷,T1定時器周期中斷,串口接收中斷和PDPA中斷。周期中斷啟動A/D轉(zhuǎn)換,開始采樣電壓、電流值,并保存結(jié)果進入數(shù)字控制環(huán);串口接收中斷,用于SCI接收中斷,并置發(fā)標志;PDPA中斷,用于保護功率模塊,一旦PDPA關(guān)腳為低便封鎖輸出。其中T1的周期中斷程序不允許被打斷,因為該程序響應用于DA的輸出,響應速度要求很快,PDPA是保護中斷程序,一般不會響應,這兩個中斷都不允許中斷嵌套。SCI串口輸出允許被打斷,但在中斷程序的開頭要加上EINT,開中斷,允許中斷嵌套。
事件管理器A即EVA的定時器Timer1的定時器中斷,在此定時器中斷的中斷服務處理程序ISR中,啟動2路AD轉(zhuǎn)換。設置EVA Timer1的周期寄存器設置EVATimer1的周期為512(約為3.4微妙),通用定時器配置為連續(xù)增減模式,周期匹配中斷。
(2)AD采樣
DSP2812內(nèi)部有一個12位帶流水線的模/數(shù)轉(zhuǎn)換模塊,共有16個通道,可通過寄存器配置為2個獨立的8通道模塊,分別服務于事件管理器A和B,2個獨立的8通道模塊也可以級聯(lián)構(gòu)成1個16通道模塊,同時對16個通道進行采樣,ADC要求輸入的模擬電壓范圍為0~3V.A/D轉(zhuǎn)換單元負責電流控制環(huán)的電流和電壓值,設計中用事件管理器啟動對ADCINA0和ADCINB0同時采樣,同時對兩個通道的輸入信號進行轉(zhuǎn)換。TMS320LF2812雖然有12位精度,但在實際的使用過程中,我們發(fā)現(xiàn),ADC的轉(zhuǎn)換結(jié)果誤差較大,如果直接將此轉(zhuǎn)換結(jié)果用于控制回路,必然會降低控制精度,最大的轉(zhuǎn)換誤差可以達到9%,為了提高控制的精度,必須提高A/D的采樣的精度。
硬件角度:加RC硬件濾波,濾除干擾信號;電路布線時注意不要讓ADCIN引腳運行在靠近數(shù)字信號通路的地方,這樣能使耦合到ADC輸入端的數(shù)字信號開關(guān)噪聲大大降低。采用隔離技術(shù),將ADC模塊電源引腳和數(shù)字電源隔離;軟件角度:多次采樣取平均值算法,最為簡單,但耗費大量時間,對數(shù)字控制環(huán)在短時間內(nèi)執(zhí)行完所有的程序是一對矛盾體;數(shù)字濾波算法,例如采用中值濾波法,具體方法為:連續(xù)采樣20個數(shù)據(jù),對這些數(shù)據(jù)進行排序之后,去掉最小的5個和最大的5個,然后取中間10個采樣數(shù)據(jù)的平均值,這也要付出時間上的犧牲,不太適合本設計;軟件校正算法。TMS320LF的ADC轉(zhuǎn)換精度較差的主要原因是存在增益誤差(Gain Error)和偏置誤差(Offset Error),要提高轉(zhuǎn)換精度就必須對兩種誤差進行補償,這也是本設計中采用的提高A/D模塊的補償方法。
理想的12位ADC是沒有增益誤差和偏置誤差的,其轉(zhuǎn)換的計算公式為:
但是,實際上TMS320LF2812的A/D是存在增益誤差和偏置誤差的,其轉(zhuǎn)換的計算公式如式5.1所示:
其中,ma=actual gain(實際的增益)mb=actual offset(偏置誤差)
實際的和理想的轉(zhuǎn)換計算曲線如圖5.3所示:
用標準的0~3V信號經(jīng)過A/D轉(zhuǎn)換器,由示波器測出電壓信號的精確值,調(diào)用CCS的A/D轉(zhuǎn)換結(jié)果寄存器數(shù)值,換算成模擬值,計算出可靠的增益誤差和偏置誤差。在數(shù)字控制環(huán)中直接使用公式5.1得到的模數(shù)轉(zhuǎn)換結(jié)果。
5.3軟件系統(tǒng)代碼的編寫
通用DSP的源代碼開發(fā)可以用兩個方法:一種是利用匯編指令編寫源代碼,然后經(jīng)匯編器和鏈接器匯編鏈接后生成可執(zhí)行目標代碼;另一種方法是用標準C/C++語言在CCS環(huán)境下編寫源代碼,經(jīng)C/C++編譯器、匯編器和鏈接器進行編譯鏈接,生成可執(zhí)行目標代碼。這兩種代碼開發(fā)方法都需要花費大量的時間,耗時又耗力,大大的增加了產(chǎn)品開發(fā)難度,延長了產(chǎn)品開發(fā)的周期,從而影響到開發(fā)的效率。
Math Works公司和TI公司聯(lián)合開發(fā)的工具包—MATLAB Link for CCS Development Tools,把MATLAB和TI的DSP集成開發(fā)環(huán)境CCS(Code Composer Stadiu)及目標DSP連接起來。用此工具可以來方便的操做DSP的存儲器或寄存器設置,像操作MATLAB變量一樣,整個目標DSP對于MATLAB像透明的一樣,在MATLAB環(huán)境下,開發(fā)人員可以方便的完成對CCS的操作。MATLAB Link for CCS Development Tools支持CCS識別的任何目標板,包括TI公司EVM板、DSK板和用戶自己開發(fā)的DSP板。如果再把MATLAB Link for CCS Development Tools與另外一個工具包Embedded Target for the TI TMS320C2000 DSP Platform配合(MathWorks公司和TI公司聯(lián)合開發(fā)的)配合使用,則可以直接由MATLAB里面的Simulink模型生成DSP的可執(zhí)行代碼,即在MATLAB環(huán)境完成DSP開發(fā)的過程。
首先,根據(jù)系統(tǒng)的設計在MATLAB/Simulink平臺下搭建系統(tǒng)模型(.mdl),仿真滿意后,通過MATLAB提供的Real Time Workshop(RTW)生成面向TI編譯器的工程文件代碼(.prj)并進一步完成代碼的編譯,運行仿真模型產(chǎn)生C代碼程序,并且生成DSP可執(zhí)行機器碼(.out),最后下載到目標DSP板上,運行測試程序,完成系統(tǒng)的開發(fā)。
上述開發(fā)過程全部在MATLAB/Simulink環(huán)境下進行,開發(fā)人員不需要寫任何代碼,僅僅需要利用MATLAB的模型模塊,就可以完成系統(tǒng)的設計。而且開發(fā)人員在系統(tǒng)設計過程中可隨時對系統(tǒng)進行仿真驗證,確保系統(tǒng)設計的正確性。下圖5.4即為DSP代碼自動生成的開發(fā)流程圖。
根據(jù)設計的控制算法,利用MATLAB Link for CCS Development Tools工具包和Simulink工具包里面的功能模塊,搭建出控制系統(tǒng)的仿真模型,TMS320LF2812是一款32位定點DSP,為了能進行浮點運算,我們一般在DSP數(shù)據(jù)處理中會使用IQmath庫,用定點運算代替浮點運算,在建模過程中要處理好數(shù)據(jù)格式的設置,在建立模型的過程中尤其要注意那些前后兩級都有連接的模塊,選用統(tǒng)一的Q格式。遇到模擬信號時用采樣保持器和量化器把模擬連續(xù)信號離散化和數(shù)字化,數(shù)字控制環(huán)的時間選用為3.3微秒,如下圖5.5所示。
然后根據(jù)實際電路中控制效果,改變配置的PID參數(shù)大小,使控制效果達到最佳。本文中根據(jù)實際情況,只采用了PI控制。最后需要注意的是,建模的時候一定要加入F2812 eZdsp模塊,在自動生成代碼的時候需要對一些模塊進行相關(guān)參數(shù)設置。F2812 eZdsp模塊主要的配置信息包括:DSPBoardLabel和BuildAction,其中,BuildAction配置代碼生成的四種功能模式:①Code(代碼)模式,只生成C代碼;②Project(工程)模式,只生成工程文件;③Build(編寫)模式,生成工程文件并編譯鏈接;④Build and Load(編寫下載)模式,生成工程文件,編譯鏈接并下載到目標板。DSPBoardLabel配置仿真器型號,所用仿真器為F2812 XDS510 Emulator,選擇Build and load功能模式。然后進入Simulink的Simulation-Configuration Parameters,單擊實時工作室Real-Time Workshop進入配置界面。進行如下配置:
System target file:ti_c2000_grt.tle
Make command:make_rtw
Template makefile:ti_c2000_grt.tmf
最后在Real-Time Workshop界面中,點擊generate code按鍵,MATLAB根據(jù)設置自動生成DSP工程文件,并且自動連接打開CCS開發(fā)環(huán)境,對C代碼進行編譯,鏈接、下載到目標板上。通過CCS IDE,我們可以看到代碼生成過程中自動建立的Project.prj工程文件,工程文件中包括:源文件,庫文件,鏈接文件等。
實時工作站針對不同的目標系統(tǒng),產(chǎn)生相應的代碼,主要包括目標系統(tǒng)相關(guān)的I/O驅(qū)動和中斷服務程序(ISR)。產(chǎn)生代碼的過程中MATLAB環(huán)境會實時的提供相關(guān)的信息,如一些警告或出錯信息,用戶可以根據(jù)提示修改相應的模塊的設置。由于生成的代碼是C代碼,我們還可以根據(jù)具體的需要,在后期的時候方便的修改生成的代碼,以完善設計。
5.4 LCD顯示程序設計
在電子負載控制系統(tǒng)中,本系統(tǒng)選用的信號板液晶顯示屏是由長沙太陽人公司提供的SMG12864ZK字符型液晶,內(nèi)置ST7920接口型液晶顯示控制器。因為DSP2812的最高時鐘頻率可工作在150MHZ,周期為6.67ns,而ST7920控制器中指令與指令輸入之間的時間間隔都是在幾十微秒或毫秒,小液晶的作用主要是顯示當前的測試模式,具體的實時處理數(shù)據(jù)的顯示由電腦來完成。
在液晶編程設計過程中,如何能夠控制好個控制參數(shù)的時序是至關(guān)重要的,本款液晶的讀寫時序如圖5.6所示。
因為DSP對ST7920等的訪問不需要使用判“忙”過程,故沒有判“忙”函數(shù)的設計。在程序設計時,要特別注意GPIO的控制,在配置時一定要添加EALLOW保護,否則會導致配置數(shù)據(jù)時發(fā)生數(shù)據(jù)丟失或數(shù)據(jù)沖突,液晶驅(qū)動初始化配置程序如下:
void main(void)
{
InitSysCtrl();//初始化系統(tǒng)控制寄存器、PLL、看門狗和時鐘
DINT; //禁止和清除所有CPU中斷向量表
InitPieCtrl();//初始化PIE控制寄存器
IER=0x0000; //禁止所有CPU中斷
IFR=0x0000; //清除所有中斷標志
InitPieVectTable(); //初始化中斷向量表
EALLOW; //允許更改受保護的寄存器
GpioMuxRegs.GPBMUX.all=0; //使相關(guān)I/O工作在GPIO模式
……
GpioMuxRegs.GPBDIR.bit.GPIOB0=1; // RS(控制液晶屏的數(shù)據(jù)指令選擇引腳)
GpioMuxRegs.GPBDIR.bit.GPIOB11=1; // RW(控制液晶屏的數(shù)據(jù)讀寫選擇引腳)
GpioMuxRegs.GPBDIR.bit.GPIOB12=1; // E(控制液晶屏的使能引腳)
GpioMuxRegs.GPBDIR.bit.GPIOB1=1;//引腳用于控制74LVX3245(U1)方向選擇GpioMuxRegs.GPBDIR.bit.GPIOB2=1;//引腳用于控制74LVX3245(U2)方向選擇GpioDataRegs.GPBSET.bit.GPIOB2=1; //將方向選擇引腳置高
EDIS; //禁止更改受保護的寄存器
lcdreset(); //初始化LCD屏
lcdwc(0x01);//清除顯示
delay(50); //延時50*66.7ns
hzklib(); //調(diào)用顯示函數(shù)……
}
5.5鍵盤程序設計
鍵盤程序采用查詢方法來實現(xiàn)鍵值的識別。執(zhí)行主程序前,首先調(diào)用按鍵的查詢程序,判斷選擇的測試模式。鍵盤輸入信息設計思想如下所示。
(1)判斷是否有鍵按下
按鍵被按下時,相應DSP的GPIO口輸入線的電平被拉低。因此,判斷是否有鍵按下,讀取DSP端口值即可,若端口為低電平,則表明有按鍵鍵按下;若端口仍為高電平,無鍵按下。
(2)確定按下的鍵值
本設計中用到的按鍵少,一個按鍵對應一個GPIO口,通過讀取不同的GPIO口的值,就可以知道當前按鍵的鍵值。
(3)等待按鍵釋放
確定按鍵的鍵值以后,仍然需要判斷按鍵的釋放,延時一斷時間后調(diào)用執(zhí)行相應的子程序。
(4)消抖處理
由于選用的按鍵是機械觸點,因此用手按動一個鍵時,按鍵的斷開和閉合瞬間會出現(xiàn)電壓波動,如圖5.7所示。
為了保證按鍵鍵值的識別,電壓抖動的時候不能進行狀態(tài)的輸入查詢。為此,程序中增加消抖算法,DSP獲得按鍵被按下信息后,并即刻確認按鍵的鍵值,而是延時1ms后再次檢測相應端口,如果按鍵仍處于低電平,則說明按鍵確實被按下。同理,在DSP檢測到按鍵釋放時,GPIO口恢復高電平,程序同樣也延時1ms,進行后沿的消抖,然后再識別鍵值。
5.6串行通訊設計
由于研究的是基于DSP的實驗樣機,在控制精度足夠高的情況下,才能完成整機的成型,監(jiān)控系統(tǒng)是在以后深入的研究的內(nèi)容,目前僅在CCS環(huán)境下進行了調(diào)試測試,只對通訊做了簡單的研究。
串行通訊采用SCI異步通信接口,SCI模塊采用標準的非歸零數(shù)據(jù)格式,能夠?qū)崿F(xiàn)CPU和其他具有SCI端口的外設進行數(shù)據(jù)通訊。進行通信協(xié)議的設計,首先要進行信息幀結(jié)構(gòu)的設計,串行異步通信以幀為單位,每次傳送一個數(shù)據(jù)幀。
TMS320LF2812的數(shù)據(jù)發(fā)送和接收由數(shù)據(jù)發(fā)送單元和接收單元來完成。算法程序運行一次就不停的查詢是否接收到串口收到的數(shù)據(jù),判斷標志位tran_flag是否為1,一旦接收到數(shù)據(jù),就將該數(shù)據(jù)發(fā)送出去,并清tran_flag,同時恢復串口為接收模式。DSP2812 SCI與計算機通信,采用超級中斷接收數(shù)據(jù),DSP每隔4微妙向計算機發(fā)送個數(shù)據(jù)。
vvoid main(void)
{
……
SciReg.SCICTL2.TXINTENA = 1;// 使能SCI發(fā)送中斷
while (1)
Interrupt void SCI_TX_isr (void )
{
int i;
for ( i= 0 ; i 10 ; i ++ ); // 軟件延時1.5微秒,重新初始化PIE,為SCI準備下一次中斷
SciRegs.SCITXBUF=pid_cc.pid_out_reg3 + InitOut;
PieCtrlRegs.PIEACK.all = 0x0100;// 響應中斷
while ( SciRegs.SCICTL2.bit.tran_flag = = 0 );;// 狀態(tài)檢測模式,等待發(fā)送標志為空
}
void InitSci(void) // SCI初始化
{
EALLOW;
GpioMuxRegs.GPFMUX.all = 0x0030; // 配置SCI –TX
EDIS;
SciaRegs.SCICCR.all = 0x07;// 8位字符長度
SciaRegs.SCICTL1.all = 0x03; // 使能 TX
SciaRegs.SCIHBAUD = 243 >> 8;// 波特率:19200
SciaRegs.SCILBAUD = 243 0x00FF
SciaRegs.SCICTL1.all = 0x0023;// SCI退出復位
}
評論