天天看点

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;
           

继续阅读