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.

f28335 ADC采样波形相位抖动



f28335自带adc采集到的波形放在1024大小的数组里面,用的例程,通过graph看到的波形有相位抖动,较严重,10k的信号每个周期都有,500k的几个周期有个一代码如下,请问是什么原因造成的。adc外围硬件电路按照TI的硬件指南设计的。输入信号Vpp为120mV,正弦波。

1k的波形,左边有明显的相位抖动。

500k的波形,几个周期一个较大的抖动

请问如何解决谢谢。

如下是代码,顺序模式的override模式。pll为sysclk150MHz。

 

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File

 #include "DSP2833x_Examples.h"   // DSP2833x Examples Include File

 

// ADC start parameters

#if (CPU_FRQ_150MHZ)     // Default - 150 MHz SYSCLKOUT  

#define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3)   = 25.0 MHz #endif

#if (CPU_FRQ_100MHZ)  

#define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2)   = 25.0 MHz #endif

 #define ADC_CKPS   0x0   // ADC module clock = HSPCLK/1      = 25.5MHz/(1)   = 25.0 MHz

 #define ADC_SHCLK  0x1   // S/H width in ADC module periods                  = 2 ADC cycle #define AVG        1000  // Average sample limit #define ZOFFSET    0x00  // Average Zero offset

 #define BUF_SIZE   1024  // Sample buffer size// Global variable for this example Uint16 SampleTable[BUF_SIZE];

main() {    Uint16 i;    Uint16 array_index;

// Step 1. Initialize System Control: // PLL, WatchDog, enable Peripheral Clocks // This example function is found in the DSP2833x_SysCtrl.c file.    InitSysCtrl();

// Specific clock setting for this example:    EALLOW;    SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/ADC_MODCLK    EDIS;

// Step 2. Initialize GPIO: // This example function is found in the DSP2833x_Gpio.c file and // illustrates how to set the GPIO to it's default state. // InitGpio();  // Skipped for this example // Enable the pin GPIO34 as output    EALLOW;    GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;    // GPIO pin    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;     // Output pin    EDIS;

// Step 3. Clear all interrupts and initialize PIE vector table: // Disable CPU interrupts    DINT;

// Initialize the PIE control registers to their default state. // The default state is all PIE interrupts disabled and flags // are cleared. // This function is found in the DSP2833x_PieCtrl.c file.    InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags:    IER = 0x0000;    IFR = 0x0000;

// Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR). // This will populate the entire table, even if the interrupt // is not used in this example.  This is useful for debug purposes. // The shell ISR routines are found in DSP2833x_DefaultIsr.c. // This function is found in DSP2833x_PieVect.c.    InitPieVectTable();

// Step 4. Initialize all the Device Peripherals: // This function is found in DSP2833x_InitPeripherals.c // InitPeripherals(); // Not required for this example    InitAdc();         // For this example, init the ADC

// Specific ADC setup for this example:    AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;  // Sequential mode: Sample rate   = 1/[(2+ACQ_PS)*ADC clock in ns]                         //                     = 1/(3*40ns) =8.3MHz (for 150 MHz SYSCLKOUT)          //                     = 1/(3*80ns) =4.17MHz (for 100 MHz SYSCLKOUT)          // If Simultaneous mode enabled: Sample rate = 1/[(3+ACQ_PS)*ADC clock in ns]    AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;    AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;        // 1  Cascaded mode    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;    AdcRegs.ADCTRL1.bit.CONT_RUN = 1;       // Setup continuous run

   AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1;       // Enable Sequencer override feature    AdcRegs.ADCCHSELSEQ1.all = 0x0;         // Initialize all ADC channel selects to A0    AdcRegs.ADCCHSELSEQ2.all = 0x0;    AdcRegs.ADCCHSELSEQ3.all = 0x0;    AdcRegs.ADCCHSELSEQ4.all = 0x0;    AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x7;  // convert and store in 8 results registers

// Step 5. User specific code, enable interrupts:

// Clear SampleTable    for (i=0; i<BUF_SIZE; i++)    {      SampleTable[i] = 0;    }

// Start SEQ1    AdcRegs.ADCTRL2.all = 0x2000;

   for(;;)    {  // Take ADC data and log them in SampleTable array

     // Initalize the array index.  This points to the current      // location within the SampleTable     

 array_index = 0;

     for (i=0; i<(BUF_SIZE/16); i++)      {        // Wait for int1        while (AdcRegs.ADCST.bit.INT_SEQ1== 0){}        GpioDataRegs.GPBSET.bit.GPIO34 = 1;  // Set GPIO34 for monitoring  -optional

       AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

#if INLINE_SHIFT        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT0)>>4);        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT1)>>4);        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT2)>>4);        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT3)>>4);        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT4)>>4);        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT5)>>4);        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT6)>>4);        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT7)>>4);

#endif //-- INLINE_SHIFT

#if NO_SHIFT || POST_SHIFT

       SampleTable[array_index++]= ( (AdcRegs.ADCRESULT0));        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT1));        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT2));        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT3));        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT4));        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT5));        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT6));        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT7));

#endif //-- NO_SHIFT || POST_SHIFT

       while (AdcRegs.ADCST.bit.INT_SEQ1== 0){}      GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;  // Clear GPIO34 for monitoring  -optional        AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

#if INLINE_SHIFT

       SampleTable[array_index++]= ( (AdcRegs.ADCRESULT8)>>4);        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT9)>>4);        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT10)>>4);        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT11)>>4);        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT12)>>4);        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT13)>>4);        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT14)>>4);        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT15)>>4);

#endif //-- INLINE_SHIFT

#if NO_SHIFT || POST_SHIFT

       SampleTable[array_index++]= ( (AdcRegs.ADCRESULT8));        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT9));        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT10));        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT11));        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT12));        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT13));        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT14));        SampleTable[array_index++]= ( (AdcRegs.ADCRESULT15)); #endif // -- NO_SHIFT || POST_SHIFT

 }

#if POST_SHIFT     // For post shifting, shift the ADC results     // in the SampleTable buffer after the buffer is full.     for (i=0; i<BUF_SIZE; i++)     {       SampleTable[i] = ((SampleTable[i]) >>4);     } #endif // -- POST_SHIFT

    GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;  // Clear GPIO34 for monitoring  -optional   } }

//=========================================================================== // No more. //===========================================================================