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.
使用的是F28379DLaunchpad,中断频率是10khz,每次进中断后采样一次。
从提取的数据中来看,每隔固定的时间都会出现很大的尖峰,这是为什么呢?
以下是相关代码
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();
}