(一)ADC的配置
調用庫裡面函數的即可
InitAdc(); // For this example, init the ADC
AdcOffsetSelfCal();
(二)EPWM的配置
EPWM的觸發頻率計算
EPWM時鐘頻率 = 系統時鐘頻率 / (HSPCLKDIV * CLKDIV );
▲舉例
假如系統時鐘為60M,寄存器為如下配置
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
EPwm1Regs.TBCTL.bit.CLKDIV = 0;
則EPWM1的時鐘頻率為60M / (1*1) = 60M (則每60個時鐘周期為1us)
假定我們要配置300KHZ的EPWM1中斷頻率。
則 單個周期為 1000000us / 300000 = 3.333333333333333us。
則需要60 * 3.333333333333333 = 200個中斷周期。( EPwm1Regs.TBPRD = 200)
接下來貼上完整配置代碼
周期寄存器: EPwm1Regs.TBPRD
計數掃描模式配置: EPwm1Regs.TBCTL.bit.CTRMODE (向上,向下,向上再向下,當機)
//若配置為向上再向下,則EPwm1Regs.TBPRD 隻需要100就夠了
static void initEPWM1(void)
{
EALLOW;
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group
EPwm1Regs.ETSEL.bit.SOCASEL = 4; // Select SOC on up-count
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event
EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD; // Set EPwm1 Timer period (周期)
EPwm1Regs.TBCTL.bit.CTRMODE = TB_FREEZE; // Freeze counter (當機 ,不運作,配置為0則開始運作)
//
// Setup TBCLK
//
EPwm1Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0
EPwm1Regs.TBCTR = 0x0000; // Clear counter
//
// Setup counter mode
//
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
//
// Setup shadowing
//
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // Load on Zero
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
//
// Interrupt where we will change the Compare Values
//
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // Select INT on period event
EPwm1Regs.ETSEL.bit.INTEN = 1; // Enable INT
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // Generate INT on every event
EDIS;
}
(三)關聯ADC與PWM
EALLOW;
AdcRegs.ADCSOC0CTL.bit.CHSEL = 2; //(配置為AIO2)
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6;
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // 設定ADC觸發模式為 ePWM1 SOCA/C
AdcRegs.INTSEL1N2.bit.INT1SEL = 0; // end of SOC0 will set INT1 flag
AdcRegs.INTSEL1N2.bit.INT1E = 1; // enable INT1 flag
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // make sure INT1 flag is cleared
EDIS;
指定中斷函數
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.ADCINT1 = &adc_sample_signal; // ISR for ADCA
EDIS; // This is needed to disable write to EALLOW protected registers
開啟總中斷
IER |= M_INT1; // Enable int1 (EPwm1)
PieCtrlRegs.PIEIER1.bit.INTx1 = 1; // EPwm1/ADC
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
停止ADC采樣
EPwm1Regs.ETSEL.bit.SOCAEN = 0;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_FREEZE;
開始ADC采樣
EPwm1Regs.ETSEL.bit.SOCAEN = 1;
EPwm1Regs.TBCTL.bit.CTRMODE = 0;