2015-05-03 24 views
6

Jestem nowy w programowaniu arduino. I prawie niedoświadczony.Jak odczytać temperaturę za pomocą płytki arduino uno z czujnikiem PT100 RTD?

Chciałbym zaprogramować kartę arduino Uno do odczytu konfiguracji przewodu 2/3/4 czujnika PT100 RTD (w dokładności co najmniej 0,5 ° C). Zakres temperatury wynosi od 0 do 400 ° C i od -50 do 100 ° C.

Ponieważ jestem całkowicie nowy w tej dziedzinie, byłbym wdzięczny za opisową informację z obwodami, obrazami i kodem.

Mam wiele badań na ten temat, ale nie mogłem uzyskać nic przydatnego ani istotnego do rozwiązania mojego problemu.

Co więcej, nie mogę używać termistora ani żadnego układu scalonego do odczytu temperatur, ponieważ urządzenie, na którym zainstalowane są urządzenia RTD ma PID, ale chciałbym stworzyć rejestrator danych, który może pobierać temperaturę z samego komputera.

+0

Witam, myślę, że dostaniesz lepsze odpowiedzi tutaj -> http://arduino.stackexchange.com/ – Andreas

+0

Dziękuję. Jestem nowy na tej stronie. Zrobi to. –

+0

Nie ma problemu, myślę, że to była poprawna strona, zanim utworzona przeze mnie została utworzona, stąd wszystkie dostępne znaczniki :) – Andreas

Odpowiedz

3

PT100 zwiększa swoją odporność w miarę zużywania ciepła. Charakterystyka temperatury w funkcji rezystancji jest opisana w pt100 resistance table

Arduino może odczytać napięcie na wejściu analogowym. Aby uzyskać odczyty stopni Celsjusza musimy:

  1. czytać wejście analogowe jak napięcie
  2. wartość rezystancji
  3. oblicz (dzielnik napięcia)
  4. odnośnika stopni Celsjusza z tabeli na podstawie oporu

voltage divider

Vin to 5 volt z arduino R1 to opór o znanej wartości w moim programie to 220 Ohm faktycznie R2 to pt 100 Vout musi być podłączony do arduino anal Wejście PIN og (A0 na przykład)

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

obwód może być dokonywane na rysunku powyżej jest dość prosta.

Szkic pisałem zawiera dane oporu od 0 ° C - 80 ° C (może być łatwo rozbudowany) Aby uzyskać stopni od wartości rezystancji używam moją wersję funkcji Multimap który wykorzystuje tablicę jeden pływak jako wartości rezystancji i używa interpolacji liniowej obliczyć dokładne stopnie

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); 
} 
+0

Co do dokładności: używana wartość rezystancji dla każdego stopnia liczb całkowitych, tj. 0C -> 100 ohm 1C -> 100,39 itd. – Chris

+0

Wartość rezystancji R1 musi być tak dokładna i dokładna, jak to tylko możliwe. Najpierw umieściłem 220 omów w programie, ale było to rzeczywiście 217 ohm (mierzone przez multimetr). Oznaczało to przynajmniej 3 stopnie !!!!! – Chris

3

Chris, chociaż Twoje rozwiązanie działa, jest miejsce na poprawę.

1) pullup 220 ohm jest za mały. Występuje zauważalny prąd płynący przez pt100, który może zakłócać precyzję. Bardzo minimalistycznym podejściem jest zwiększenie pullup w celu zmniejszenia tego prądu i wzmocnienie napięcia na rozdzielaczu, patrz http://www.avrfreaks.net/sites/default/files/pt100.JPG

2) po zauważeniu kabli i standardowym środowisku przemysłowym, możesz zdecydować się na standardowy układ mostów pomiarowych. Wykorzystuje to cztery przewody, z których dwa są używane jako źródło prądu stałego. (W odróżnieniu od rezystora pollup, źródło stałego prądu zapewnia stabilny odczyt pełnego zakresu i ma lepszą stabilność temperatury .. Prosty pullup sam może mieć znaczny dryft. Pozostałe dwa przewody są używane jako wejście różnicowe.Na tych przewodach nie płynie prąd, dlatego faktyczna odległość okablowania czujnika nie ma wpływu na dokładność. To podejście jest pokazane tutaj: https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/4wire2.svg/286px-4wire2.svg.png i w rzeczywistości wszystkie czujniki przemysłowe działają na tej zasadzie.

3) możesz preferować używanie analogowego interfejsu zamiast obracania własnego obwodu analogowego. AD7714 http://www.seekic.com/circuit_diagram/Measuring_and_Test_Circuit/Temperature_measurement_circuit_composed_of_the_AD7714_and_Pt100.html i dużo więcej profesjonalnych rozwiązań tutaj: http://www.ti.com/europe/downloads/2-%203-%204-Wire%20RTD%20Measurement.pdf