Go Down

Topic: Thermocouples, MAX31855 ADC and Uno Problems (Read 3 times) previous topic - next topic


I have multiple thermocouples (TCs) going to MAX31855 ADCs (1 per TC), which all connect to a common SO bus going to an Uno.  The schematic is attached.  The setup works fine for a single TC, but all output readings go to zero when hooked up in series.  There is a common voltage bus (5V from Uno --> 3.3V using resistors), GND bus, clock (CLK) and serial output (SO) bus.  The chip select (CS) pins all go to separate pins on the Uno. 

At first I thought I was experiencing a loading problem, but after testing I found I was not.  If I have one TC/ADC running and 2nd TC/ADC hooked up except for the clock line, the 1st TC reads fine, but as soon as I attach the 2nd CLK pin the outputs both go to zero.  I essentially followed the same setup as shown in my second attachment (TC_Quad_Interface...).  I've tried using a Schmitt trigger, but that failed.  Any other ideas or advice would be much appreciated!



Sorry, I can't read eagle 6 files.


Are you driving the CSn lines high, except for the one you're reading?  The MAX31855 has an active low CS.



Looks like the bypass capacitors are only connected at one end.  The bottom traces are missing completely.  There appears to be text across the top layer saying 1.42. Thera are a pile of un-routed traces.
Send Bitcoin tips to: 1L3CTDoTgrXNA5WyF77uWqt4gUdye9mezN
Send Litecoin tips to : LVtpaq6JgJAZwvnVq3ftVeHafWkcpmuR1e


Thanks for the replies.  Here is the relevant portion of the code:
float getTemp(int ch)  {
   unsigned long value = 0;
   float temp = 0;
   char bita;
   digitalWrite(ch, 0);         //Switch to low (active)
   for (int i = 0; i < 32; i++) //Get 32 bits from the MAX31855 - see datasheet for specifics. 
     { digitalWrite(mClockPin, 1);     //set clock pin low
       bita = digitalRead(mDataPin);
       if (bita==1) value = value | 1; //If bit ==1 set lowest bit in value
       digitalWrite(mClockPin, 0);     //Set clock pin back to high
       if (i != 31) value = value << 1;// If we're not done yet, shift bits left by 1 to make room for next loop
   digitalWrite(ch, 1);
   value = value >> 18; //shift out all but tc temp data and sign bit
   temp = (((value * 0.25) * 9) / 5) + 32; //Convert to Degrees F
   return temp;

The code utilizes a continuous loop that calls 'getTemp' for each of the thermocouple channels (1-9 in this case).  When getTemp(CH1) is called, for example, the CS line is set to low (active) and the data pin (SO) is read.  32 bits are pulled from the data bus before the temperature is returned, and the loop moves on to executing getTemp for the next channel (CH2).

As you can see, data should only be coming from one MAX31855 at a time, but when analyzing the circuit I was seeing signals from, say, CH2 when executing getTemp(CH1)!  This was why I tried using a Schmitt trigger, but it did not work.  I may have chosen the incorrect trigger though, so any advice there would be helpful! 

To johnwasser, I'm not sure what you're referring to as un-routed traces, but any trace that ends in a green circle is going to a pin (either to the Uno or the MAX31855).  The caps are open on one end because they are floating caps.  I was told this acts as a frequency filter for the incoming voltage from the Uno.  Is this incorrect?  Thanks for your reply.



Sorry, I was referring to decoupling caps

Go Up