Reading decimals of milivolts

Hi, I'm trying to read data from a pyrometer which gives me very low voltages as input. The range is about 0 to 12mV, and this represents temperatures from 0 to 1200ºC, so the decimals of milivolts are quite important to have some accuracy. Problem is, how may I do this with Arduino? I read a little about making a circuit with operational amplifiers (opamps), but it's quite a wild world to me as a beginner, so I'd love to have some specific help for this task. I also wondered if I just could interface a digital polymeter, or some specific instrument to measure low voltages.

Multimeter, not polymeter. Yes, that might be possible although the only Multimeter I have that can be interfaced takes USB rather than serial.

Pyrometer? You mean a thermocouple interface I think rather than a pyrometer (which is usually a radiation thermometer) - also search on these forums for people who've interfaced successfully to a thermocouple

Thanks MarkT, and yes, both corrections are pertinent: it's a thermocouple what I'm trying to read. And eventually a multimeter what I may interface...

On board ADC has ~4.88mV/bit with onboard ADC and Aref at 5V. If you use the internal 1.1V reference that can be brought down to 1.07mV/bit. See section 24 of the '328 datasheet.

If your signal only goes to 12mV, you will not have much range, only 0 to 12. Might want to look at a higher bit count ADC, or amplify your signal to better match the Vref that is being used. For example, a 12 Bit ADC would get you 1.22mV/bit, while a 16-bit ADC would provide 0.076mV/bit, assuming a 0-5V range on both.

MCP3208 is pretty easy to use for 12 bit http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en010534

I haven't used this one, I don't imagine it would too much more difficult, altho the sampling rate is a lot slower. http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en538232

Not sure what device you are using that gives you only 12mv at 1200 C. A K type thermocouple will give you about 50 mv at that temp and there is lots of devices that you can use to hook up to an Arduino to get the full benefit of it’s capabilities. There is also lots of code and diagrams on the net that will help you get something up and running.

You also need to read about "cold junction compensation" to allow the error that occurs due to ambient temperature at the display/amplifier device.

Normally for thermocouples you use an instrumentation amp specialised for the purpose - there are some that work from a single 5V rail which is ideal. The amp boosts the thermocouple output to a sensible range and deals with cold junction compensation. Search these forums for examples.

has anyone tried the MAX31855 yet? … I think that will allow temperature reads up to 1200C
I’ve seen code for it but haven’t protoed it up yet.

Even higher:

The MAX31855 performs cold-junction compensation and digitizes the signal from a K-, J-, N-, T-, S-, R-, or E-type thermocouple. The data is output in a signed 14-bit, SPI-compatible, read-only format. This converter resolves temperatures to 0.25°C, allows readings as high as +1800°C and as low as -270°C, and exhibits thermocouple accuracy of ±2°C for temperatures ranging from -200°C to +700°C for K-type thermocouples. For full range accuracies and other thermocouple types, see the Thermal Characteristics specifications in the full data sheet.

Need to read 4 bytes back every time, so like this for SPI interface:

    // read MAX31855 with 4 byte transfer
    digitalWrite (SS, LOW);
    dummyTemp = SPI.transfer (0);  // send anything out - MOSI not even connected - read in dummy data
    byte0 = SPI.transfer (0);          // dummy 0 byte out, read in 8 bits
    byte1 = SPI.transfer (0);          // dummy 0 byte out , read in 8 bits
    byte2 = SPI.transfer (0);          // dummy 0 byte out , read in 8 bits
    byte3 = SPI.transfer (0);          // dummy 0 byte out , read in 8 bits
    digitalWrite (SS, HIGH);

What you need to do with those 4 bytes all depends on what you have connected, as described on pages 9 & 10 of the datasheet: http://datasheets.maxim-ic.com/en/ds/MAX31855.pdf

You may find something you can use here. Open source hardware and software built around MCP3424 with CJC.

Jim

WOW! Thanks guys... I may have to retire my AD595.

I don't want to steal this thread arca, but the following link is for a really inexpensive module that might do a real good job for you. I purchased one of these boards and have not gotten around to using it but from what others have said, it may be the best option for you as it is cheap,a simple hookup to the Arduino, and it looks like there is already a lot of code around that you could use.

http://www.ebay.com/itm/Max31855-Type-K-Thermocouple-to-Digital-Converter-Module-Breakout-Board-/230818158223?pt=LH_DefaultDomain_0&hash=item35bdd5968f

Thanks a lot guys, I really think the Max31855 should do it. It really seems a fabulous option .

By the way, my thermopair is type -S (although it says it can read up to 1200ºC), and the goal it's to control an electric ceramic oven, so it will make nice temperature curves and the glazes will be happy.

Thanks again and may your wisdom be within my project. I'll try to keep this post updated with some results and (hopefully) the code I will use.

Here is a start

http://ryanjmclaughlin.com/wiki/MAX31855_Breakout

I'm stuck again. It seems I can't find the MAX interface for type S. I mean, i found the bare chip here http://es.mouser.com/search/refine.aspx?Ntk=P_MarCom&Ntt=142843684 It's the 700-MAX31855SASA+ but I guess I'll need to build a suitable breadboard to work with... But I'm not sure if I will need anything else apart form resistors and regular electronic stuff... any idea?

Send an email to Adafruit and ask very nicely if they'll sell their MAX31855 breakout without the MAX31855 (explain that you want to use the Type-S chip). This assumes you would be able to solder the replacement chip yourself.

Most Arduino "proto shields" have a small SOIC breakout area on them that you could use as well. At a minimum all you need to use is one cap; Adafruit goes the extra mile by including a 3v3 regulator (you might already have 3v3 supply on your Arduino) and diodes to protect the SCK and CS lines from 5V logic but those are not required.

Couldn’t you just use a K type thermocouple? It’s good to at least 1250 C? Otherwise what you might do instead of building your own board is just un-solder the K chip from the low cost module and solder in the S chip. It’s surface mount and a little trick, but I have pulled it off with 8 pin chips and a sharp pointed soldering iron. I positioned the chip and pressed a tiny square of metal to the top of the chip to absorb heat, then ran the iron quickly across the top of the leads on each side.

I think no cheap K-type sensor can measure around 1250ºC... So I'd rather stick with my old S-type and try talking with adafruit for the bare breadboard... But I'm wondering, what about if I get the regular board with the type K chip, and I connect it to my S type thermopair. Anyway I will have a signal of miliVolts which will be misinterpreted in the digital result, but maybe I can translate it again inside Arduino. I mean, I can borrow another thermometer, make some measures, compare the results and eventually write a function into Arduino to correct the results. Maybe it's not too academic, but it's a pain to order a bare chip of MAX38155K and pay 20 times the price of it for the transport fee.

arka: But I'm wondering, what about if I get the regular board with the type K chip, and I connect it to my S type thermopair. Anyway I will have a signal of miliVolts which will be misinterpreted in the digital result, but maybe I can translate it again inside Arduino. I mean, I can borrow another thermometer, make some measures, compare the results and eventually write a function into Arduino to correct the results. Maybe it's not too academic, but it's a pain to order a bare chip of MAX38155K and pay 20 times the price of it for the transport fee.

That's a pretty good question. With a type K reading 41.276uV/C and a type S reading 9.587uV/C it would seem that you could just multiply measured values by (41.276/9.587) 4.305 and get the proper value.

The values 41.276uV/C and 9.587uV/C are just approximations. The voltage/temp curve for a thermocouple is pretty non-linear when you are looking at the temperature over the whole range. If you are just looking at a narrow range... maybe less than 100 degrees... you might get away with just some sort of conversion. Depends on how accurate you need to be.