Part Number: LAUNCHXL-F28379D
Tool/software: Code Composer Studio
Hello,
I am doing ADC Conversion using PWM. I have configured PWM and ADC as below. I am trying to read more than 50 KHz signal but my ADC conversion has disturbance after 10 KHz. According to my configuration I am suppose read signal at this frequencies. Even if I reduce TBPRD=400 and I can not go further below, if I go further below signal gets worst. My SYSCLOCKOUT=200 MHz. My code and ADC conversion plots are shown below. Thank you.
void ConfigureADC(void)
{
EALLOW;
//
//write configurations // ............................OK
//
AdcaRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4
AdcSetMode(ADC_ADCA, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE); //........OK
AdcbRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4
AdcSetMode(ADC_ADCB, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE); //........OK
AdcbRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4
AdcSetMode(ADC_ADCB, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE); //........OK
//
//Set pulse positions to late.........................................OK
//
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1; // ............................OK
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1; // ............................OK
AdccRegs.ADCCTL1.bit.INTPULSEPOS = 1; // ............................OK
//
//power up the ADC ...................................................OK
//
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1; // ............................OK
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1; // ............................OK
AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1; // ............................OK
//
//delay for 1ms to allow ADC time to power up
//
DELAY_US(1000);
EDIS;
}
void ConfigureEPWM(void)
{
EALLOW;
// Assumes ePWM clock is already enabled
ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=1;
EPwm1Regs.ETSEL.bit.SOCAEN = 0; // Disable SOC on A group
EPwm1Regs.ETSEL.bit.SOCASEL = 4; // Select SOC on up-count
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event
//EPwm1Regs.CMPA.bit.CMPA = 0x0800; // Set compare A value to 2048 counts
//EPwm1Regs.TBPRD = 0x1000; // Set period to 4096 counts
EPwm1Regs.CMPA.bit.CMPA =200; // Set compare A value to 2048 counts
EPwm1Regs.TBPRD = 400; // Set period to 4096 counts
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
EPwm1Regs.TBCTL.bit.CTRMODE = 3; // freeze counter
EDIS;
}
void SetupADCEpwm()
{
//
//determine minimum acquisition window (in SYSCLKS) based on resolution
//
//
//Select the channels to convert and end of conversion flag
//
EALLOW;
// Ph CURRENTS ---------------------------------------------
// Ph A Current
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 14; // ADCIN14
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 14; //sample window is xx SYSCLK cycles 14 ns
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5; //trigger on ePWM1 SOCA/C
// Interrupt
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0; //end of SOC0 will set INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; //enable INT1 flag
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared
EDIS;
}
interrupt void adca1_isr(void)
{
Ia= AdcaResultRegs.ADCRESULT0; // ---------------------------------- OK
//AdcaResults[resultsIndex++] = AdcaResultRegs.ADCRESULT0;
AdcaResults[resultsIndex++] = AdcaResultRegs.ADCRESULT0;
if(RESULTS_BUFFER_SIZE <= resultsIndex)
{
resultsIndex = 0;
bufferFull = 1;
}
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;