hi guys:
I am currently working on a project that is using pt100. I realized constant current source can easily get the temperature working accurately. I have trying LM317 to work with it, but the current drop when the resister value goes up. Does any one have idea about building a constant current source or fixing the circuit ?
By trying to drive the PT100 with a constant current source, you are making the reading depend not only on the temperature coefficient of the current-setting resistor, but also on the temperature coefficient of the voltage reference in the LM317 and the line regulation of the LM317. So you are needlessly introducing errors. It would be better to just connect the sensor in a half-bridge configuration, and use the voltage supply to the bridge as the reference voltage for the ADC. Then there is just 1 resistor that needs to have a stable value.
hi dc42:
Thank you for sharing your suggestion with me, but I am not very good at hardware, do you mind share your circuit with me?
Certainly. What is the nominal resistance of your PT100? Does it have a recommended operating voltage or current?
dc42:
sorry, what do you mean the normal resistance? :*
dc42:
Certainly. What is the nominal resistance of your PT100? Does it have a recommended operating voltage or current?
PT100 = 100 ohms at 0 degrees C, resistance goes up with rising temp, so positive temp coeffecient.
General practice is to operate a PT100 sensor at as low a current as practical to combat the effects of self heating of the platimum sensor wire which can effect the accuracy of the actual measurement. RTD sensors come in different physical sizes with different mass so self heating may not be a problem depending on various properties.
Thanks lefty, I wasn't sure whether the 100 in PT100 meant that the resistance was always 100 ohms nominal.
Mike, if you want to read it using the Arduino ADC then I suggest the attached schematic. The two resistors and the PT100 form a voltage divider that puts just over about 1V (the minimum recommended value) on the Aref pin. The PT100 gets about 0.5V across it, so it will dissipate 2.5mW. The 10uF capacitor ensures that the reference voltage is stable during the time it takes to perform a conversion. The 100 ohm resistor should have a low temperature coefficient, but the 820 ohm resistor is not critical. You will get a change in the value returned by analogRead of just under 2 per degC temperature change. If you want greater resolution than that, then I suggest you use an external ADC.
[EDIT: if your Arduino has a 3.3V pin, then a 430 ohm resistor to 3.3V would give a more stable reference than 820 ohms to +5V.]
Hi, MikeLou can I suggest you try a search for pt100 in the "search the Arduino Forum" box at the top of the forum.
This question and others relating to pt100 have been asked and answered so many times before you might just find the answer you need.
If you do some ohms law equations with your pt100 at the temperatures you want, I think you will find you need more than just a potential divider and power supply considering the resolution of the arduino AtoD.
Tom...
There are plenty of RTD circuits on the net. Some better some worse. Some use bridges, some use current sources.
The main reason for using RTD's is precision, if you don't need that use a thermocouple or thermistor instead. and if you need the precision i would go for a ready made transmitter which can be calibrated to the appropriate temperature range. The most common type is the "puck" type which is meant to be built into the housing of the sensor. With a 4-20mA interface you can have as long wires as you want and use a 250 Ohm sensing resistor. Thats the standard solution.
dc42:
I forgot to tell you that the testing range is about 450 C to -20 C. The reason I am using LM317 is because the current could be able to maintain constantly. I wonder if other examples that are shared on the forum could help with this project. One of Reason I don't use other temperature sensor is because the pt100 is already liberalized and also I can use one sensor to pretty much all other places. BTW, thanks for everyone's suggestions, those are really helpful to me to think about the solution.
MikeLuo:
dc42:
I forgot to tell you that the testing range is about 450 C to -20 C. The reason I am using LM317 is because the current could be able to maintain constantly.
Then the resistance will vary from about 92 ohms @ -20C to about 270 ohms @ 450C. I'd still use the PT100 in a simple voltage divider. However, I would choose a value for the fixed resistor near the geometric mean of these extreme values, and use a 14- or 16-bit external ADC to get better resolution.
Thank you so much guys. Those references are very very helpful. I use this web site's resource. I wonder if any one know which board this project based on.
http://openenergymonitor.org/emon/buildingblocks/rtd-temperature-sensing
I look at the code, I feel confused about the pint out and wiring. Can anyone help me with this.
It mentions about INPUT0 pin12, INPUT1 pin14 and INPUT2 pin15. where are those pins.
Sorry, I forgot posting the code.
#include "RTDModule.h"
RTDModule rtd;
//----------------------------------------------------------------------------
// Temperature variables
//----------------------------------------------------------------------------
double CYLB,CYLT,COL;
//----------------------------------------------------------------------------
// Setup
//----------------------------------------------------------------------------
void setup()
{
rtd.setPins(4,5,2); //RTD PT1000 pins 4,5 are digital pins for multiplexer, 2 is analog input
//rtd.calibration( input number, scaler, offset )
rtd.calibration(0, 0.120270927, -15.066198679); //INPUT 0 pin 12
rtd.calibration(1, 0.120821076, -13.824162893); //INPUT 1 pin 14
rtd.calibration(2, 0.120400012, -14.91327759); //INPUT 2 pin 15
analogReference(INTERNAL); //Set reference to 1.1V ready for RTD measurements
Serial.begin(9600);
}
//----------------------------------------------------------------------------
// Main loop
//----------------------------------------------------------------------------
void loop()
{
//Get temperatures and pass through digital low pass filter
COL = digitalLowPass(COL, rtd.getTemperature(0) ,0.90);
CYLB = digitalLowPass(CYLB, rtd.getTemperature(1) ,0.90);
CYLT = digitalLowPass(CYLT, rtd.getTemperature(2) ,0.90);
//Print temperatures out to serial
Serial.print(COL);
Serial.print(' ');
Serial.print(CYLB);
Serial.print(' ');
Serial.println(CYLT);
}
//----------------------------------------------------------------------------
//Digital low pass filter
double digitalLowPass(double last_smoothed, double new_value, double filterVal)
{
double smoothed = (new_value * (1 - filterVal)) + (last_smoothed * filterVal);
return smoothed;
}