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.

F28379D的adc采样有很大尖峰

使用的是F28379DLaunchpad,中断频率是10khz,每次进中断后采样一次。

从提取的数据中来看,每隔固定的时间都会出现很大的尖峰,这是为什么呢?

PS:图中数据经过缩放和平移处理,不是实际的IO口电压值。

以下是相关代码

void ConfigureADC(void)
{
EALLOW;

//
//write configurations
//
AdcaRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4
AdcbRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4
AdccRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4
AdcSetMode(ADC_ADCA, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);
AdcSetMode(ADC_ADCB, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);
AdcSetMode(ADC_ADCC, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);

//
//Set pulse positions to late
//
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;
AdccRegs.ADCCTL1.bit.INTPULSEPOS = 1;

//
//power up the ADCs
//
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;
AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1;
//
//delay for 1ms to allow ADC time to power up
//
DELAY_US(2000);

EDIS;
}

void SetupADC(void)//result0对应adc3管脚,result1对应adc2管脚
{
Uint16 acqps;

//
//determine minimum acquisition window (in SYSCLKS) based on resolution
//
if(ADC_RESOLUTION_12BIT == AdcaRegs.ADCCTL2.bit.RESOLUTION)
{
acqps = 26; //75ns
}
else //resolution is 16-bit
{
acqps = 63; //320ns
}
//
//Select the channels to convert and end of conversion flag
//ADCA
//3口为电网侧测量ADC,2口为VSG输出电压测量,4口为电流反馈测量
EALLOW;
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 3; //SOC0 will convert pin A3
AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps; //sample window is acqps + 1 SYSCLK cycles
// AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 0x07;//ePWM2,ADCSOCA
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 2; //SOC0 will convert pin A2
AdcaRegs.ADCSOC1CTL.bit.ACQPS = acqps; //sample window is acqps + 1 SYSCLK cycles
// AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 0x07;//ePWM2,ADCSOCA
AdcaRegs.ADCSOC2CTL.bit.CHSEL = 4; //SOC0 will convert pin A4
AdcaRegs.ADCSOC2CTL.bit.ACQPS = acqps; //sample window is acqps + 1 SYSCLK cycles

AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 2; //end of SOC1 will set INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; //enable INT1 flag
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared
// AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 1;//ADC Continuous Mode Enable

AdcbRegs.ADCSOC0CTL.bit.CHSEL = 3; //SOC1 will convert pin B3
AdcbRegs.ADCSOC0CTL.bit.ACQPS = acqps; //sample window is acqps +
// AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 0x07;//ePWM2,ADCSOCA
AdcbRegs.ADCSOC1CTL.bit.CHSEL = 2; //SOC1 will convert pin B2
AdcbRegs.ADCSOC1CTL.bit.ACQPS = acqps; //sample window is acqps +
// AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 0x07;//ePWM2,ADCSOCA
AdcbRegs.ADCSOC2CTL.bit.CHSEL = 4; //SOC1 will convert pin B4
AdcbRegs.ADCSOC2CTL.bit.ACQPS = acqps; //sample window is acqps +
AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 2; //end of SOC1 will set INT1 flag
AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1; //enable INT1 flag
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared
// AdcbRegs.ADCINTSEL1N2.bit.INT1CONT = 1;//ADC Continuous Mode Enable

//ADCC
AdccRegs.ADCSOC0CTL.bit.CHSEL = 3; //SOC0 will convert pin C3
AdccRegs.ADCSOC0CTL.bit.ACQPS = acqps; //sample window is acqps + 1 SYSCLK cycles
// AdccRegs.ADCSOC0CTL.bit.TRIGSEL = 0x07;//ePWM2,ADCSOCA
AdccRegs.ADCSOC1CTL.bit.CHSEL = 2; //SOC0 will convert pin C3
AdccRegs.ADCSOC1CTL.bit.ACQPS = acqps; //sample window is acqps + 1 SYSCLK cycles
// AdccRegs.ADCSOC0CTL.bit.TRIGSEL = 0x07;//ePWM2,ADCSOCA
AdccRegs.ADCSOC2CTL.bit.CHSEL = 4; //SOC0 will convert pin C3
AdccRegs.ADCSOC2CTL.bit.ACQPS = acqps; //sample window is acqps + 1 SYSCLK cycles

AdccRegs.ADCINTSEL1N2.bit.INT1SEL = 2; //end of SOC1 will set INT1 flag
AdccRegs.ADCINTSEL1N2.bit.INT1E = 1; //enable INT1 flag
AdccRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared


EDIS;
}

void GetADCResult(void)
{

AdcaRegs.ADCSOCFRC1.all = 0x0007;//3改7
while(AdcaRegs.ADCINTFLG.bit.ADCINT1 == 0);
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
u16_ADC_Va_grid = AdcaResultRegs.ADCRESULT0;//result0对应管脚3
u16_ADC_Va_inv = AdcaResultRegs.ADCRESULT1;//result1对应管脚2
u16_ADC_Ia = AdcaResultRegs.ADCRESULT2;//result2对应管脚4

AdcbRegs.ADCSOCFRC1.all = 0x0007;
//wait for ADCB to complete, then acknowledge flag
while(AdcbRegs.ADCINTFLG.bit.ADCINT1 == 0);
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
u16_ADC_Vb_grid = AdcbResultRegs.ADCRESULT0;
u16_ADC_Vb_inv = AdcbResultRegs.ADCRESULT1;
u16_ADC_Ib = AdcbResultRegs.ADCRESULT2;

AdccRegs.ADCSOCFRC1.all = 0x0007;
//wait for ADCC to complete, then acknowledge flag
while(AdccRegs.ADCINTFLG.bit.ADCINT1 == 0);
AdccRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
u16_ADC_Vc_grid = AdccResultRegs.ADCRESULT0;
u16_ADC_Vc_inv = AdccResultRegs.ADCRESULT1;
u16_ADC_Ic = AdccResultRegs.ADCRESULT2;

return;
}

main函数中相关内容

main()

{

ConfigureADC();
SetupADC();

}

10khz中断中相关内容

__interrupt void epwm2_isr(void)
{

GetADCResult();

}

  • 你好,你这个测试的是PWM输出经过调理电路之后的电路吗?
    说实话,这个尖峰也比较奇怪,有些在峰值的地方是高电平,有些是低电平。我感觉更像是干扰造成的,建议先排查一下干扰的问题。