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.

TMS320F28384S: ADCs startup

Part Number: TMS320F28384S
Other Parts Discussed in Thread: C2000WARE

Tool/software:

Hi

I'm testing a new board based on the 28384S, and I have a problem in starting two ADC module:

Hi use PWM1 to generate SOCA & SOCB (may be only one can be used)

//
EPwm1Regs.ETPS.bit.SOCPSSEL = 1;
// generate ADCA SOC
EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO;
EPwm1Regs.ETSOCPS.bit.SOCAPRD2 = 2;
EPwm1Regs.ETSEL.bit.SOCAEN = 1;
// generate ADCC SOC
EPwm1Regs.ETSEL.bit.SOCBSEL = ET_CTR_ZERO;
EPwm1Regs.ETSOCPS.bit.SOCBPRD2 = 2;
EPwm1Regs.ETSEL.bit.SOCBEN = 1;

I setup ADCA and ADCC with two similar procedure, the only difference is the accessed ADC

void set_adca(void)
{

EALLOW;
AdcaRegs.ADCCTL2.bit.PRESCALE = 14;
AdcSetMode(ADC_ADCA, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
EDIS;
DELAY_US(1000);

EALLOW;
AdcaRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0x10;

// ADCINA2 = AZ phase A current
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 14;
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 2;
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;

// ADCINA3 = AZ phase B current
AdcaRegs.ADCSOC1CTL.bit.ACQPS = 14;
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 3;
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 5;

// ADCINA4 = EL phase A current
AdcaRegs.ADCSOC2CTL.bit.ACQPS = 14;
AdcaRegs.ADCSOC2CTL.bit.CHSEL = 4;
AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = 5;

// ADCINA5 = EL phase B current
AdcaRegs.ADCSOC3CTL.bit.ACQPS = 14;
AdcaRegs.ADCSOC3CTL.bit.CHSEL = 5;
AdcaRegs.ADCSOC3CTL.bit.TRIGSEL = 5;

// EOC trigger interrupt
AdcaRegs.ADCINTSEL1N2.bit.INT2SEL = 3;
AdcaRegs.ADCINTSEL1N2.bit.INT2E = 1;
AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;

EDIS;
}

than I have the related interrupt procedures

/* ============================================================================
FUNCTION NAME:
PURPOSE:
DESCRIPTION:
DOMAIN:
ACCURACY:
NOTES:
============================================================================ */
__interrupt void adca_isr(void)
{
volatile uint16_t TempPIEIER = PieCtrlRegs.PIEIER10.all;

// Set interrupt priority:
IER |= M_INT10;
IER &= MINT10; /* Set "global" priority */
PieCtrlRegs.PIEIER10.all &= MG10_2; /* Set "group" priority */
PieCtrlRegs.PIEACK.all = 0xFFFF; /* Enable PIE interrupts */
__asm(" NOP");
EINT;
// read conversions
adca_reading[0] = AdcaResultRegs.ADCRESULT0 - 2048;
adca_reading[1] = AdcaResultRegs.ADCRESULT1 - 2048;
adca_reading[2] = AdcaResultRegs.ADCRESULT2 - 2048;
adca_reading[3] = AdcaResultRegs.ADCRESULT3 - 2048;
// Clear ADCINT flag
AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;
// Restore registers saved:
DINT;
PieCtrlRegs.PIEIER10.all = TempPIEIER;
}

/* ============================================================================
FUNCTION NAME:
PURPOSE:
DESCRIPTION:
DOMAIN:
ACCURACY:
NOTES:
============================================================================ */
__interrupt void adcc_isr(void)
{
volatile uint16_t TempPIEIER = PieCtrlRegs.PIEIER10.all;

// Set interrupt priority:
IER |= M_INT10;
IER &= MINT10; /* Set "global" priority */
PieCtrlRegs.PIEIER10.all &= MG10_10; /* Set "group" priority */
PieCtrlRegs.PIEACK.all = 0xFFFF; /* Enable PIE interrupts */
__asm(" NOP");
EINT;
// read conversions
adcc_reading[0] = AdccResultRegs.ADCRESULT0;
adcc_reading[1] = AdccResultRegs.ADCRESULT1;
adcc_reading[2] = AdccResultRegs.ADCRESULT2;
adcc_reading[3] = AdccResultRegs.ADCRESULT3;
// Clear ADCINT flag
AdccRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;
// Restore registers saved:
DINT;
PieCtrlRegs.PIEIER10.all = TempPIEIER;
}

I setup ADCs calling the procedure:

// setup ADCC for supply monitor
set_adcc();
// setup ADCA for motor current measurement
set_adca();

but only the last setup channel works, in this case only ADCA will work and generate interrupt, module ADCC neither generate interrupt. But setting up only one module all is ok.

Best Regards