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.

TMS320F28335: How to ADC initialization based on ePWM interrupt and perform adc_isr

Part Number: TMS320F28335


Tool/software:

I'm trying to measure the the ADC values with the interrupt of ePWM. ePWM is initialized well and counting upwards and doing it's function. But somehow it ain't triggering the ADC to take samples. Attached is my program that I'm trying to run. Need your thoughts or improvements that'd be required to run this code. I'm very new with TI's DSP i don't know much about it yet.

#include "DSP28x_Project.h"

#if (CPU_FRQ_150MHZ) // Default - 150 MHz SYSCLKOUT
//
// HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3) = 25.0 MHz
//
#define ADC_MODCLK 0x3
#endif
#if (CPU_FRQ_100MHZ)
//
// HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2) = 25.0 MHz
//
#define ADC_MODCLK 0x2
#endif

//
// ADC module clock = HSPCLK/2*ADC_CKPS = 25.0MHz/(1*2) = 12.5MHz
//
#define ADC_CKPS 0x1

// Prototype statements for functions found within this file.
__interrupt void adc_isr(void);

// Global variables used in this example:
Uint16 LoopCount;
Uint16 ConversionCount;
Uint16 Voltage1[10];
Uint16 Voltage2[10];

void main(void)
{
Uint32 delay;
/*  Initialize the ADC Clocks*/
InitSysCtrl();

EALLOW;
SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/ADC_MODCLK
EDIS;
DINT;   // Disable CPU interrupt
//

    InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags
//
    IER = 0x0000;
    IFR = 0x0000;

    IER |= M_INT1;
   InitPieVectTable();
// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.
   EALLOW;  // This is needed to write to EALLOW protected register
   PieVectTable.ADCINT = &adc_isr;
   EDIS;    // This is needed to disable write to EALLOW protected registers


   InitAdc();

// Configure ADC
  AdcRegs.ADCMAXCONV.all = 0x0001;       // Setup 2 conv's on SEQ1
  AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x3; // Setup ADCINA3 as 1st SEQ1 conv.
  AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x2; // Setup ADCINA2 as 2nd SEQ1 conv.
  AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;// Enable SOCA from ePWM to start SEQ1
  AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;  // Enable SEQ1 interrupt (every EOS)
  AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 = 1;  // Trigger Interrupt at every Sequence


// Assumes ePWM1 clock is already enabled in InitSysCtrl();
  EALLOW;  // This is needed to write to EALLOW protected registers

     // Set up ePWM1 in up/down count mode
     EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;  // Count up/down mode
     EPwm1Regs.TBPRD = 5000;                         // Set period for ePWM1
     EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;         // Disable phase loading
     EPwm1Regs.TBPHS.half.TBPHS = 0x0000;            // Phase is 0
     EPwm1Regs.TBCTR = 0x0001;                       // Clear counter

     // Set Compare values
     EPwm1Regs.CMPA.half.CMPA = 2500;    // Set compare A value

     // Set actions
     EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;  // Set PWM1A on event A, up count
     EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // Clear PWM1A on event A, down count

     // Trigger ADC
     EPwm1Regs.ETSEL.bit.SOCAEN = 1;     // Enable SOC on A group
     EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO;  // Select SOC from counter zero event
     EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST; // Generate pulse on 1st event

     EDIS;   // Disable write to EALLOW protected registers

     AdcRegs.ADCTRL2.all = (1<<13);
     
    // Configure GPIO34 as a GPIO output pin
    EALLOW;
    GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;
    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
    EDIS;
    while(1)
        {
            // Toggle LED
            GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1;
            // Delay for a bit
            for(delay = 0; delay < 2000000; delay++);
        }
}

// Definition of ISR function for ADC interrupt

__interrupt void  adc_isr(void)
{
  Voltage1[ConversionCount] = AdcRegs.ADCRESULT0 >>4;
  Voltage2[ConversionCount] = AdcRegs.ADCRESULT1 >>4;

  // If 9 conversions have been logged, start over
  if(ConversionCount == 9)
  {
     ConversionCount = 0;
  }
  else
  {
      ConversionCount++;
  }

  // Reinitialize for next ADC sequence
  AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;         // Reset SEQ1
  AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;       // Clear INT SEQ1 bit
  PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE

  return;
}

During debugging I see that ADCTRL1 = 0x0000;

I put a breakpoint in the adc_isr to see if it reaches there and it never hits that break point.