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
