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: I found something odd when I ran the ADC on the TMS320F28069. Please Help.

Part Number: TMS320F28069

Hi,

I have set the interrupt request after ADC conversion.

However, I have some strange behaviors observed.

When the INT1SEL bit is 0 to 7, it can be confirmed that the ADC interrupt is invoked in the same frequency as the EPWM timer event cycle.

However, if the INT1SEL bit is set to 8 to 15, the interrupt is called at a frequency greater than 100 kHz, much faster.

I wonder what causes the above.

Below is the code I tested.

-------------------------------------------------------------------

//
// Included Files
//
#include "DSP28x_Project.h"

//
// Function Prototypes
//
__interrupt void adc_isr(void);
void Adc_Config(void);

//
// Globals
//
Uint16 LoopCount;
Uint16 ConversionCount;
Uint16 Voltage0;
Uint16 Voltage1;
Uint16 Voltage2;
Uint16 Voltage3;
Uint16 Voltage4;
Uint16 Voltage5;
Uint16 Voltage6;
Uint16 Voltage7;
Uint16 Voltage8;
Uint16 Voltage9;
Uint16 Voltage10;
Uint16 Voltage11;
Uint16 Voltage12;
Uint16 Voltage13;
Uint16 Voltage14;
Uint16 Voltage15;

//
// Main
//
void main(void)
{
    DINT;
    IER = 0x0000;
    IFR = 0x0000;

    InitSysCtrl();

    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
    GpioDataRegs.GPADAT.bit.GPIO0 = 0;
    EDIS;

    InitPieCtrl();
    InitPieVectTable();

    EALLOW;
    PieVectTable.ADCINT1 = &adc_isr;
    EDIS;

    PieCtrlRegs.PIEIER1.bit.INTx1 = 1;
    IER |= M_INT1;

    InitAdc();
    AdcOffsetSelfCal();
    Adc_Config();

    LoopCount = 0;
    ConversionCount = 0;

    EINT;
    ERTM;

    for(;;)
    {
        LoopCount++;
    }
}

//
// Functions
//
__interrupt void adc_isr(void)
{
    GpioDataRegs.GPASET.bit.GPIO0 = 1;

    Voltage0 = AdcResult.ADCRESULT0;
    Voltage1 = AdcResult.ADCRESULT1;
    Voltage2 = AdcResult.ADCRESULT2;
    Voltage3 = AdcResult.ADCRESULT3;
    Voltage4 = AdcResult.ADCRESULT4;
    Voltage5 = AdcResult.ADCRESULT5;
    Voltage6 = AdcResult.ADCRESULT6;
    Voltage7 = AdcResult.ADCRESULT7;
    Voltage8 = AdcResult.ADCRESULT8;
    Voltage9 = AdcResult.ADCRESULT9;
    Voltage10 = AdcResult.ADCRESULT10;
    Voltage11 = AdcResult.ADCRESULT11;
    Voltage12 = AdcResult.ADCRESULT12;
    Voltage13 = AdcResult.ADCRESULT13;
    Voltage14 = AdcResult.ADCRESULT14;
    Voltage15 = AdcResult.ADCRESULT15;

    ConversionCount++;

    GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;

    AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
    PieCtrlRegs.PIEACK.bit.ACK1 = 1;
}

