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