天天看點

TMS320F28035 的EPWM觸發ADC采樣筆記(一)ADC的配置(二)EPWM的配置(三)關聯ADC與PWM指定中斷函數開啟總中斷停止ADC采樣開始ADC采樣

(一)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;
           

繼續閱讀