La CTN
Une résistance CTN permet mesurer la température grâce à des propriétés semi-conductrices non linéaires.
Celle ci possède un Coefficient de Température Négatif (CTN), c’est à dire que la résistance diminue quand la température augmente.
La loi de variation de la résistance d’une CTN en fonction de la
température est donnée par la formule :
- avec : R25 valeur de la résistance à T = 273+25 = 298 K (attention dans cette formule il faut exprimer T en K ! )
-
: béta, indice de sensibilité thermique en K
- T0 = 273+25 = 298K
Cette étude est aussi disponible sous forme d'un TP au lien suivant : bts2m.free.fr/TP_Arduino/09_Regulation.html
- Stainless steel sheath and waterproof
- Measurement range: -20 to 105 °C
- Length of wire: 1 meter
- Size of probe: 5 x 25 mm
- Output: 2 wires
- Type: NTC 10k±1% 3950
- B-constant : 3950K ± 1%
Nous allons l'utiliser dans un pont diviseur :
A
l'aide du diviseur de tension nous exprimons la tension Vs en
fonction de R(t) :
Nous allons placer cette CTN à l'intérieur de la nacelle.
La gamme de température sera comprise entre -20°C et 40°C.
La température de milieu de gamme est donc de 10°C.
L'étude que nous avons réalisée avec un tableur nous montre que la sensibilité est maximale lorsque R1 = R(10°C) = 18 k.
Par la suite nous avons développé des programmes en Python et Labview disponibles sur ce lien pour optimiser la fonction de transfert en fonction de R1 et des paramètres de la CTN.
Cette courbe T(Vs) a en ordonnée la température T en °C et en abcisse la tension Vs.
Pour R1 = 18 k et E = 5 V :
- gamme de température : -20°C à +40 °C
- plage de tension : 1,05 V à 3,87 V (étendue : 2,82 V)
- Sensibilité moyenne : 47 mV/°C
Etendue | Min | Max | ||
Plage de tension en V | 2,82 | 1,05 | 3,87 | |
Sensibilité en mv/°C | 47 | 30 | 55 |
Dans une plage de température restreinte un modèle du premier degré peut-être utilisé.
Mais comme le montre notre étude théorique un modèle du 3ème
degré donne de bien meilleurs résultats
(coefficient de corrélation de 0,99995)
L'Arduino peut calculer très facilement une équation du 3ème degré...
Etalonnage
Un étalonnage est indispensable car il y a une variation importante de R0 et b.
Matétiel :
- CTN et son diviseur de tension
- un capteur DHT22 qui nous sert d'étalon.
- un Arduino alimenté par des piles (Cf programme à la fin de cette page)
- une carte SD stockant les données (datalogging)
- une boite contenant la chaîne de mesure
- un congélateur
Protocole :
Nous avons placé la boite dans le congélateur durant 1h30. Les mesures sont effectuées à la "volée" toutes les 30s et sont stockées sur la carte SD.
Lors de l'expérience 0 nous avons été surpris de voir la courbe s'éloigner de la courbe théorique puis la rejoindre progressivement au fur à mesure que la température se stabilise.
Puis nous avons placé notre boîte de glace dans une boîte isotherme avant de placer le tout dans le congélateur : expérience 3 (courbe violette).
Ainsi l'évolution de la température est beaucoup plus lente et l'influence de la constante de temps des capteurs peut-être négligée (contrairement à l'expérience 0).
La courbe ainsi obtenue est beaucoup plus proche de la courbe théorique (en rouge). Cette expérience nous a permis d'ajuster les coefficients de la CTN et de la modéliser par une équation du 3ème degré.
Ceci nous montre pourquoi des mesures à la volée ne sont pas recommandées pour un étalonnage...
Justification
Notre capteur peut être assimilé à un système du premier ordre. On peut assimiler cette erreur à une erreur de traînage comme en automatisme.
Dans ce cas on peut estimer que l'erreur vaut environ
Cette erreur dépend donc des constantes de temps des capteurs et de la rapidité d'évolution de la température (A)...
Pour diminuer cette erreur, nous pouvons diminuer A.
La boîte isotherme
Cette expérience nous a permis aussi de voir le rôle d'une boite isotherme (en polystyrène expansé de 1cm d'épaisseur) sur l'évolution de la température.
Dans la boîte isotherme, placée dans un congélateur, l'évolution de la température (courbe en violet) est beaucoup plus lente.
Autre intérêt de cette expérience : nous avons pu constater que notre électronique fonctionne sans aucun problème à une température de -25°C.
Il en sera de même à l'intérieur de notre nacelle qui sera
réalisée en polystyrène extrudé de 3 cm d'épaisseur.
La température évolura lentement et ne descendra pas en dessous de
-15°C.
La température à l'intérieur n'aura pas le temps de s'équilibrer avec la température extérieure : il fera moins froid à l'intérieur. Comme le montre les courbes réalisées pour le projet M2C3T1 :
Grâce à cette isolation la température intérieure n'est pas descendue en dessous de -15 °C contre - 45°C à l'extérieur.
Etalonnage final
Voici
la courbe d'étalonnage obtenue avec la carte finale :
En abscisse : tension numérisée par le CAN de l'Arduino (1024 <-> 5 V)
La courbe verte est la courbe théorique établie ci-dessus.
Les points de mesure sont en rouge.
Nous avons modélisé cette courbe par un modèle du 3éme ordre pour obtenir un meilleur coefficient de corrélation.
La courbe d'étalonnage a un excellent coefficient de corrélation r²=0,9998.
La différence entre la courbe théorique et la courbe expérimentale s'explique par :
- la dispersion des composants (résistances à 1 %)
- exactitude du R0 et B de notre CTN (selon le constructeur 1%)
- l'exactitude de notre thermomètre étalon qui était un DHT22
- les conditions de l'expérience : mesure à la volée dans une boite isotherme (pour limiter l'erreur de trainage) à l'intérieur d'un congélateur.
Le coefficient de corrélation élevé nous permet d'avoir confiance dans notre équation :
tCTN= analogRead(CTN);
tCTN=3.0627e-7*pow(tCTN,3)-4.1584e-4*pow(tCTN,2)+0.2663*tCTN-57.2; // Etalonnage par DHT22
Etalonnage automatisé avec un Arduino :
/* Objectif Lire la tension de sortie du montage 1 Pile A0 -> M0 Lire la tension de sortie du montage 2 PT1000 A1 -> M1 Lire la tension de sortie du montage 3 CTN 10k A2 -> M2 Lire la température indiquée par le dht22 */ #include <DHT.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #include <SD.h> #define DHTPIN 3 // what pin we're connected to #define DHTTYPE DHT22 // DHT 22 (AM2302) LiquidCrystal_I2C lcd(0x27,20,4); DHT dht(DHTPIN, DHTTYPE); int mes,i,M0=0,M1,M2; int chipSelect=10; int indicatorLed = 13; boolean error=false; char message[140]; float t,VPT1000,VCTN,Pile; void setup() { Serial.begin(9600); pinMode(indicatorLed, OUTPUT); lcd.init(); // initialize the lcd lcd.noBacklight(); dht.begin(); // Initialiser le capteur dht22 lcd.setCursor(15, 0); if (!SD.begin(chipSelect)) {error=true;lcd.print("SD Er");} // Initialisation carte SD else {lcd.print("SD OK");iniSD();} lcd.setCursor(0, 0); lcd.print("M"); lcd.setCursor(7, 0); lcd.print("T="); lcd.setCursor(0, 1); lcd.print("Mes1 PT100 ="); lcd.setCursor(0, 2); lcd.print("Mes2 PT1000 ="); lcd.setCursor(0, 3); lcd.print("Mes3 CTN ="); } void loop() { if(i%30==3) lcd.noBacklight(); t = dht.readTemperature(); M0=analogRead(A0); M1=analogRead(A1); M2=analogRead(A2); VPT1000=5.0/1024.0*M1; VCTN=5.0/1024.0*M2; Pile=10.0/1024.0*M0; affiche(); if (i%30==0) ecrireSD(); i++; delay(1000); // Show new results every second. } void affiche() { lcd.setCursor(9, 0); lcd.print(t,1); lcd.setCursor(14, 1); lcd.print(M0); lcd.print(" "); lcd.setCursor(14, 2); lcd.print(M1); lcd.print(" "); lcd.setCursor(14, 3); lcd.print(M2); lcd.print(" "); Serial.print(t,1);Serial.print(" C\t Pile="); Serial.print(Pile,1);Serial.print(" V\t CTN="); Serial.print(VCTN,3);Serial.print(" V\t PT1000="); Serial.print(VPT1000,3);Serial.println(" V"); if (error) Serial.println ("Erreur SD"); } void iniSD() { File TEMPtab = SD.open("TEMPtab.csv", FILE_WRITE); if (TEMPtab) { error=false; TEMPtab.println("mes;t(dht);Pile;PT1000;CTN;VCTN;VPT1000"); TEMPtab.close(); } else { error=true; lcd.setCursor(15,0); lcd.print("SD Er");} } void ecrireSD(){ mes++; lcd.backlight(); lcd.setCursor(1, 0); lcd.print(mes); File TEMPtab = SD.open("TEMPtab.csv", FILE_WRITE); if (TEMPtab) { error=false; TEMPtab.print(mes); TEMPtab.print(";"); TEMPtab.print(t,1); TEMPtab.print(";"); TEMPtab.print(Pile,1); TEMPtab.print(";"); TEMPtab.print(M1); TEMPtab.print(";"); TEMPtab.print(M2); TEMPtab.print(";"); TEMPtab.print(VCTN,3); TEMPtab.print(";"); TEMPtab.println(VPT1000,3); TEMPtab.close(); } else { error=true; lcd.setCursor(15,0); lcd.print("SD Er");} }