logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATmega32][C/AVR Studio 5] Termometr na LM335

02 Gru 2011 23:53 6572 42
  • #1 10211742
    Konto nie istnieje
    Poziom 1  
  • #2 10211866
    kiziu13
    Poziom 17  
    Jakbyś poszukał, to byś się dowiedział, że ten czujnik traktuje się jak diodę Zenera, której napięcie Zenera jest liniowo zależne od temperatury, toteż V- wpinasz do GND, V+ idzie przez opór na Vcc i dodatkowo na tej nodze mierzysz napięcie przez ADC. Stopień Celsjusza to to samo co kelwin, jedynie punkt odniesienia jest inny, dla skali Kelwina to zero bezwzględne, a w tym właśnie punkcie jest 0V na LMie.
  • #3 10212106
    Konto nie istnieje
    Poziom 1  
  • #4 10213376
    kiziu13
    Poziom 17  
    Nie no, bez przesady. Wiemy, że LM ma skale liniową 10mV/K przy czym dla napięcia 0V jest 0K, czyli 273.15*C, co daje, że dla temperatury 0*C napięcie na V+ będzie równe 273,15*10mV=2,7315V. Przyjmijmy, że Vref dla ADC to AVcc równe 5.12V (dla łatwości obliczeń), co daje, że przy odczycie z ADC o rozdzielczości 10 bitów zmiana na LSB obrazuje zmianę napięcia o 5mV. Z tego wiemy, że odczyt o wartości 546 da napięcie równe 2.73V, i taki właśnie odczyt winien być dla temperatury równej 0*C. Jak dokładnie powinien wyglądać wzór do obliczenia pozostawiam Tobie do odkrycia. Przypominam, że obliczenia na floatach nie są zalecane, więc lepiej operować na słowach/podwójnych słowach i używać arytmetyki stałoprzecinkowej, aby nie stracić za dużo informacji.
  • #5 10213447
    Konto nie istnieje
    Poziom 1  
  • #6 10213527
    kiziu13
    Poziom 17  
    Pokaż taki schemat bo coś mieszasz. Jak pisałem, LM to "dioda Zenera", której napięcie przebicia zależne jest od temperatury, toteż V-, czyli anoda diody, jest na masie. Odpowiednie napięcie odkłada się na diodzie, a resztę opornik zamienia na ciepło. Jak działa dioda Zenera, to możesz znaleźć u wujka Gugla. Do V+ Vcc nie dochodzi bezpośrednio, tylko przez rezystor.
  • #7 10213602
    Konto nie istnieje
    Poziom 1  
  • #8 10213655
    kiziu13
    Poziom 17  
    W tym PDFie http://www.national.com/ds/LM/LM135.pdf widać jak byk, że pomiaru dokonuje się na katodzie, rysunek Basic temperature sensor, zaś na rysunku Calibrated sensor widać, że ADJ jest podłączone do środkowego wyprowadzenia potencjometru.
    Właśnie chodzi o to, że z analogówki nie trzeba właściwie wiele widzieć. Wychodzę z założenia, że lepiej dać wędkę niż rybę, ale ok. Założenia z poprzednich postów nadal obowiązują (LSB - 5mV). Przy odczycie 546 będzie 0*C, toteż, jeśli odczyt będzie równy, powiedzmy, 596, to od tej wartości odejmuję wartość 0*C, czyli 596-546=50, a następnie dzielę przez dwa (bo mamy pomiar co 5mV), co daje 50/2=25, i to jest temperatura. Ewentualnie można przeliczyć odczyt na napięcie i mieć temperaturę w skali Kelwina i od niej odjąć temperaturę zera bezwzględnego, czyli 596*Vref/1024=Vt, T=Vt*100-273,15. Przypominam o arytmetyce stałoprzecinkowej, zwłaszcza, że tu więcej niż jedno miejsca po przecinku nie jest potrzebne.

    EDIT: Przemyśl jak działa ADC, to dojdziesz skąd jest wzięte 5mV dla danych, które podałem. 546 to teoretyczna wartość obliczona na podstawie danych, które założyłem.
  • #9 10213671
    Konto nie istnieje
    Poziom 1  
  • #10 10213696
    kiziu13
    Poziom 17  
    Widzę, że opornie podchodzisz do szukania...
    1. Skoro napięciem odniesienia dla ADC jest napięcie 5.12V, a przetwornik jest 10 bitowy, to dzieli to napięcie na 1024 wartości, przy czym 0V - 0, a 5.12V to 1023. Z prostej proporcji wynika, że 1 to 5mV, stąd wzięło się, że zmiana na LSB to zmiana napięcia mierzonego o 5mV.
    2. Skoro 1 to 5mV, to odczyt 546 równa się 2.73V na wejściu. LM335 ma 0V dla zera bezwzględnego, czyli -273.15*C, i wzrost 10mV na każdy stopień, czyli dla 0*C będzie miał napięcie 2.73V (jeśli ma większa rozdzielczość to może być dokładniej, np. 2.7315V).
    3. 596 to wartość przykładowa, a odejmuję 0*C, to po prostu znaczy odjąć wartość 0*C w postaci cyfrowej, czyli właśnie 546.
  • #11 10213945
    Konto nie istnieje
    Poziom 1  
  • #12 10214007
    kiziu13
    Poziom 17  
    Warto wspomnieć, że odczytujesz tylko ADCH, a co z ADCL? Sprawdź odczyt samego ADC, bez konwersji. Na pewno dobrze podłączyłeś i używasz właściwego kanału ADC (konfiguracje ADC tylko pobieżnie sprawdzałem, bo właściwie nie o tym temat, toteż zakładam, że jest OK)? Jakie jest Vcc układu? Najlepiej pokaż jakiś schemacik.
  • #13 10214022
    Konto nie istnieje
    Poziom 1  
  • #14 10214056
    kiziu13
    Poziom 17  
    Jeden to jeden, czyli 0x01. Nic dziwnego, że tyle jest, skoro ADCH zawiera tylko 2 najstarsze bity z 10, pozostałe 8 jest w ADCL. Swoją drogą, to i tak jest mało, winno być 2, bo wtedy jest to więcej niż 512.

    Wzór się nie przyda, bo to jest na napięcie, a na razie masz sam problem z ADC. Skoro masz inne napięcie odniesienia, to wartość LSB należy wyliczyć wcześniej, a nie korzystać z przyjętej dla innego Vref.
  • #15 10214100
    Konto nie istnieje
    Poziom 1  
  • #16 10214171
    kiziu13
    Poziom 17  
    Jeśli masz zamiar używać ADC w trybie free-running to proponuję przerzucić się na przerwania. Pewnie masz źle skonfigurowaną bibliotekę.
  • #17 10214176
    Konto nie istnieje
    Poziom 1  
  • #18 10214183
    kiziu13
    Poziom 17  
    Zamiast czytać ciągle w pętli wartość, włącz przerwanie od ADC, napisz jego obsługę ustawiającą flagę, którą dopiero będziesz sprawdzać w głównej pętli i czytać wartość ADC i przetwarzać/wyświetlać.
  • #19 10214195
    Konto nie istnieje
    Poziom 1  
  • #20 10214222
    kiziu13
    Poziom 17  
    To dotyczy ogólnie odczytu z ADC w trybie free-running. Nie traci się wtedy czasu procesora na czekanie do zakończenia konwersji, tylko obsługuje już zakończoną. Problem tylko później zostaje, że LCD może być zbyt szybko odświeżany i będzie smużyć.
  • #21 10214248
    Konto nie istnieje
    Poziom 1  
  • #22 10214290
    Brutus_gsm
    Poziom 25  
    Bit ADSC włącza tryb pojedyńczej konwersji. Bit ADATE - tryb konwersji ciągłej. Nie wydaje mi się, żeby można je było ustawiać jednocześnie...
  • #23 10214317
    Konto nie istnieje
    Poziom 1  
  • #24 10214344
    Brutus_gsm
    Poziom 25  
    Ustaw jeszcze bit ADLAR w rejestrze ADMUX. Wyrówna on ci wynik do lewej. Bo odczytujesz tylko ADCH. Spróbuj też wyświetlić wynik pomiaru bezpośrednio na wyświetlaczu. Bez żadnych konwersji i sprawdź, czy to działa.

    Zresztą - lepiej odczytuj całą 16 bitową wartość, a nie tylko jej część.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #25 10214372
    Konto nie istnieje
    Poziom 1  
  • #26 10214444
    Brutus_gsm
    Poziom 25  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Sprawdź, czy wynik będzie reagował na zmianę temperatury.

    Dodatkowo zdecyduj się do którego wejścia masz podłączony LM, bo maglujesz bitami MUX i już nie wiadomo, czy nie używasz niepodłączonego wejścia.
  • #27 10214475
    Konto nie istnieje
    Poziom 1  
  • #28 10214496
    Brutus_gsm
    Poziom 25  
    Może zacznijmy od początku. Pokaż schemat podłączenia układu do procesora. Nie opisuj, tylko narysuj jak masz to zrobione. Które wejście i jak? Potem napiszemy program, który to obsłuży.

    Aktualizowałem wcześniejszy kod. Teraz powinna się wyświetlać liczba całkowita. Jeśli chcesz sprawdzić, czy ADC działa poprawnie, podłącz tam potencjometr (pomiędzy masę i VCC, środkowe wyprowadzenie na pin ADC0). Powinny wyświetlać się wartości od 0-1023, oczywiście w zależności od ustawienia potencjometru.
  • #29 10214549
    Konto nie istnieje
    Poziom 1  
  • #30 10214577
    Brutus_gsm
    Poziom 25  
    Źle podłączasz ten czujnik do mikrokontrolera. Wyjście ADJ ma być podłączone do pinu ADC0. VCC do zasilacznia, GND wiadomo. Dodatkowo korzystając z napięcia odniesienia VCC (ustawiony bit REFS0) pin AREF (uK) musi być podłączony przez kondensator do masy.
REKLAMA