This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F28069: DSP28069上电时可正常运行,但是不能进入AD中断(PWM1触发),断电后快速重新上电,可正常进入AD中断;或者是软件/硬件复位后也可正常进入AD中断,请问是什么原因引起的

Part Number: TMS320F28069
Other Parts Discussed in Thread: C2000WARE

AD部分配置

EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
(*Device_cal)();
EDIS;


EALLOW;
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; // Power ADC BG
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1; // Power reference
AdcRegs.ADCCTL1.bit.ADCPWDN = 1; // Power ADC
AdcRegs.ADCCTL1.bit.ADCENABLE = 1; // Enable ADC
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; // Select interal BG
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; //One cycle prior to result
EDIS;



EALLOW;
AdcRegs.ADCSAMPLEMODE.bit.SIMULEN0 = 0; 
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 0x06; 
AdcRegs.ADCSOC0CTL.bit.CHSEL = CHSEL_ADCINA0; 
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6; 
AdcRegs.ADCINTSOCSEL1.bit.SOC0 = 0;

PieCtrlRegs.PIEIER1.bit.INTx1 = 1; // Enable ADCINT1 in PIE group 10
PieVectTable.ADCINT1 = &ADCINT1_ISR;//SystemTick_ISR;
IER |= M_INT1;

  • 使用的是自己的板子吗?有在多少器件上发现这个问题?

    不能进入AD中断的时候,相应的使能位及标志位等情况如何?

  • 使用的是自己的板子,总共四块板卡,三块有这个问题,另一块板卡是正常的。通过添加监测变量发现,上电时会进入一次AD中断,之后就不进去了,重启或者断电并快速上电后,也可正常进入AD中断,

    下列代码中第一行是上电后只进一次AD中断的程序,将此行内容修改为第二行的代码后,即可正常进入AD中断。

    // EPwm1Regs.ETSEL.bit.SOCBASEL = ET_CTRU_CMPB; 
    EPwm1Regs.ETSEL.bit.SOCBSEL = ET_CTR_ZERO;

    同时发现,EPwm1Regs.CMPB的初始值为0,不知是否是因为这个原因引起的。

  • 看起来问题应该是与EPWM触发ADC的配置有关。

    EPWM的计数模式是什么?CMPB配置的是多少?

    注释掉的代码,配置的是计数器向上计数到CMPB时触发ADC。按照你的更改,把触发点设置到计数值等于0也是可以的,具体取决于你的设计。如果选择在CMPB触发的话,可以试着把CTR后面的U去掉,即触发时忽略计数方向。

  • 以下为EPWM1的代码, 向上计数,,CMPB初始化设置为1260,但主程序中是由变量赋值给CMPB,范围肯定是在1800之内,看配置的话应该没问题,所以很疑惑

    EPwm1Regs.TBPRD = 1800; 

    EPwm1Regs.TBPHS.half.TBPHS = 0; 

    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//TB_COUNT_UPDOWN; 
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; 
    EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; 
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // div 1

    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // div 1

    //Clear Timer counter
    EPwm1Regs.TBCTR = 0;

    EPwm1Regs.TBCTL.bit.PHSDIR = TB_UP; //Count up after the synchronization event

    //------------------------------Counter-Compare Submodule--------------------------------------------

    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
    EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on CTR=Zero
    EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on CTR=Zero

    //Clear Compare Value
    EPwm1Regs.CMPA.half.CMPA = 360;
    EPwm1Regs.CMPB = 1260;

    //------------------------------Action-Qualifier Submodule---------------------------------------------

    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; 

    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;

    EPwm1Regs.AQCTLB.bit.CBU = AQ_SET; 

    EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;
    EPwm1Regs.AQSFRC.bit.RLDCSF = 3;

    EPwm1Regs.AQCSFRC.bit.CSFA = AQ_CLEAR; //
    EPwm1Regs.AQCSFRC.bit.CSFB = AQ_CLEAR; //



    //------------------------------Dead-Band Submodule-------------------------------------------------
    EPwm1Regs.DBCTL.bit.IN_MODE = DBB_ALL;
    EPwm1Regs.DBCTL.bit.OUT_MODE = DB_DISABLE; // Enable Dead-band module
    EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // Active Hi complementary
    EPwm1Regs.DBFED = 30; // 1us dead time
    // EPwm1Regs.DBRED = DEAD_TIME; // 1us dead time

    //------------------------------PWM-Chopper Control Submodule----------------------------------------

    EPwm1Regs.PCCTL.bit.CHPEN = 0; //Disable Pwm Chopper Module

    //------------------------------Event-Trigger Selection Submodule---------------------------------------
    #if 1
    //SOC Event Config
    // EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST; //generate SOCA on first event
    EPwm1Regs.ETPS.bit.SOCBPRD = ET_1ST; //generate SOCA on first event

    EPwm1Regs.ETSEL.bit.SOCBEN = 1; //Enable SOCB

    // EPwm1Regs.ETSEL.bit.SOCBASEL = ET_CTRU_CMPB; //SOCA on PRD event
    EPwm1Regs.ETSEL.bit.SOCBSEL = ET_CTR_ZERO;

    EPwm1Regs.ETSEL.bit.SOCAEN = 0; //Disable SOCA
    #endif

  • 不好意思,点错了。

    请参考一下这个例程:C:\ti\c2000\C2000Ware_5_00_00_00\device_support\f2806x\examples\c28\adc_soc

    也是EPWM触发ADC SOC,使能ADC中断。

  • CMPB触发只有向上计数和向下计数两个选项,可以忽略计数方向吗

  • 能够进入一次中断,那就说明触发没有问题。检查下ADC是否设置为连续模式,以及确保中断在EINT之后才被触发。

  • @

    能够进入一次中断,那就说明触发没有问题。检查下ADC是否设置为连续模式,以及确保中断在EINT之后才被触发。

    感谢参与讨论!

    @

    可以参考一下楼上的回复;

    CMPB触发只有向上计数和向下计数两个选项,可以忽略计数方向吗

    不好意思,我的疏忽。向上计数模式的话选incrementing就行。

    是每一次第一次上电都会出现这个状况吗?