Blog (16)
Komentarze (1.1k)
Recenzje (0)

Atmega: Prosty termometr

Strona główna@revcoreyAtmega: Prosty termometr
03.11.2013 21:49

Pomiar temperatury jest jednym z najczęściej mierzonych parametrów. Począwszy od temperatury w pomieszczeniu przez temp. uzwojeń silnika aż po temp. cieczy. Zasadniczo istnieje wiele sposobów pomiaru. My wykorzystamy najprostszy tzn. warystor. Warystory są to elementy które pod wpływem temperatury zmieniają swoją oporność.

Podstawy

Skorzystamy tutaj z termometru KTY 81-210 który oparty właśnie jest o warystor. Będziemy mierzyć napięcie na nim w zależności od temperatury. Ale jak to zrobić? W najprostszy możliwy sposób poprzez dzielnik napięcia http://pl.wikipedia.org/wiki/Dzielnik_napi%C4%99c . Wyprowadzenie wzoru na rezystancję pozostawiam wam :) Poniżej rysunek z dzielnikiem jak jest on podłączony.

Rys. 1 Uproszczony schemat połączenia
Rys. 1 Uproszczony schemat połączenia

Generalnie sprawa jest prosta. Podłączamy się pod wyjście dzielnika napięcia i mierzymy napięcie(wejście PA0, rys.1). Następnie po przekształceniu wzoru na dzielnik otrzymujemy rezystancję termometru. Pojawia się kolejny problem, jak dopasować rezystancję. Otwieramy notę katalogową termometru. Producent podaje wartości średnie(a także min. i max dla danej temperatury) oporu dla danej temperatury(od -55 do 140 stopni Celsjusza). Po lekturze od razu nasuwa się na myśl stwierdzenie iż pomiar nie będzie zbyt dokładny. Ponieważ punktów nie ma za wiele, są one uśrednione a sama charakterystyka nieliniowa. Niemniej często nie interesuje nas pomiar dokładny do np. 0.5 stopnia. Często dokładność 2-4 stopni w zupełności wystarcza (np. temperatura gazów wylotowych z kotła parowego). Przejdźmy dalej, mamy punkty i co dalej? Najlepiej by było mieć funkcję której parametrem wejściowym jest właśnie opór. Generalnie pokażę tu trzy sposoby aproksymacji liniowa, logarytmiczna i wielomianem(czwartego stopnia, http://pl.wikipedia.org/wiki/Wielomian ). Pierwsze dwie można bez problemu uzyskać np. w arkuszu kalkulacyjnym. W calc po prostu robimy dwie kolumny jedna to temperatura druga opór. Wykreślamy wykres w funkcji oporu. Następnie klikamy na wykres, wybieramy wstaw i krzywe regresji. Pojawi się krzywa regresji wraz ze wzorem. Co do trzeciego punktu. Wystarczy skorzystać z scialb/octave. Użyjemy polecenia polyfit(x,y,n); x- opór, y-temperatura, n-rząd wielomianu(polyfit(x,y,4)). Zostanie zwrócona tablica z poszczególnymi parametrami wielomianu. Wykres dla danych z noty katalogowej wygląda następująco(niebieski to wykres wprost z dokumentacji).

Rys. 2 Wartości aproksymacji
Rys. 2 Wartości aproksymacji

Generalnie widać że wielomian spisuje się najlepiej. Dlatego przy późniejszym porównaniu na żywo to on będzie odniesieniem(miał nim być termometr 18b20 ale mi zaginął ;) ). Tak otrzymane funkcje wbijamy do mikroprocesora. Generalnie operacje float zarzynają 8-bitowce ale my tylko się bawimy :) Potęgowanie zrobiłem na mnożeniu bo miałem problemy z funkcją pow(). Wyniki wysyłamy portem RS232 do PC.

Wyniki

Podgrzałem trochę lampką i ręką termometr także zakres jest wąski ale widać pewne efekty już.

Rys. 3 Wyniki pomiarów
Rys. 3 Wyniki pomiarów

Wyniki mówią same za siebie logarytm jest trochę lepszy niż funkcja liniowa i zawyża on nieco wartość. Co do kodu. Generalnie jest on bardzo prosty(opisy w komentarzach). Można go napisać dużo krócej ale nadłożyłem drogi dla porządku. Przytaczam tylko fragment dla wielomianu, dla pozostałych jest on identyczny różni się tylko funkcją. Cały kod i arkusz w ods w archiwum. Kod+Arkusz

bEEstEqf

[code=C] results=ReadADC(0); //Dane z ADC wynik=results*lbg; //Napięcie na dzielniku wynik=(4.75*4650)/wynik - 4650; //Opór //WIELOMIAN voltage=wynik; // wynik=3.35*0.000000001*wynik*wynik*wynik-3.2*0.00001*wynik*wynik+1.51*0.1*wynik-175; wielomian 3-stopnia wynik=6.8940*0.0000000000001*(wynik*wynik*wynik*wynik)-3.8450*0.000000001*(wynik*wynik*wynik)-5.6192*0.000001*(wynik*wynik)+1.1127*0.1*wynik-154.89; d1=wynik; // Część po lewej stronie przecinka, rzutowanie, np. wynik=400.12 czyli d1=400 partial=wynik-d1; // część po prawej stronie przecinka np. wynik=400.12 czyli partial=400.12-400=0.12 d2=trunc(10*partial); //zaokrąglanie lenght=sprintf(str1, "%d.%d ;",d1,d2); //wpisywanie do tablicy znaków for(;x

W następnej części pokombinujemy jak w prosty sposób wykorzystać ten pomiar i dodatkowo skorzystamy z Labview aby symulować prosty układ automatyki.

bEEstErb