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.

TMS320F28377D ADCs huge differences

Other Parts Discussed in Thread: TMS320F28377D

Hi All,

I'm evaluating a TMS320F28377D controller card and I'm having some differences I can't explain.

I'm using ADCA and ADCB with Systemclock 200MHz, ADC clocks on 50MHz in 16bit mode (identical configurations).

The sample-rate is about 1MSPS on both converters and each converters is sampling a fixed channel in burstmode, triggered by a PWM source.

When I take a look at the results of both ADC, which have the same configuration, the histogram of ADCA is 2x worse than ADCB. How comes!? Both analog channels are tied to ground (bridged the analogue decoupling capacitors on the controller card).

Best regards.

        EALLOW;
        AdcaRegs.ADCCTL2.bit.PRESCALE = (ADC_PRESCALE -1)*2;                         //set ADCCLK divider to /4 by value 6.
        AdcaRegs.ADCCTL2.bit.RESOLUTION = RESOLUTION_16BIT;
        AdcaRegs.ADCCTL2.bit.SIGNALMODE = SIGNAL_DIFFERENTIAL;
        AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;                    //Set pulse positions to late
        AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;                        //power up the ADC
        udelay(1000);                                            //delay for 1ms to allow ADC time to power up

        EDIS;

        acqps = 14; //75ns    for 12bit
        if(RESOLUTION_16BIT == AdcaRegs.ADCCTL2.bit.RESOLUTION)    //determine minimum acquisition window (in SYSCLKS) based on resolution
            acqps = 75; //>320ns for 16bit


        EALLOW;
        AdcaRegs.ADCBURSTCTL.bit.BURSTEN = 1; //Enable ADC burst mode
        AdcaRegs.ADCBURSTCTL.bit.BURSTTRIGSEL = ePWM1_ADCSOC_AC; //PWM1 will trigger burst of conversions
        AdcaRegs.ADCBURSTCTL.bit.BURSTSIZE = 10-1;      //conversion bursts n+1 conversions long
        AdcaRegs.ADCSOCPRICTL.bit.SOCPRIORITY=6;    //15-AdcbRegs.ADCBURSTCTL.bit.BURSTSIZE

    //    AdcaRegs.ADCSOC0CTL.bit.CHSEL  = 2;  //SOC will convert on channel
    //    AdcaRegs.ADCSOC1CTL.bit.CHSEL  = 1;  //SOC will convert on channel
    //    AdcaRegs.ADCSOC2CTL.bit.CHSEL  = 4;  //SOC will convert on channel
    //    AdcaRegs.ADCSOC3CTL.bit.CHSEL  = 3;  //SOC will convert on channe
    //    AdcaRegs.ADCSOC4CTL.bit.CHSEL  = 14; //SOC will convert on channel
    //    AdcaRegs.ADCSOC5CTL.bit.CHSEL  = 5;  //SOC will convert on channel
        AdcaRegs.ADCSOC6CTL.bit.CHSEL  = 2;  //SOC will convert on
        AdcaRegs.ADCSOC7CTL.bit.CHSEL  = 2;  //SOC will convert on 3
        AdcaRegs.ADCSOC8CTL.bit.CHSEL  = 2;  //SOC will convert on 3
        AdcaRegs.ADCSOC9CTL.bit.CHSEL  = 2;  //SOC will convert on 3
        AdcaRegs.ADCSOC10CTL.bit.CHSEL = 2;  //SOC will convert on 3
        AdcaRegs.ADCSOC11CTL.bit.CHSEL = 2;  //SOC will convert on 3
        AdcaRegs.ADCSOC12CTL.bit.CHSEL = 2;  //SOC will convert on 3
        AdcaRegs.ADCSOC13CTL.bit.CHSEL = 2;  //SOC will convert on 3
        AdcaRegs.ADCSOC14CTL.bit.CHSEL = 2;  //SOC will convert on 3
        AdcaRegs.ADCSOC15CTL.bit.CHSEL = 2;  //SOC will convert on 3

        AdcaRegs.ADCSOC0CTL.bit.ACQPS  = acqps;    //sample window is acqps + 1 SYSCLK cycles
        AdcaRegs.ADCSOC1CTL.bit.ACQPS  = acqps;    //sample window is acqps + 1 SYSCLK cycles
        AdcaRegs.ADCSOC2CTL.bit.ACQPS  = acqps;    //sample window is acqps + 1 SYSCLK cycles
        AdcaRegs.ADCSOC3CTL.bit.ACQPS  = acqps;    //sample window is acqps + 1 SYSCLK cycles
        AdcaRegs.ADCSOC4CTL.bit.ACQPS  = acqps;    //sample window is acqps + 1 SYSCLK cycles
        AdcaRegs.ADCSOC5CTL.bit.ACQPS  = acqps;    //sample window is acqps + 1 SYSCLK cycles
        AdcaRegs.ADCSOC6CTL.bit.ACQPS  = acqps;    //sample window is acqps + 1 SYSCLK cycles
        AdcaRegs.ADCSOC7CTL.bit.ACQPS  = acqps;    //sample window is acqps + 1 SYSCLK cycles
        AdcaRegs.ADCSOC8CTL.bit.ACQPS  = acqps;    //sample window is acqps + 1 SYSCLK cycles
        AdcaRegs.ADCSOC9CTL.bit.ACQPS  = acqps;    //sample window is acqps + 1 SYSCLK cycles
        AdcaRegs.ADCSOC10CTL.bit.ACQPS = acqps;    //sample window is acqps + 1 SYSCLK cycles
        AdcaRegs.ADCSOC11CTL.bit.ACQPS = acqps;    //sample window is acqps + 1 SYSCLK cycles
        AdcaRegs.ADCSOC12CTL.bit.ACQPS = acqps;    //sample window is acqps + 1 SYSCLK cycles
        AdcaRegs.ADCSOC13CTL.bit.ACQPS = acqps;    //sample window is acqps + 1 SYSCLK cycles
        AdcaRegs.ADCSOC14CTL.bit.ACQPS = acqps;    //sample window is acqps + 1 SYSCLK cycles
        AdcaRegs.ADCSOC15CTL.bit.ACQPS = acqps;    //sample window is acqps + 1 SYSCLK cycles

        AdcaRegs.ADCINTSEL1N2.bit.INT1E = 0; //disable INT1 flag
        AdcaRegs.ADCINTSEL1N2.bit.INT2E = 1; //disable INT2 flag
        AdcaRegs.ADCINTSEL3N4.bit.INT3E = 0; //disable INT3 flag
        AdcaRegs.ADCINTSEL3N4.bit.INT4E = 0; //disable INT4 flag

        AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 0;
        AdcaRegs.ADCINTSEL1N2.bit.INT2CONT = 1;
        AdcaRegs.ADCINTSEL3N4.bit.INT3CONT = 0;
        AdcaRegs.ADCINTSEL3N4.bit.INT4CONT = 0;

        AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 15;  //end of SOC6 will set INT1 flag
        AdcaRegs.ADCINTSEL1N2.bit.INT2SEL = 15; //end of SOC14 will set INT2 flag
        AdcaRegs.ADCINTSEL3N4.bit.INT3SEL = 15;  //end of SOC7 will set INT3 flag
        AdcaRegs.ADCINTSEL3N4.bit.INT4SEL = 15; //end of SOC15 will set INT4 flag

        //ADCINT2 will trigger 16 SOCs
        AdcaRegs.ADCINTSOCSEL1.bit.SOC0 = 0;
        AdcaRegs.ADCINTSOCSEL1.bit.SOC1 = 0;
        AdcaRegs.ADCINTSOCSEL1.bit.SOC2 = 0;
        AdcaRegs.ADCINTSOCSEL1.bit.SOC3 = 0;
        AdcaRegs.ADCINTSOCSEL1.bit.SOC4 = 0;
        AdcaRegs.ADCINTSOCSEL1.bit.SOC5 = 0;
        AdcaRegs.ADCINTSOCSEL1.bit.SOC6 = 0;
        AdcaRegs.ADCINTSOCSEL1.bit.SOC7 = 0;
        AdcaRegs.ADCINTSOCSEL2.bit.SOC8 = 0;
        AdcaRegs.ADCINTSOCSEL2.bit.SOC9 = 0;
        AdcaRegs.ADCINTSOCSEL2.bit.SOC10 = 0;
        AdcaRegs.ADCINTSOCSEL2.bit.SOC11 = 0;
        AdcaRegs.ADCINTSOCSEL2.bit.SOC12 = 0;
        AdcaRegs.ADCINTSOCSEL2.bit.SOC13 = 0;
        AdcaRegs.ADCINTSOCSEL2.bit.SOC14 = 0;
        AdcaRegs.ADCINTSOCSEL2.bit.SOC15 = 0;
  • Hi Tjarco,

    Connecting the inputs to ground in differential mode is not a valid input.  The common mode voltage of the input needs to be within 50mV of VREFHI/2.  If you configure the ControlCard such that VREFHI = 3.3V, then (ADCINp + ADCINn)/2 needs to be within 50mV of 1.65V.

    I think you will want to use a function generator to generate a voltage of VREFHI/2, then connect that signal to both pins of the differential channel on one of the ADCs.  Measure the code spread, then move the input to a different ADC and repeat. 

  • Hi David,


    If I connect a function generator to the ADC input, then I would measure a lot of noise picked up by the cables etc.

    With a 3V source I would measure in microvolts. Therefore the inputs of the ADC tied to ground to measure the performance and accuracy of the ADC, because they are not given in the datasheets (SNR, ENOB, etc).

    Even tough, the ADCs would give the same results. Not ADCA having a histogram being twice as wide as ADCB, ADCC and ADCD.

    I do not see a real solution in connecting a function generator for a real accuracy measurement. There's also no VCM output on the chip I could connect to :(

    [edit]

    I've connected a differential amplifier with common mode offset on the output (VREFH/2). the inputs of the amplifier are tied together to ground, so differential output = 0 (differential) and VREFH/2 absolute. I also measure the differences between ADCA and the other ADCs.

    Best regards,

    Tjarco Boerkoel

  • Tjarco,

    What codespread and standard deviation are you getting for each of the 4 ADCs?

  • Hi Devin,


    The code spread on ADCB,C and D are 4d.

    The codespread on ADC a is about 12d.

    Best regards

  • Tjarco,

      I can't of anything in the ADC design or control card that would cause ADC performance to be significantly worse than the others, given everything else is the same (i.e. ADC input signal integrity, ADC reference voltage, etc.)

      Here are a few questions that could help isolate the problem:

    1) Are you seeing wider code spread on all ADCA channels?

    2) Do you have the ability to use ADCIN14/ADCIN15 for this experiment?  These ADC inputs go to all ADCs and therefore it is possible to more directly compare code spread differences between the ADCs, ruling out input signal integrity.

    3) Do you know if your silicon is rev0/A or revB?  rev0/A material has an ESD sensitivity in the analog and therefore it is possible the device has been damaged causing leakage on the ADC inputs or reference pins.  (see erratum  ADC: Sensitivity to ESD Events)

    regards,

    Joe

  • Hi Joe,


    Thank you for your reply. Well, It's an TMX320 so I suppose it's an A type. The part name on the chip only containc A's no B's. So this could be a "first production" silicon issue.

    I'll try to use the ASCIN14/15, thanks for the suggestion.

    Best regards,


    Tjarco Boerkoel