web-dev-qa-db-fra.com

Comment lire la température en utilisant la carte Arduino Uno avec capteur PT100 RTD?

Je suis nouveau dans la programmation Arduino. Et presque inexpérimenté.

Je cherche à programmer ma carte Arduino Uno pour lire la configuration 2/3/4 fils du capteur PT100 RTD (avec des niveaux de précision d'au moins 0,5 ° C). La plage de température est de 0 à 400 ° C et de -50 à 100 ° C.

Étant donné que je suis totalement nouveau dans ce domaine, j'apprécierais une information plutôt descriptive avec des circuits et des images et du code.

J'ai fait beaucoup de recherches sur le sujet, mais je n'ai rien trouvé d'utile ou de substantiel pour résoudre mon problème.

De plus, je ne peux pas utiliser de thermistance ou de circuit intégré pour lire les températures car la machine sur laquelle le RTD est installé possède des PID, mais je voudrais créer un enregistreur de données qui peut récupérer les températures sur l'ordinateur lui-même.

7
Mayur Agarwal

Chris, bien que votre solution fonctionne, il y a encore place à amélioration.

1) le pullup de 220 ohms est trop petit. Un courant notable traverse constamment le pt100, ce qui peut nuire à la précision. Une approche très minimaliste consiste à augmenter le pullup pour réduire ce courant et à amplifier la tension sur le diviseur, voir http://www.avrfreaks.net/sites/default/files/pt100.JPG

2) une fois qu'il y a un chemin de câbles notable et un environnement industriel standard, vous pouvez décider d'opter pour une disposition de pont de mesure standard. Celui-ci utilise quatre fils, dont deux sont utilisés comme source de courant constant. (Contrairement à une résistance de pollup, une source de courant constant assure des lectures stables sur toute la plage et doit avoir une meilleure stabilité de température. Un simple pullup lui-même peut avoir une dérive importante. Les deux autres fils sont utilisés comme entrée différentielle. Aucun courant ne circule sur ces fils , par conséquent, la distance de câblage réelle du capteur n'affectera pas la précision. Cette approche est illustrée ici: https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/4wire2.svg/286px -4wire2.svg.png et en fait tous les capteurs industriels fonctionnent sur ce principe.

3) vous préférerez peut-être utiliser un frontal analogique au lieu de lancer votre propre circuit analogique. AD7714 http://www.seekic.com/circuit_diagram/Measuring_and_Test_Circuit/Temperature_measurement_circuit_composed_of_the_AD7714_and_Pt100.html et bien d'autres solutions professionnelles ici: http://www.ti.com/europe/downloads /2-%203-%204-Wire%20RTD%20Measurement.pdf

5
Gee Bee

Le PT100 augmente sa résistance à mesure que la chaleur est appliquée. La caractéristique température vs résistance est décrite dans tableau de résistance pt1

Arduino peut lire la tension sur l'entrée analogique. Pour obtenir des lectures en degrés Celsius, nous devons:

  1. lire l'entrée analogique comme tension
  2. calculer la valeur de résistance (diviseur de tension)
  3. rechercher le degré Celsius du tableau en fonction de la résistance

voltage divider

Vin est à 5 volts d'arduino R1 est une résistance de valeur connue dans mon programme c'est 220 Ohm en fait R2 est le pt 100 Vout doit être connecté à la broche d'entrée analogique arduino (A0 par exemple)

R2 = R1 * 1/(Vin/Vout - 1)

Le circuit peut se faire sur la base de l'image ci-dessus c'est assez simple.

Le croquis que j'ai écrit contient des données de résistance de 0C à 80C (peut être étendu facilement) Pour obtenir les degrés de la valeur de résistance, j'utilise ma version de la fonction MultiMap qui utilise un tableau flottant comme valeurs de résistance et utilise une interpolation linéaire pour calculer les degrés exacts

float in[] = { 100.00, 100.39, 100.78, 101.17, 101.56, 101.95, 102.34, 102.73, 103.12, 103.51,
               103.90, 104.29, 104.68, 105.07, 105.46, 105.85, 106.24, 106.63, 107.02, 107.40,
               107.79, 108.18, 108.57, 108.96, 109.35, 109.73, 110.12, 110.51, 110.90, 111.29,
               111.67, 112.06, 112.45, 112.83, 113.22, 113.61, 114.00, 114.38, 114.77, 115.15,
               115.54, 115.93, 116.31, 116.70, 117.08, 117.47, 117.86, 118.24, 118.63, 119.01,
               119.40, 119.78, 120.17, 120.55, 120.94, 121.32, 121.71, 122.09, 122.47, 122.86,
               123.24, 123.63, 124.01, 124.39, 124.78, 125.16, 125.54, 125.93, 126.31, 126.69,
               127.08, 127.46, 127.84, 128.22, 128.61, 128.99, 129.37, 129.75, 130.13, 130.52 };

// known resistance in voltage divider
int R1 = 217;

float MultiMap(float val, float* _in, uint8_t size)
{
  // calculate if value is out of range 
  if (val < _in[0] ) return -99.99;
  if (val > _in[size-1] ) return 99.99;

  //  search for 'value' in _in array to get the position No.
  uint8_t pos = 0;
  while(val > _in[pos]) pos++;  

  // handles the 'rare' equality case
  if (val == _in[pos]) return pos;

  float r1 = _in[pos-1];
  float r2 = _in[pos];
  int c1 = pos-1;
  int c2 = pos;

 return c1 + (val - r1) / (r2-r1) * (c2-c1);
}

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);

}
void loop() {
  // put your main code here, to run repeatedly:
   int pt100 = analogRead(A0);


   float Vout = pt100 * (5.0 / 1023.0);
   float R2 = R1 * 1/(5.0/Vout - 1);

float c =  MultiMap(R2,in,80);

Serial.print("Resistance: ");
Serial.print(R2);
Serial.println(" Ohm");

Serial.print("Temperature: ");
Serial.print(c);
Serial.println(" C");


delay(400);
}
5
Chris