I am currently working on a high-speed data logging project using a thermocouple and an Arduino-based system. Curently, I used max6675, but i figured out that max6675 only can read data in 4 samples per seccond. My goal is to achieve a sampling rate of at least 100 samples per second (100 SPS) while maintaining accuracy and stability in temperature readings. I would like to discuss the best methods to accomplish this and hear your insights.
What are you measuring that changes temperature so rapidly?
Are you using some kind of special thin film sensor?
If so ask the manufacturer what they recommend.
A faster ADC means a more noisy output. There's no escape from that.
Does it have to be a thermocouple? is it a high temperature?
This is just a guess but they do put-out very low voltages and MAX chip may be reading slowly because it's noise-filtering the low voltage signal.
The thermocouple itself will change as fast as its thermal mass allows.
You should be able to read a solid state sensor much faster, but usually they aren't rated for ovens or kilns, or anything like that.
Of course, audio ADCs work often at 44.1KHz or higher.
But yeah... Temperature usually doesn't change that quickly.
How much accuracy do you need? 1°? 0.1°?
How much does your signal change? +/-1°? +/-10°? +/-100°?
This is actually one reason I've seen thermocouples used in areas where temperature changes very quickly. A thin-wire thermocouple can have a very fast response and costs very little.
I've used a thermocouple connected to an instrumentation amp with additional opamps then directly to an ADC. Pick any ADC you like.
ADS1115 can do up to 860 SPS at 15 bit
It has 4 channels so you could read 4 thermocouples (and average them?)
The AD1113 /14 are similar but have only one channel
This is my research project, where I use this Thermocouple to measure the up and down waves of the temperature of the heated vehicle brake fluid before it boils until it boils, so from previous research it was explained that there is a difference in the signal shape when the brake fluid has boiled and before, here I need a system that is fast enough to capture this change
I am using a Type K thermocouple, and I plan to use an additional temperature sensor (TMP36) as a cold junction compensation.
I am aware that the higher the sampling rate, the more noise will appear. Therefore, I am considering several filtering methods, such as moving average or a digital low-pass filter, to obtain more stable data without losing resolution.
Yes, I need to use a thermocouple because I am measuring high temperatures, which can reach several hundred degrees Celsius. Solid-state sensors like TMP36 or DS18B20 are not suitable for this application due to their lower temperature limits.
I understand that thermocouples generate very low voltages, which makes them more susceptible to noise. The MAX31855 or similar chips may introduce additional filtering, which could slow down the response time. To mitigate this, I am using an ADS1115 ADC, which allows me to adjust the sampling rate and implement additional filtering as needed.
Regarding thermal response, I agree that the thermocouple itself will only change temperature as fast as its thermal mass allows. However, my focus is on optimizing the data acquisition speed so that I can capture rapid temperature fluctuations more accurately.
I have also considered higher-speed ADCs, such as those used in audio applications (44.1 kHz or higher). However, handling the low voltage signal and noise filtering remains a challenge when working with thermocouples at high speeds.
I need an accuracy of around 0.1°C to 1°C, depending on the application.
For my brake fluid boiling monitoring project, the temperature can reach up to 350°C, so a Type K thermocouple is a suitable choice. In this case, I need to capture rapid temperature increases accurately, as boiling can cause sudden changes in fluid properties.
On the other hand, for my brake cooling system with Peltier, the temperature can drop to around -30°C. This raises a concern because some thermocouple interface chips, such as the MAX6675, do not support negative temperatures. However, a Type K thermocouple itself is capable of measuring negative temperatures—the limitation comes from the signal processing chip.
To overcome this, I am considering using an op-amp and an external ADC instead of relying on chips like the MAX6675. With the right signal conditioning circuit, it should be possible to accurately read negative temperatures from a Type K thermocouple. Additionally, an ADC with a higher bit resolution will help improve accuracy, especially for low-voltage signals in the negative range.
Would love to hear if anyone has implemented a similar approach for reading both high and low temperatures efficiently!
That sounds like an interesting approach! Using an instrumentation amplifier followed by additional op-amps before feeding the signal into an ADC seems like a great way to improve signal quality, especially for low-voltage thermocouple readings.
I’d love to know more about your setup—particularly:
- Which instrumentation amplifier did you use? (e.g., AD623, INA125, or something else?)
- What kind of additional op-amp circuitry did you implement? Was it for filtering, gain adjustment, or cold junction compensation?
- Which ADC did you choose, and what sampling rate and resolution were you able to achieve?
- Did you use any software-based filtering (e.g., moving average or digital low-pass) to improve signal stability?
I’m currently experimenting with ADS1115, but I’m open to trying a different ADC if it provides better performance for my application. Thanks for sharing your experience!
Have you thought about using boldface type to emphasize parts of your post that forum members might overlook, or have difficulty noticing?
Thanks for the suggestion! I see your point, and I’ll consider using bold text to highlight key details in my future posts. It makes sense, especially for technical discussions where certain aspects might be overlooked when scanning through replies.
I appreciate the feedback!
AMDuino's have 12-bit ADC (likely solid 10-bit) that can read many times per millisecond. AVRduinos have 10 bit ADC that gives a solid 8-bit value (2 bits iffy per the datasheet) at 9 reads per ms but call it 8 to have cycles to process data.
With 1000's of reads per second you get a lot of data points to draw the curve between. Process that! Don't even try to have every read be perfect, try for close grouping.
Don't you get to have a reference voltage for your ADC? AVRduinos do.
What do I get WRONG?
Thanks for the detailed explanation!
Yes, I understand that AVR-based Arduinos (like the ATmega328P) have a 10-bit ADC, but in practical use, we often get a solid 8-bit resolution due to noise and other factors.
My goal in this test is not necessarily to achieve perfect readings from each ADC sample, but rather to ensure data integrity when transferring a large number of samples over serial communication. I want to verify that no data points are lost when logging at high speeds.
Regarding reference voltage, yes, AVR-based Arduinos allow setting a reference voltage (e.g., AREF, internal 1.1V, or external). In this test, I am using the default reference (Vcc), but for more precise readings, I could explore using an external reference.
Do you have any recommendations for techniques when processing large amounts of ADC data at high speeds? I appreciate your insights!
-30 to 350? What about this:
and:
At 350°C, it gives 350*0.005+1.25=3V, which with the right AREF could give maybe 0.2° resolution on an AVR. more with a better ADC.
I do a thing called non-blocking code, back in the 80's it was called Main Loop Code. I stick with polling which can be timed very close to regularity, within 50 microseconds in general. The ADC however will take about 105 or so usecs to gain a 10 bit sample. Add another 20 usecs (very generous 320 cycles) and I get 8 per msec.
There is more on getting the most out of AVR ADC.
Nick is a very thorough fellow in all of his lessons.
If you want to customize your reads, the how-to is here.
Nick Gammon's complete AVR chip ADC tutorial.
Since you're doing this for science/tech I have to problems helping with the code. Seebeck's work winds my clock!
The hard part may be getting the log recorded. My suggestion is to start every text line with micros() as 8 hex digits even if you average and only record every 10 ms. Arduino millis() is +/- 1, unsigned 32-bit micros() takes over 70 minutes to roll over and the way we use time;
end - start = elapsed always.
It is possible that an SPI EEPROM or RAM will let you log faster than SPI SDcard. Easier may be logging to a PC via USB at Serial baud 200000 or higher.
Also have a look at using a Teensy 3.2 or higher for greater speed and 12-bit ADC. The Teensy 4.1 has an FPU, runs at 600 MHz and has a lot (1024K) of RAM for an MCU.
Teensy 4.1 costs $31.50 and has microSD slot onboard.