F2802X 的EPWM 模塊內(nèi)部由8 個(gè)小模塊組成,,這8 個(gè)模塊可以相互配合,,產(chǎn)生符合要求的PWM波形,。其實(shí),但是只需要利用TB(Time—base),、CC(Counter-compare),、AQ(Action-qualifier) 這三個(gè)子模塊就能產(chǎn)生實(shí)驗(yàn)所需要的PWM 波形。 先給初學(xué)者回顧一下SPWM:所謂SPWM,,就是在PWM 的基礎(chǔ)上改變了調(diào)制脈沖方式,,脈沖占空比在時(shí)間軸上按正弦規(guī)率排列,這樣輸出波形經(jīng)過(guò)適當(dāng)?shù)臑V波可以做到正弦波輸出,。它廣泛用于直流交流逆變器,、電機(jī)細(xì)分等。具體實(shí)現(xiàn)方法為,,用軟件計(jì)算出按正弦規(guī)律變換的值,,比如計(jì)算出64 個(gè)點(diǎn)的值,定時(shí)向CMPA 發(fā)送計(jì)算出來(lái)的變化值,,發(fā)送完64 次后,,完成了一個(gè)周期的正弦波輸出,定時(shí)發(fā)送的時(shí)間由TBPRD 決定,。那計(jì)算出來(lái)的正弦波周期為T(mén)BPRD*64,。 #include "DSP28x_Project.h" #define PWM1_INT_ENABLE 1 /**Description ** 全局變量定義*/ volatile Uint16 temp; int16 *sin_ptr = (int16 *)0x3fe001;// //解釋"int16 *sin_ptr = (int16 *)0x3fe001;"在 F2802X 的ROM 區(qū)域中,包含有產(chǎn)生正弦波和余弦波各512 點(diǎn)的數(shù)據(jù)表,,存儲(chǔ)空間 0X3FE000 開(kāi)始,具體的存儲(chǔ)空間可以參考它的數(shù)據(jù)手冊(cè),。 /*Description ** 函數(shù)定義*/ void InitEPwmTimer(void); // EPWM模塊初始化程序 void update_compare(void); // 比較值定義 interrupt void epwm1_timer_isr(void); // 中斷服務(wù)程序 void main(void) { InitSysCtrl(); // 系統(tǒng)初始化函數(shù) InitEPwm1Gpio(); // EPWM端口初始化 DINT; // 關(guān)閉CPU中斷 InitPieCtrl(); // PIE中斷控制 IER = 0x0000; // 關(guān)閉中斷使能 IFR = 0x0000; // 清除中斷標(biāo)志位 InitPieVectTable(); EALLOW; PieVectTable.EPWM1_INT = &epwm1_timer_isr;//中斷函數(shù)入口 EDIS; // 賦值中斷函數(shù)地址 InitEPwmTimer(); // 初始化EPWM模塊 IER |= M_INT3; // 使能CPU級(jí)第三組中斷 PieCtrlRegs.PIEIER3.bit.INTx1 = PWM1_INT_ENABLE; // 使能PIE3.1 EINT; // 使能全局中斷 ERTM; // for(;;) { asm(" NOP"); } } /*EPWM模塊初始化函數(shù)*/ void InitEPwmTimer() { EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // 停止TB計(jì)數(shù) EDIS; EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; EPwm1Regs.TBCTR = 0x0000; // 清除TB計(jì)數(shù)器 EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 系統(tǒng)時(shí)鐘分頻 EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; EPwm1Regs.TBCTL.bit.PHSEN = 0; EPwm1Regs.TBPHS.half.TBPHS = 0; EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; EPwm1Regs.CMPA.half.CMPA = 0; // EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // EPwm1Regs.TBPRD = 512; EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 增計(jì)數(shù)模式 EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // 中斷使能選擇 EPwm1Regs.ETSEL.bit.INTEN = PWM1_INT_ENABLE; // 使能中斷 EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // TB時(shí)鐘計(jì)數(shù) EDIS; } /*sina值更新函數(shù)*/ //主要更新CPMA的值 void update_compare() { temp = (((Uint16)((*sin_ptr)+16384))>>6); EPwm1Regs.CMPA.half.CMPA = temp; if(temp > 1024) { asm(" ESTOP0"); } sin_ptr += 8; if(sin_ptr >= (int16 *)0x3fe401) { sin_ptr = (int16 *)0x3fe001; } } /*epwm1中斷服務(wù)程序*/ //c2000的中斷函數(shù)都要用“inerrupt”申明 interrupt void epwm1_timer_isr(void) { update_compare(); EPwm1Regs.ETCLR.bit.INT = 1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; } |
|