void Adc_Config(void)
{
    EALLOW;
    AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 0;
    AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;
    AdcRegs.INTSEL1N2.bit.INT1E = 1;
    AdcRegs.INTSEL1N2.bit.INT1CONT = 0;
    AdcRegs.INTSEL1N2.bit.INT1SEL = 15;

    AdcRegs.ADCSOC0CTL.bit.CHSEL = 0;
    AdcRegs.ADCSOC2CTL.bit.CHSEL = 1;
    AdcRegs.ADCSOC4CTL.bit.CHSEL = 2;
    AdcRegs.ADCSOC6CTL.bit.CHSEL = 3;
    AdcRegs.ADCSOC8CTL.bit.CHSEL = 4;
    AdcRegs.ADCSOC10CTL.bit.CHSEL = 5;
    AdcRegs.ADCSOC12CTL.bit.CHSEL = 6;
    AdcRegs.ADCSOC14CTL.bit.CHSEL = 7;

    AdcRegs.ADCSAMPLEMODE.bit.SIMULEN0 = 1;
    AdcRegs.ADCSAMPLEMODE.bit.SIMULEN2 = 1;
    AdcRegs.ADCSAMPLEMODE.bit.SIMULEN4 = 1;
    AdcRegs.ADCSAMPLEMODE.bit.SIMULEN6 = 1;
    AdcRegs.ADCSAMPLEMODE.bit.SIMULEN8 = 1;
    AdcRegs.ADCSAMPLEMODE.bit.SIMULEN10 = 1;
    AdcRegs.ADCSAMPLEMODE.bit.SIMULEN12 = 1;
    AdcRegs.ADCSAMPLEMODE.bit.SIMULEN14 = 1;

    AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5;
    AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 5;
    AdcRegs.ADCSOC4CTL.bit.TRIGSEL = 5;
    AdcRegs.ADCSOC6CTL.bit.TRIGSEL = 5;
    AdcRegs.ADCSOC8CTL.bit.TRIGSEL = 5;
    AdcRegs.ADCSOC10CTL.bit.TRIGSEL = 5;
    AdcRegs.ADCSOC12CTL.bit.TRIGSEL = 5;
    AdcRegs.ADCSOC14CTL.bit.TRIGSEL = 5;

    AdcRegs.ADCSOC0CTL.bit.ACQPS = 10;
    AdcRegs.ADCSOC1CTL.bit.ACQPS = 10;
    AdcRegs.ADCSOC2CTL.bit.ACQPS = 10;
    AdcRegs.ADCSOC3CTL.bit.ACQPS = 10;
    AdcRegs.ADCSOC4CTL.bit.ACQPS = 10;
    AdcRegs.ADCSOC5CTL.bit.ACQPS = 10;
    AdcRegs.ADCSOC6CTL.bit.ACQPS = 10;
    AdcRegs.ADCSOC7CTL.bit.ACQPS = 10;
    AdcRegs.ADCSOC8CTL.bit.ACQPS = 10;
    AdcRegs.ADCSOC9CTL.bit.ACQPS = 10;
    AdcRegs.ADCSOC10CTL.bit.ACQPS = 10;
    AdcRegs.ADCSOC11CTL.bit.ACQPS = 10;
    AdcRegs.ADCSOC12CTL.bit.ACQPS = 10;
    AdcRegs.ADCSOC13CTL.bit.ACQPS = 10;
    AdcRegs.ADCSOC14CTL.bit.ACQPS = 10;
    AdcRegs.ADCSOC15CTL.bit.ACQPS = 10;

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    EDIS;

    EPwm1Regs.ETSEL.bit.SOCAEN = 1;
    EPwm1Regs.ETSEL.bit.SOCASEL = 4;
    EPwm1Regs.ETPS.bit.SOCAPRD = 1;
    EPwm1Regs.CMPA.half.CMPA = 0x0080;
    EPwm1Regs.TBPRD = 5999;
    EPwm1Regs.TBCTL.bit.CTRMODE = 0;
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
    EPwm1Regs.TBCTL.bit.CLKDIV = 0;

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    EDIS;
}

-------------------------------------------------------------------

Thanks in advance.

  • I use ADCINT2 instead of ADCINT1.
    When I did so, I could observe other some odd behavior of ADC.

    * If an INT2SEL bit has a value between 0 and 7 : odd behavior observed. (like above)
    * If an INT2SEL bit has a value between 8 and 15 : ADC INT and EPWM SOC event timing is equal.

    This is the opposite of what I asked above.

    In the above question,

    * Use ADCINT1
    * If an INT1SEL bit has a value between 0 and 7 : ADC INT and EPWM SOC event timing is equal.
    * If an INT1SEL bit has a value between 8 and 15 : odd behavior observed. (like above)

  • Sang-il,

    Does the behavior meet your expectation if AdcOffsetSelfCal(); is not called?

    That function will configure every SOC for self-triggering so if you do not disable the self-triggering configuration in ADCINTSOCSELn, you may see SOCs triggered unexpectedly.

    -Tommy
  • I had a personal schedule and my reply was late.
    I think what you said was the cause of my problem.
    Thanks to you, I solved my problem.
    Thank you for quick response.