EPWM模块产生两个SOC信号,分别是EPWM2的ZERO和PRD,分别为EPWM2SOCA和EPWM2SOCB。如果把所有16路ADC的触发源TRIGSEL都配为EPWM2SOCA或都配为EPWM2SOCB就能正常进行采样;但其中某几个SOC的触发源配为EPWM2SOCB,其他配为EPWM2SOCA,那几个通道采样结果就会出错。PWM是60kHz的Up-Down计数。
代码如下:把第42行ADCTRIG_EPWM2_SOCB改为ADCTRIG_EPWM2_SOCA或者所有都用ADCTRIG_EPWM2_SOCB就能正常采样,但是下面的代码12号ADC结果寄存器的值就会有问题
void sInitADC(void)
{
extern void DSP28x_usDelay(Uint32 Count);
int ChSel[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int TrigSel[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int ACQPS[16] = {7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7};
int IntChSel = 15;
int mode = 2;
// ADC Channel Selection for Configuring the ADC
//Map channel to ADC Pin
ChSel[0] = 1;
ChSel[1] = 2;
ChSel[2] = 3;
ChSel[3] = 4;
ChSel[4] = 5;
ChSel[5] = 6;
ChSel[6] = 7;
ChSel[7] = 8;
ChSel[8] = 9;
ChSel[9] = 10;
ChSel[10] = 11;
ChSel[11] = 12;
ChSel[12] = 13;
ChSel[13] = 14;
ChSel[14] = 15;
ChSel[15] = 16;
TrigSel[0] = ADCTRIG_EPWM2_SOCA;
TrigSel[1] = ADCTRIG_EPWM2_SOCA;
TrigSel[2] = ADCTRIG_EPWM2_SOCA;
TrigSel[3] = ADCTRIG_EPWM2_SOCA;
TrigSel[4] = ADCTRIG_EPWM2_SOCA;
TrigSel[5] = ADCTRIG_EPWM2_SOCA;
TrigSel[6] = ADCTRIG_EPWM2_SOCA;
TrigSel[7] = ADCTRIG_EPWM2_SOCA;
TrigSel[8] = ADCTRIG_EPWM2_SOCA;
TrigSel[9] = ADCTRIG_EPWM2_SOCA;
TrigSel[10] = ADCTRIG_EPWM2_SOCA;
TrigSel[11] = ADCTRIG_EPWM2_SOCB;//
TrigSel[12] = ADCTRIG_EPWM2_SOCA;//
TrigSel[13] = ADCTRIG_EPWM2_SOCA;
TrigSel[14] = ADCTRIG_EPWM2_SOCA;
TrigSel[15] = ADCTRIG_EPWM2_SOCA;
EALLOW;
AdcRegs.ADCCTL1.bit.ADCREFSEL = 1;// Nick 20220715 select internal reference 3.3V,external reference is 3.0V
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; // Power up band gap
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1; // Power up reference
AdcRegs.ADCCTL1.bit.ADCPWDN = 1; // Power up rest of ADC
AdcRegs.ADCCTL1.bit.ADCENABLE = 1; // Enable ADC
DSP28x_usDelay(1000); // Delay before converting ADC channels
AdcRegs.ADCSAMPLEMODE.all = 0;
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;
AdcRegs.ADCSOC0CTL.bit.ACQPS = ACQPS[0];
AdcRegs.ADCSOC1CTL.bit.ACQPS = ACQPS[1];
AdcRegs.ADCSOC2CTL.bit.ACQPS = ACQPS[2];
AdcRegs.ADCSOC3CTL.bit.ACQPS = ACQPS[3];
AdcRegs.ADCSOC4CTL.bit.ACQPS = ACQPS[4];
AdcRegs.ADCSOC5CTL.bit.ACQPS = ACQPS[5];
AdcRegs.ADCSOC6CTL.bit.ACQPS = ACQPS[6];
AdcRegs.ADCSOC7CTL.bit.ACQPS = ACQPS[7];
AdcRegs.ADCSOC8CTL.bit.ACQPS = ACQPS[8];
AdcRegs.ADCSOC9CTL.bit.ACQPS = ACQPS[9];
AdcRegs.ADCSOC10CTL.bit.ACQPS = ACQPS[10];
AdcRegs.ADCSOC11CTL.bit.ACQPS = ACQPS[11];
AdcRegs.ADCSOC12CTL.bit.ACQPS = ACQPS[12];
AdcRegs.ADCSOC13CTL.bit.ACQPS = ACQPS[13];
AdcRegs.ADCSOC14CTL.bit.ACQPS = ACQPS[14];
AdcRegs.ADCSOC15CTL.bit.ACQPS = ACQPS[15];
AdcRegs.INTSEL1N2.bit.INT1SEL = IntChSel; // IntChSel causes ADCInterrupt 1
AdcRegs.ADCINTFLG.bit.ADCINT1 = 0; // clear interrupt flag for ADCINT1
AdcRegs.INTSEL1N2.bit.INT1CONT = 1; // set ADCInterrupt 1 to auto clr
AdcRegs.ADCINTSOCSEL1.all=0x0000; // No ADCInterrupt will trigger SOCx
AdcRegs.ADCINTSOCSEL2.all=0x0000;
if(IntChSel <= 15)
AdcRegs.INTSEL1N2.bit.INT1E = 1; // enable ADC interrupt 1
else
AdcRegs.INTSEL1N2.bit.INT1E = 0; // disable the ADC interrupt 1
// Select the channel to be converted when SOCx is received
AdcRegs.ADCSOC0CTL.bit.CHSEL= ChSel[0];
AdcRegs.ADCSOC1CTL.bit.CHSEL= ChSel[1];
AdcRegs.ADCSOC2CTL.bit.CHSEL= ChSel[2];
AdcRegs.ADCSOC3CTL.bit.CHSEL= ChSel[3];
AdcRegs.ADCSOC4CTL.bit.CHSEL= ChSel[4];
AdcRegs.ADCSOC5CTL.bit.CHSEL= ChSel[5];
AdcRegs.ADCSOC6CTL.bit.CHSEL= ChSel[6];
AdcRegs.ADCSOC7CTL.bit.CHSEL= ChSel[7];
AdcRegs.ADCSOC8CTL.bit.CHSEL= ChSel[8];
AdcRegs.ADCSOC9CTL.bit.CHSEL= ChSel[9];
AdcRegs.ADCSOC10CTL.bit.CHSEL= ChSel[10];
AdcRegs.ADCSOC11CTL.bit.CHSEL= ChSel[11];
AdcRegs.ADCSOC12CTL.bit.CHSEL= ChSel[12];
AdcRegs.ADCSOC13CTL.bit.CHSEL= ChSel[13];
AdcRegs.ADCSOC14CTL.bit.CHSEL= ChSel[14];
AdcRegs.ADCSOC15CTL.bit.CHSEL= ChSel[15];
AdcRegs.ADCSOC0CTL.bit.TRIGSEL= TrigSel[0];
AdcRegs.ADCSOC1CTL.bit.TRIGSEL= TrigSel[1];
AdcRegs.ADCSOC2CTL.bit.TRIGSEL= TrigSel[2];
AdcRegs.ADCSOC3CTL.bit.TRIGSEL= TrigSel[3];
AdcRegs.ADCSOC4CTL.bit.TRIGSEL= TrigSel[4];
AdcRegs.ADCSOC5CTL.bit.TRIGSEL= TrigSel[5];
AdcRegs.ADCSOC6CTL.bit.TRIGSEL= TrigSel[6];
AdcRegs.ADCSOC7CTL.bit.TRIGSEL= TrigSel[7];
AdcRegs.ADCSOC8CTL.bit.TRIGSEL= TrigSel[8];
AdcRegs.ADCSOC9CTL.bit.TRIGSEL= TrigSel[9];
AdcRegs.ADCSOC10CTL.bit.TRIGSEL= TrigSel[10];
AdcRegs.ADCSOC11CTL.bit.TRIGSEL= TrigSel[11];
AdcRegs.ADCSOC12CTL.bit.TRIGSEL= TrigSel[12];
AdcRegs.ADCSOC13CTL.bit.TRIGSEL= TrigSel[13];
AdcRegs.ADCSOC14CTL.bit.TRIGSEL= TrigSel[14];
AdcRegs.ADCSOC15CTL.bit.TRIGSEL= TrigSel[15];
EDIS;
AdcRegs.ADCSOCFRC1.all = 0xFFFF; // kick-start ADC
}