<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于 DSP 的電子負(fù)載:電子負(fù)載控制系統(tǒng)軟件設(shè)計

          基于 DSP 的電子負(fù)載:電子負(fù)載控制系統(tǒng)軟件設(shè)計

          作者: 時間:2017-06-04 來源:網(wǎng)絡(luò) 收藏

          第5章

          本文引用地址:http://www.ex-cimer.com/article/201706/348252.htm

          5.1軟件架構(gòu)

          研究課題的軟件系統(tǒng)較為簡單,主要任務(wù)是根據(jù)電流、電壓的AD采樣結(jié)果,經(jīng)過數(shù)字控制環(huán)運算,由DA輸出運算結(jié)果,這是最重要也是實時性最高的任務(wù)。
          此外,還要處理人機(jī)交互的任務(wù),諸如串口通信、按鍵,顯示等等,這些任務(wù)并不是時刻都存在的,實時性要求不高。

          軟件的架構(gòu)由前臺和后臺兩部分組成。前臺是一個預(yù)設(shè)輸入和結(jié)果輸出,如圖5.1左圖所示,包括讀取按鍵編碼值、LCD顯示所處的測試模式和串口通信數(shù)據(jù)進(jìn)行處理。后臺如圖5.1右圖所示,以事件管理器A周期匹配中斷為核心中斷,整個反饋回路都是以此中斷為基礎(chǔ),完成AD采樣,數(shù)字控制環(huán)計算,更DA輸出,實時調(diào)整負(fù)載電流。在軟件系統(tǒng)中,需要保證實時性的任務(wù)只有反饋環(huán)的任務(wù),在TMS320LF2812的ISR進(jìn)行中,不能進(jìn)行嵌套中斷,別的中斷是不能得到響應(yīng)的。

          為了防止串口中斷(后臺執(zhí)行程序)的ISR執(zhí)行時間過長,影響到反饋環(huán)的執(zhí)行,在串口中斷的ISR中避免代碼的冗繁。主循環(huán)通過檢測標(biāo)志位,查看串口通信的事件發(fā)生,然后到指定位置讀取相應(yīng)數(shù)據(jù),最大限度的避免數(shù)字控制環(huán)的執(zhí)行被打斷。

          5.2數(shù)字控制環(huán)

          采樣控制系統(tǒng)都是有延遲的,保證控制環(huán)的數(shù)字處理和延遲時間在一個最小的周期以內(nèi),是本課題研究的重點。由于事件管理器的定時器中斷和AD采樣中斷服務(wù)處理程序的指令數(shù)固定,而AD轉(zhuǎn)換的時間由硬件決定,因而每周期內(nèi)AD采樣對于數(shù)字環(huán)執(zhí)行周期,占用的時間是固定的。設(shè)計如圖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)預(yù)留下一定的空閑時間,方便調(diào)用不同的控制算法時留下一定的時間余量。整個控制算法執(zhí)行周期為4微妙,每個周期DA執(zhí)行一次輸出。

          (1)中斷

          主程序里面一共開放了三個中斷,T1定時器周期中斷,串口接收中斷和PDPA中斷。周期中斷啟動A/D轉(zhuǎn)換,開始采樣電壓、電流值,并保存結(jié)果進(jìn)入數(shù)字控制環(huán);串口接收中斷,用于SCI接收中斷,并置發(fā)標(biāo)志;PDPA中斷,用于保護(hù)功率模塊,一旦PDPA關(guān)腳為低便封鎖輸出。其中T1的周期中斷程序不允許被打斷,因為該程序響應(yīng)用于DA的輸出,響應(yīng)速度要求很快,PDPA是保護(hù)中斷程序,一般不會響應(yīng),這兩個中斷都不允許中斷嵌套。SCI串口輸出允許被打斷,但在中斷程序的開頭要加上EINT,開中斷,允許中斷嵌套。

          事件管理器A即EVA的定時器Timer1的定時器中斷,在此定時器中斷的中斷服務(wù)處理程序ISR中,啟動2路AD轉(zhuǎn)換。設(shè)置EVA Timer1的周期寄存器設(shè)置EVATimer1的周期為512(約為3.4微妙),通用定時器配置為連續(xù)增減模式,周期匹配中斷。

          (2)AD采樣

          2812內(nèi)部有一個12位帶流水線的模/數(shù)轉(zhuǎn)換模塊,共有16個通道,可通過寄存器配置為2個獨立的8通道模塊,分別服務(wù)于事件管理器A和B,2個獨立的8通道模塊也可以級聯(lián)構(gòu)成1個16通道模塊,同時對16個通道進(jìn)行采樣,ADC要求輸入的模擬電壓范圍為0~3V.A/D轉(zhuǎn)換單元負(fù)責(zé)電流控制環(huán)的電流和電壓值,設(shè)計中用事件管理器啟動對ADCINA0和ADCINB0同時采樣,同時對兩個通道的輸入信號進(jìn)行轉(zhuǎn)換。TMS320LF2812雖然有12位精度,但在實際的使用過程中,我們發(fā)現(xiàn),ADC的轉(zhuǎn)換結(jié)果誤差較大,如果直接將此轉(zhuǎn)換結(jié)果用于控制回路,必然會降低控制精度,最大的轉(zhuǎn)換誤差可以達(dá)到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ù)進(jìn)行排序之后,去掉最小的5個和最大的5個,然后取中間10個采樣數(shù)據(jù)的平均值,這也要付出時間上的犧牲,不太適合本設(shè)計;軟件校正算法。TMS320LF的ADC轉(zhuǎn)換精度較差的主要原因是存在增益誤差(Gain Error)和偏置誤差(Offset Error),要提高轉(zhuǎn)換精度就必須對兩種誤差進(jìn)行補(bǔ)償,這也是本設(shè)計中采用的提高A/D模塊的補(bǔ)償方法。

          理想的12位ADC是沒有增益誤差和偏置誤差的,其轉(zhuǎn)換的計算公式為:

          但是,實際上TMS320LF2812的A/D是存在增益誤差和偏置誤差的,其轉(zhuǎn)換的計算公式如式5.1所示:

          其中,ma=actual gain(實際的增益)mb=actual offset(偏置誤差)
          實際的和理想的轉(zhuǎn)換計算曲線如圖5.3所示:

          用標(biāo)準(zhǔn)的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)代碼的編寫

          通用的源代碼開發(fā)可以用兩個方法:一種是利用匯編指令編寫源代碼,然后經(jīng)匯編器和鏈接器匯編鏈接后生成可執(zhí)行目標(biāo)代碼;另一種方法是用標(biāo)準(zhǔn)C/C++語言在CCS環(huán)境下編寫源代碼,經(jīng)C/C++編譯器、匯編器和鏈接器進(jìn)行編譯鏈接,生成可執(zhí)行目標(biāo)代碼。這兩種代碼開發(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)及目標(biāo)DSP連接起來。用此工具可以來方便的操做DSP的存儲器或寄存器設(shè)置,像操作MATLAB變量一樣,整個目標(biāo)DSP對于MATLAB像透明的一樣,在MATLAB環(huán)境下,開發(fā)人員可以方便的完成對CCS的操作。MATLAB Link for CCS Development Tools支持CCS識別的任何目標(biāo)板,包括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)的設(shè)計在MATLAB/Simulink平臺下搭建系統(tǒng)模型(.mdl),仿真滿意后,通過MATLAB提供的Real Time Workshop(RTW)生成面向TI編譯器的工程文件代碼(.prj)并進(jìn)一步完成代碼的編譯,運行仿真模型產(chǎn)生C代碼程序,并且生成DSP可執(zhí)行機(jī)器碼(.out),最后下載到目標(biāo)DSP板上,運行測試程序,完成系統(tǒng)的開發(fā)。

          上述開發(fā)過程全部在MATLAB/Simulink環(huán)境下進(jìn)行,開發(fā)人員不需要寫任何代碼,僅僅需要利用MATLAB的模型模塊,就可以完成系統(tǒng)的設(shè)計。而且開發(fā)人員在系統(tǒng)設(shè)計過程中可隨時對系統(tǒng)進(jìn)行仿真驗證,確保系統(tǒng)設(shè)計的正確性。下圖5.4即為DSP代碼自動生成的開發(fā)流程圖。

          根據(jù)設(shè)計的控制算法,利用MATLAB Link for CCS Development Tools工具包和Simulink工具包里面的功能模塊,搭建出控制系統(tǒng)的仿真模型,TMS320LF2812是一款32位定點DSP,為了能進(jìn)行浮點運算,我們一般在DSP數(shù)據(jù)處理中會使用IQmath庫,用定點運算代替浮點運算,在建模過程中要處理好數(shù)據(jù)格式的設(shè)置,在建立模型的過程中尤其要注意那些前后兩級都有連接的模塊,選用統(tǒng)一的Q格式。遇到模擬信號時用采樣保持器和量化器把模擬連續(xù)信號離散化和數(shù)字化,數(shù)字控制環(huán)的時間選用為3.3微秒,如下圖5.5所示。

          然后根據(jù)實際電路中控制效果,改變配置的PID參數(shù)大小,使控制效果達(dá)到最佳。本文中根據(jù)實際情況,只采用了PI控制。最后需要注意的是,建模的時候一定要加入F2812 eZdsp模塊,在自動生成代碼的時候需要對一些模塊進(jìn)行相關(guān)參數(shù)設(shè)置。F2812 eZdsp模塊主要的配置信息包括:DSPBoardLabel和BuildAction,其中,BuildAction配置代碼生成的四種功能模式:①Code(代碼)模式,只生成C代碼;②Project(工程)模式,只生成工程文件;③Build(編寫)模式,生成工程文件并編譯鏈接;④Build and Load(編寫下載)模式,生成工程文件,編譯鏈接并下載到目標(biāo)板。DSPBoardLabel配置仿真器型號,所用仿真器為F2812 XDS510 Emulator,選擇Build and load功能模式。然后進(jìn)入Simulink的Simulation-Configuration Parameters,單擊實時工作室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界面中,點擊generate code按鍵,MATLAB根據(jù)設(shè)置自動生成DSP工程文件,并且自動連接打開CCS開發(fā)環(huán)境,對C代碼進(jìn)行編譯,鏈接、下載到目標(biāo)板上。通過CCS IDE,我們可以看到代碼生成過程中自動建立的Project.prj工程文件,工程文件中包括:源文件,庫文件,鏈接文件等。

          實時工作站針對不同的目標(biāo)系統(tǒng),產(chǎn)生相應(yīng)的代碼,主要包括目標(biāo)系統(tǒng)相關(guān)的I/O驅(qū)動和中斷服務(wù)程序(ISR)。產(chǎn)生代碼的過程中MATLAB環(huán)境會實時的提供相關(guān)的信息,如一些警告或出錯信息,用戶可以根據(jù)提示修改相應(yīng)的模塊的設(shè)置。由于生成的代碼是C代碼,我們還可以根據(jù)具體的需要,在后期的時候方便的修改生成的代碼,以完善設(shè)計。

          5.4 LCD顯示程序設(shè)計

          中,本系統(tǒng)選用的信號板液晶顯示屏是由長沙太陽人公司提供的SMG12864ZK字符型液晶,內(nèi)置ST7920接口型液晶顯示控制器。因為DSP2812的最高時鐘頻率可工作在150MHZ,周期為6.67ns,而ST7920控制器中指令與指令輸入之間的時間間隔都是在幾十微秒或毫秒,小液晶的作用主要是顯示當(dāng)前的測試模式,具體的實時處理數(shù)據(jù)的顯示由電腦來完成。

          在液晶編程設(shè)計過程中,如何能夠控制好個控制參數(shù)的時序是至關(guān)重要的,本款液晶的讀寫時序如圖5.6所示。

          因為DSP對ST7920等的訪問不需要使用判“忙”過程,故沒有判“忙”函數(shù)的設(shè)計。在程序設(shè)計時,要特別注意GPIO的控制,在配置時一定要添加EALLOW保護(hù),否則會導(dǎo)致配置數(shù)據(jù)時發(fā)生數(shù)據(jù)丟失或數(shù)據(jù)沖突,液晶驅(qū)動初始化配置程序如下:

          void main(void)

          {

          InitSysCtrl();//初始化系統(tǒng)控制寄存器、PLL、看門狗和時鐘

          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ù)讀寫選擇引腳)

          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); //延時50*66.7ns

          hzklib(); //調(diào)用顯示函數(shù)……

          }

          5.5鍵盤程序設(shè)計

          鍵盤程序采用查詢方法來實現(xiàn)鍵值的識別。執(zhí)行主程序前,首先調(diào)用按鍵的查詢程序,判斷選擇的測試模式。鍵盤輸入信息設(shè)計思想如下所示。

          (1)判斷是否有鍵按下

          按鍵被按下時,相應(yīng)DSP的GPIO口輸入線的電平被拉低。因此,判斷是否有鍵按下,讀取DSP端口值即可,若端口為低電平,則表明有按鍵鍵按下;若端口仍為高電平,無鍵按下。

          (2)確定按下的鍵值

          本設(shè)計中用到的按鍵少,一個按鍵對應(yīng)一個GPIO口,通過讀取不同的GPIO口的值,就可以知道當(dāng)前按鍵的鍵值。

          (3)等待按鍵釋放

          確定按鍵的鍵值以后,仍然需要判斷按鍵的釋放,延時一斷時間后調(diào)用執(zhí)行相應(yīng)的子程序。

          (4)消抖處理

          由于選用的按鍵是機(jī)械觸點,因此用手按動一個鍵時,按鍵的斷開和閉合瞬間會出現(xiàn)電壓波動,如圖5.7所示。

          為了保證按鍵鍵值的識別,電壓抖動的時候不能進(jìn)行狀態(tài)的輸入查詢。為此,程序中增加消抖算法,DSP獲得按鍵被按下信息后,并即刻確認(rèn)按鍵的鍵值,而是延時1ms后再次檢測相應(yīng)端口,如果按鍵仍處于低電平,則說明按鍵確實被按下。同理,在DSP檢測到按鍵釋放時,GPIO口恢復(fù)高電平,程序同樣也延時1ms,進(jìn)行后沿的消抖,然后再識別鍵值。

          5.6串行通訊設(shè)計

          由于研究的是基于DSP的實驗樣機(jī),在控制精度足夠高的情況下,才能完成整機(jī)的成型,監(jiān)控系統(tǒng)是在以后深入的研究的內(nèi)容,目前僅在CCS環(huán)境下進(jìn)行了調(diào)試測試,只對通訊做了簡單的研究。

          串行通訊采用SCI異步通信接口,SCI模塊采用標(biāo)準(zhǔn)的非歸零數(shù)據(jù)格式,能夠?qū)崿F(xiàn)CPU和其他具有SCI端口的外設(shè)進(jìn)行數(shù)據(jù)通訊。進(jìn)行通信協(xié)議的設(shè)計,首先要進(jìn)行信息幀結(jié)構(gòu)的設(shè)計,串行異步通信以幀為單位,每次傳送一個數(shù)據(jù)幀。

          TMS320LF2812的數(shù)據(jù)發(fā)送和接收由數(shù)據(jù)發(fā)送單元和接收單元來完成。算法程序運行一次就不停的查詢是否接收到串口收到的數(shù)據(jù),判斷標(biāo)志位tran_flag是否為1,一旦接收到數(shù)據(jù),就將該數(shù)據(jù)發(fā)送出去,并清tran_flag,同時恢復(fù)串口為接收模式。DSP2812 SCI與計算機(jī)通信,采用超級中斷接收數(shù)據(jù),DSP每隔4微妙向計算機(jī)發(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準(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)檢測模式,等待發(fā)送標(biāo)志為空
          }
          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退出復(fù)位
          }



          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();