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.

ADS8556EVM: All digital output bits are "sagging" after a conversion

Part Number: ADS8556EVM
Other Parts Discussed in Thread: ADS8556

Supply voltages:

+5V for AVdd and +VIN    -5V for HVSS and -VIN

+5V for AVdd

+3.3V for BVdd (digital supply)

I currently have the same test voltage (+2V) applied to all 6 channels of the ADS8556EVM kit (setup in HW + Parallel data mode).  This helps to insure that all of the data bits (DB0 through DB15) stay at the same (or close to the same) value after a conversion read.

After I command  a conversion, I wait for the BUSY interrupt.  Then I read all 6 channels by:

1. Driving the !CS pin low

2. Toggling the !RD pin low, then high, 6 times (one per each channel read).

3. Driving the !CS pin back high

I took this screenshot (yellow trace shows the BUSY interrupt pulse being generated, Blue trace is directly on pin 64 of the ADS8556, which is DB15, the MSB output):

My test voltage means that the blue trace (MSB bit) should be HIGH, but it is obviously "sagging".  I checked several of the digital output bits, and they all look like this exponentially decaying trace. 

My question:  why is the trace sagging?  Shouldn't it remain high?  This is causing my micro to read erratic output values.

  • Hi Richard,

    What's the code you got in your controller? Are you using blue wires to connect your controller to ADS8556EVM? Where did you connect data bus to(D0~D15 of ADC or J5 connector on ADS8556EVM board)?

    Thanks&regards,

    Dale

  • Greetings Dale!

    I've included another screenshots for clarification.  The yellow trace is the BUSY pulse on the ADC (J4, pin 19), and the blue trace is the DB15 pin (pin 64 of U4 directly) when I apply a -2V signal to all channels of the ADC (thus, this guarantees that the MSB, DB15, should always be a "1").  If I monitor J5, pin 31, it shows the same issue, so I'm directly monitoring U4 to narrow down the source of the problem. 

    These captures were taken with nothing connected to J5 except the two oscilloscope probes (again, trying to narrow down my problem source).

    My wire colors are many - some are blue, some are red, some are gray(?).

    Here's my code (I'm using an Arduino):

    #define ADC_CONV_FREQ 10000  //ADC conversion frequency in Hz
    
    /** ADC Pin defines are here:**/
    #define CONV_START 4
    #define ADC_IS_BUSY 5 
    #define ADC_CS     6 
    #define ADC_READ   9
    ///////////////////////
    #define ADC_BIT0 2
    #define ADC_BIT1 3
    #define ADC_BIT2 14
    #define ADC_BIT3 15
    #define ADC_BIT4 16
    #define ADC_BIT5 17
    #define ADC_BIT6 18
    #define ADC_BIT7 19
    #define ADC_BIT8 20
    #define ADC_BIT9 21
    #define ADC_BIT10 22
    #define ADC_BIT11 23
    #define ADC_BIT12 24
    #define ADC_BIT13 25
    #define ADC_BIT14 26
    #define ADC_BIT15 27
    
    /*********************************/
    //Global variables:
    volatile int ADC_result_bits;
    volatile int interrupt_counter;
    
    volatile float ADC_Channel_A0;
    volatile float ADC_Channel_A1;
    volatile float ADC_Channel_B0;
    volatile float ADC_Channel_B1;
    volatile float ADC_Channel_C0;
    volatile float ADC_Channel_C1;
    
    /*********************************/
    //Function prototypes:
    void ADC_ready_intrpt(void);
    float ADC_read(void);
    
    void setup()
    {  
      Serial.begin(9600);
      pinMode(CONV_START,OUTPUT);
      analogWriteFrequency(CONV_START, ADC_CONV_FREQ);  //Set ADC Conversion frequency
      
      pinMode(ADC_IS_BUSY, INPUT);  
    
      pinMode(ADC_CS, OUTPUT);
      pinMode(ADC_READ, OUTPUT);
      digitalWrite(ADC_CS, HIGH);
      digitalWrite(ADC_READ, HIGH);
      
      attachInterrupt(digitalPinToInterrupt(ADC_IS_BUSY), ADC_ready_intrpt, FALLING);
      
      /***********************************/
      pinMode(ADC_BIT0, INPUT);
      pinMode(ADC_BIT1, INPUT);
      pinMode(ADC_BIT2, INPUT);
      pinMode(ADC_BIT3, INPUT);
      pinMode(ADC_BIT4, INPUT);
      pinMode(ADC_BIT5, INPUT);
      pinMode(ADC_BIT6, INPUT);
      pinMode(ADC_BIT7, INPUT);
      pinMode(ADC_BIT8, INPUT);
      pinMode(ADC_BIT9, INPUT);
      pinMode(ADC_BIT10, INPUT);
      pinMode(ADC_BIT11, INPUT);
      pinMode(ADC_BIT12, INPUT);
      pinMode(ADC_BIT13, INPUT);
      pinMode(ADC_BIT14, INPUT);
      pinMode(ADC_BIT15, INPUT);
      /***********************************/
      analogWrite(CONV_START, 100);
      delay(1000);  
    }
    
    void loop()
    {    
      for(volatile long i = 0; i < 100000000; i++)
      {//"do nothing" for loop        
      }
      Serial.print("Intrpt counter: ");
      Serial.println(interrupt_counter);
      Serial.print("C0: ");
      Serial.println(ADC_Channel_A0);
      Serial.print("C1: ");
      Serial.println(ADC_Channel_A1);
    }
    
    
    
    float ADC_read(void)
    {
      ADC_result_bits = digitalReadFast(ADC_BIT0) | 
                        (digitalReadFast(ADC_BIT1) << 1) |
                        (digitalReadFast(ADC_BIT2) << 2) |                                   
                        (digitalReadFast(ADC_BIT3) << 3) |                                   
                        (digitalReadFast(ADC_BIT4) << 4) |
                        (digitalReadFast(ADC_BIT5) << 5) |                                   
                        (digitalReadFast(ADC_BIT6) << 6) |                                   
                        (digitalReadFast(ADC_BIT7) << 7) |
                        (digitalReadFast(ADC_BIT8) << 8) |                                   
                        (digitalReadFast(ADC_BIT9) << 9) |                                   
                        (digitalReadFast(ADC_BIT10) << 10) |
                        (digitalReadFast(ADC_BIT11) << 11) |                                   
                        (digitalReadFast(ADC_BIT12) << 12) |                                   
                        (digitalReadFast(ADC_BIT13) << 13) |
                        (digitalReadFast(ADC_BIT14) << 14) |                                   
                        (digitalReadFast(ADC_BIT15) << 15);                                    
    
      return (float)ADC_result_bits;
    }
    
    void ADC_ready_intrpt(void)
    {
        noInterrupts(); //Disable interrupts    
        interrupt_counter++;
        
        digitalWrite(ADC_CS, LOW); //Keep chip select LOW for the entire data read process (all channels)
        
        digitalWrite(ADC_READ, LOW);
        digitalWrite(ADC_READ, HIGH);
        ADC_Channel_A0 = ADC_read();
            
        digitalWrite(ADC_READ, LOW);
        digitalWrite(ADC_READ, HIGH);
        ADC_Channel_A1 = ADC_read();
    
        digitalWrite(ADC_READ, LOW);
        digitalWrite(ADC_READ, HIGH);
        ADC_Channel_B0 = ADC_read();
    
        digitalWrite(ADC_READ, LOW);
        digitalWrite(ADC_READ, HIGH);
        ADC_Channel_B1 = ADC_read();
    
        digitalWrite(ADC_READ, LOW);
        digitalWrite(ADC_READ, HIGH);
        ADC_Channel_C0 = ADC_read();
    
        digitalWrite(ADC_READ, LOW);
        digitalWrite(ADC_READ, HIGH);
        ADC_Channel_C1 = ADC_read();
        
        
        digitalWrite(ADC_CS, HIGH);  //Now drive chip select high again
        interrupts(); //Enable interrupts
    }

  • Hi Richard,

    I suggest you to use a low capacitance probe, also the probe should have a good ground connection to the EVM board. If possible, disconnect the trace of DB15 signal from U7 for test purpose. 

    I did not get the answer from you about my question "What's the code you got in your controller?".

    Thanks&regards,

    Dale