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

[C]odczyt wskazania czujnika temperatury

duszynski 27 Maj 2010 20:49 5533 31
  • #1 8124510
    duszynski
    Poziom 10  
    Witam,

    próbuję odczytać z czujnika wskazanie temperatury. Robię to w ten sposób, że podpinam czujnik do wejścia ADC0, pod napięcie referencyjne podpinam bezpośrednio VCC, w moim przypadku 5V, wszystkie rejestry ustawiam zgodnie z datasheetem. Odczytuję wartość rejestru ADCH i wystawiam na port D, pod którego nóżki mam podłączone diody.

    Kod programu:
    
    /* "led.c" - programik do testowania środowiska WinAVR */
    /* układ ATmega 1MHz */
    
    #define F_CPU 1000000L
    #include <avr/io.h>
    #include <util/delay.h>  
    #include <avr/io.h>
    
    #define PORT_AD PORTC		// Port z wejściami analogowymi	
    #define DDR_AD DDRC			
    #define PORT_OUT PORTD		// Port do którego przyłączone są diody LED
    #define DDR_OUT DDRD
    
    // inicjalizacja portow i przetwornika
    void init()
    {
    	// Wybranie wewnętrznego żródła napięcia odniesienia	
    	//ADMUX |= _BV(REFS0);		
    	//ADMUX |= _BV(REFS1);
    	//	Wybranie sposobu zapisu wyniku z wyrównaniem do lewej (osiem starszych bitów wyniku w rejestrze ADCH)	
    	//ADMUX |= _BV(ADLAR);		
    	// Zezwolenie na prace przetwornika	
    	ADCSRA |= _BV(ADEN);	
    	// Wybranie częstotliwości dla taktowania przetwornika   
    	ADCSRA |= _BV(ADPS0);	 
    	ADCSRA |= _BV(ADPS1);	
    }
      
    
    int main(void)
    {
    	unsigned int pomiar;
    	
    	// zainicjowanie rejestrow i przetwornika
    	init();
    	
        while (1) 
        {
    		ADCSRA |= _BV(ADSC);     		    // Rozpoczęcie przetwarzania
    		while(bit_is_set(ADCSRA,ADSC)){};	 // Oczekiwanie na zakończenie przetwarzania
    		
    		// Zapisanie starszych 8 bitów wyniku konwersji do zmiennej "pomiar" 
    		pomiar=ADCH;
    		PORT_OUT = (pomiar*1024)/5;
        }
    }
    


    Mój problem jest taki, że te diody świecą po włączeniu bardzo słabiutkim światełkiem i zdaje się, że czujnik nie działa poprawnie, gdyż nawet jak go wypnę to diody dalej świecą. Ciekawym zjawiskiem jest, że niektóre diody przestają świecić lub świecą jeszcze słabiej jeśli zbliżam dłoń kabelka, sądzę że wynika to po prostu z tego, że ludzkie ciało też ma swoje napięcie i mikrokontroler odczytuje jakieś śmieci. Gdy odsunę rękę a kabelek wisi w powietrzu to diody po chwili gasną. Proszę o jakieś porady bo już trochę czasu na tym spędziłem i bez efektów, jestem początkujący w zabawach w mikrokontrolerami tak więc proszę o wyrozumiałość :)
  • #2 8124608
    mirekk36
    Poziom 42  
    Po pierwsze, to słyszałeś o czymś takim jak ustawianie kierunku portów ???? chyba nie - bo podłączyłeś diody zdaje się do portu D ale w kodzie w ogóle nie ustawiasz go jako wyjście - więc pierwszy ZONK

    kolejna sprawa - skoro ustawiasz ADALR na 1 to oznacza, że chcesz odczytywać wynik w postaci 8-bitowej właśnie z rejestru ADCH, to:

    - dlaczego deklarujesz zmienną pomiar jako unsigned int ???? zamiast np uint8_t - musisz poczytać o typach torszkę w C

    - dlaczego robisz takie salto-mortale ??????????
    PORT_OUT = (pomiar*1024)/5
    - co to ma być ?????? ;) tu już totalny misz-masz


    No a na zakończenie MEGA ZONK - skoro ustawiasz wewnętrzne źródło odniesienia (choinka wie jakie bo nie napisałeś jaki procek, no ale nie ważne) to po gwinta kolega podłącza VCC do nogi AREF. Może warto sobie zajrzeć do noty PDF hmmmm? Wejścia AREF używaj TYLKO WTEDY gdy chcesz jakieś nietypowe napięcie odniesienia pomiędzy 1,1 a 5V albo pomiędzy 2,56 a 5V

    W innym przypadku masz w nocie JASNO JAK DRUT OPISANE znaczenie bitów REFSx - toż za ich pomocą możesz włączyć napięcie odniesienia VCC BEZ ŻADNEGO PDOŁĄCZANIA VCC DO PINU AREF !!! zatem to co zrobiłeś jest totalnie bez sensu - bo wybrałeś wewn, źródło odniesienia np 2,56V i pojawiło się takie napięcie na linii AREF a ty DAWAJ!!!! podłączyłeś do tego VCC -no i masz jazdę bez trzymanki ;) zwarcie itp

    zapamiętaj sobie raz na zawsze, że jeśli nie wiesz do końca co zrobić z AREF to podłącza tam tylko kondensator ceramiczny 100nF do GND i to wszystko. A jeśli chcesz wewn źródło odniesienia to REFS na ustaw na 11 albo na zdaje się 01 jesli napięciem odniesienia ma być VCC. Ale nie do AREF tylko kondek.

    Jak poprawisz te wszystkie ZONKI to qw końcu wszystko ci ładnie ruszy - gwarantuję
  • #3 8124782
    duszynski
    Poziom 10  
    Poprawiłem zonki :)

    Odnoście wyboru napięcia referencyjnego to zauważ, że w moim kodzie jest ono zakomentowane, a domyślnie ma wartości zero, więc zewnętrzne źródło napięcia.

    Niestety układ dalej nie chce mi poprawnie działać, już nie świecą się wszystkie diody tylko część, ale nawet jak wyjmę czujnik z układu to wszystko pozostaje bez zmian i dalej świecą. Używam atmegi8, ustawiłem teraz wewnętrzne źródło zasilania, podpiąłem kondensator między AREF i GND.
  • #4 8125177
    mirekk36
    Poziom 42  
    duszynski napisał:
    ..., ustawiłem teraz wewnętrzne źródło zasilania, ...


    Żródło odniesienia a nie zasilania.

    Ale ok, może i nie zauważyłem , że masz zakomentowane REFSx ale jeszcze raz przypomnę wyraźnie, że jeśli już chcesz mieć źródło odniesienia w postaci VCC to nie musisz podłączać VCC do AREF. Po co? Skoro można to wybrać ustawieniem właśnie bitów REFSx - rozumiesz ???? Czyli bitami REFX wybierasz albo wewnętrzne źródło odniesienia 2,56V albo VCC a wtedy zawsze 100nF pomiędzy AREF a GND. Dopiero gdy tak jak miałeś REFSx na 00 to można podłączać zewn źródło no ale inne niż VCC lub wewn. np 2,56V.

    Kto wie czy przez przypadek za którymś razem gdy miałeś podłączone VCC do AREF nie włączyłeś jednak wewn. źródła 2,56 i tym samym coś się w środku nie sfajczyło ???

    dobra tyle ględzenia o REFSx'ach ;)

    dalej

    pokaż teraz kod jaki masz? żeby zobaczyć czy nie ma kolejnych może zoneczków no i jak rozwiązałeś ten swój misz-masz ???? bo zrozumiałbym, ze wyprowadzasz na PORT_OUT bezpośrednio wartość ADCH i obserwujesz jak to się zwiększa lub zmniejsza binarnie. Bo to obliczenie, które zrobiłeś było niestety kosmicznym nieporozumieniem - napisz co chciałeś uzyskać tym obliczeniem, oraz co tak na prawdę chcesz uzyskać na wyjściu portu???

    Tak podejrzewam, że chciałbyś mieć na wyjściu portu taką jakby ładną linijkę diodową, która zapala po kolei diody wraz ze wzrostem napięcia czyli wartości w ADCH od 0 do 255. No ale to trzeba sobie po prostu inaczej przeliczyć.

    Proponuję ci, jeśli to twoje pierwsze próby z ADC podłącz sobie jakiś LCD i wyświetlaj żywe wartości - łatwiej będzie ci zrozumieć bo będziesz miał mniej miejsc na ZONKI - jak w tym przeliczaniu binarnej wartości ADCH na liniową skalę od 1 do 8
  • #5 8128617
    duszynski
    Poziom 10  
    Kod:

    #define F_CPU 1000000L
    #include <avr/io.h>
    #include <util/delay.h>  
    #include <avr/io.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #define PORT_AD PORTC		// Port z wejściami analogowymi	
    #define DDR_AD DDRC			
    #define PORT_OUT PORTD		// Port do którego przyłączone są diody LED
    #define DDR_OUT DDRD
    
    // inicjalizacja portow i przetwornika
    void init()
    {
    	// Wybranie wewnętrznego żródła napięcia odniesienia	
    	ADMUX |= _BV(REFS0);		
    	ADMUX |= _BV(REFS1);
    	//	Wybranie sposobu zapisu wyniku z wyrównaniem do lewej (osiem starszych bitów wyniku w rejestrze ADCH)	
    	//ADMUX |= _BV(ADLAR);		
    	// Zezwolenie na prace przetwornika	
    	ADCSRA |= _BV(ADEN);	
    	// Wybranie częstotliwości dla taktowania przetwornika   
    	ADCSRA |= _BV(ADPS0);	 
    	ADCSRA |= _BV(ADPS1);	
    	
    	DDR_AD=0x00;		// Port jako wejścia
    	PORT_AD=0x00;		// Wejścia bez podciągania
    	DDR_OUT=0xFF;		// Port jako wyjścia 
    	PORT_OUT=0xFF;		// Wyjścia w stanie wysokim
    }
      
    
    int main(void)
    {
    	uint8_t pomiar;
    	
    	// zainicjowanie rejestrow i przetwornika
    	init();
    	
        while (1) 
        {
    		ADCSRA |= _BV(ADSC);     		    // Rozpoczęcie przetwarzania
    		while(bit_is_set(ADCSRA,ADSC)){};	 // Oczekiwanie na zakończenie przetwarzania
    		
    		// Zapisanie starszych 8 bitów wyniku konwersji do zmiennej "pomiar" 
    		pomiar=ADCH;
    		PORT_OUT = pomiar;
        }
    }
    


    Ustawiłem wewnętrzne źródło odniesienia napięcia i podłączyłem AREF do GND przed kondensator 100nF. Efekt jest taki, że jak mam podłączony czujnik z jednej strony do pinu PC0, a z drugiej do masy to żadna z diod się nie świeci, jeśli odłączę czujnik z układu to zapalają się diody podłączone pod PD0 i PD1. Z tym wzorem to gdzieś po prostu w necie wyczytałem, że trzeba pomiar przepuścić przez taki wzór, żeby to poprawnie zrzutować, chociaż sam już nie pamiętam dlaczego tak miało być. Czujnika raczej nie spaliłem bo jak podłącze inny, który jest sprawny to zachowanie układu jest takie samo.
  • #6 8128685
    mirekk36
    Poziom 42  
    To, ty sobie na razie zamiast czujnika podłącz suwak potencjometru , który będzie podłączony pomiędzy GND a VCC i przede wszystkim sprawdzisz czy działa sam przetwornik gdy będziesz nim kręcił w połowie zakresu pomiędzy GND a VCC - bo napięcie na suwaku będzie mierzone tylko do 2,56V - o ile takie ustawiłeś. (bo jak na razie to nie raczyłeś napisać na jakim procku działasz i jakie masz to wewn. napięcie odniesienia - więc tylko zgaduję, że to 2,56V. A może masz np ATmega88 i tam jest 1,1V wtedy potencjometr w o wiele mniejszym zakresie będzie regulował to co ma się wyświetlać na diodach led. (no przecież trzeba umieć sobie jakoś radzić i dzielić zadanie na mniejsze kroczki, które można sprawdzać po kolei)

    Poza tym skoro teraz odczytujesz tylko ADCH to dlaczego masz zakomentowane ustawienie bitu ADLAR ?????
  • #7 8128728
    duszynski
    Poziom 10  
    Faktycznie zapomniałem napisać, używam Atmegi8, wewnętrzne napięcie odniesienia wynosi 2,56V. Ustawienie bitu miałem odkomentowane, tylko się bawiłem z różnymi kombinacjami i akurat tutaj wkleiłem taki kod. W takim razie muszę zdobyć potencjometr..
  • #8 8128735
    mirekk36
    Poziom 42  
    No to z prockiem się wyjaśniło. A zabawę z ADC zawsze zaczyna się od najprostszych testów z potencjometrem, żeby zrozumieć co i jak. Potem można zabierać się, ża inne pomiary napięć w tym z czujników.
  • #9 8130122
    duszynski
    Poziom 10  
    Kupiłem dzisiaj potencjometr obrotowy, podłączyłem pod układ i wszytko ładnie działa, tak więc nie wiem sam, wniosek z tego taki, że mój czujnik temperatury nie działa poprawnie?
  • #10 8130889
    janbernat
    Poziom 38  
    A jaki to czujnik temperatury?
  • #11 8131116
    duszynski
    Poziom 10  
    No właśnie sam nie wiem, jest na nim napisane

    
    81 120
    W 61
    


    Próbowałem już szukać w jakiś katalogach, ale bez skutku, kosztował 1,5zł, więc to zapewne jakiś totalnie standardowy.
  • #12 8132381
    acid12
    Poziom 21  
    zrób zdjęcie i pokaż :)
  • #13 8132879
    duszynski
    Poziom 10  
    Lepszej jakości uzyskać nie mogłem :)

    [C]odczyt wskazania czujnika temperatury
  • #15 8133541
    duszynski
    Poziom 10  
    Tak to jest właśnie KTY81-120. Ja przez niego przepuszczałem prąd bezpośrednio z usb, czyli 0,5A. To znaczy, że uległ spaleniu czy może działać i mam go podłączyć przez rezystory?
  • #16 8133702
    acid12
    Poziom 21  
    zdecydowanie trudno powiedziec co sie znim stalo :) ale raczej nic dobrego.

    ten 1mA bierze sie stąd, że tj czujnik rezystancyjny, im większy prąd tym bardziej czujnik się grzeje tym większy błąd wskazań.

    EDIT: musisz mieć jakiś układ który trzyma stały prąd, wtedy będziesz miał dobry odczyt. W nocie masz wykresy jak wynik sie zmienia juz przy zmianie prądu 1mA -> 2mA, a co dopiero 5mA :D:D:D
  • #18 8133950
    acid12
    Poziom 21  
    dlatego napisałem "zmianie prądu 1mA -> 2mA, a co dopiero 5mA"
    domysliłem się, że autorowi chodziło o to, że USB ma wydajność 0,5A ... po prostu nie chciałem krytykować aż tak :)

    ważne jest to, że czujnik został źle podłączony
  • #19 8134532
    janbernat
    Poziom 38  
    Czujnik można zmierzyć omomierzem.
    Jak ma 1kOhm to w porządku.
    Zasilać go ze źródła prądowego na tranzystorze PNP.
  • #20 8510075
    duszynski
    Poziom 10  
    Witam, odgrzebuję temat bo wracam do zabawy z tym czujnikiem i znowu mam problem żeby go podłączyć.

    Włączam czujnik szeregowo do obwodu, przed czujnikiem mam wpięty potencjometr do którego jest podłączone zasilanie 5V, dalej podłączony jest czujnik, którego druga nóżka jest wpięta do ADC0 Atmegi8 tak żeby można było odczytywać pomiar oraz podpięta do GND Atmegi8. ADC działa poprawnie bo bawiłem się wcześniej potencjometrem tak jak poleciliście i wszystko było ok, czujnik też jest w porządku bo gdy zmieniam temperaturę w jego bliskim otoczeniu to na woltomierzu zmienia się napięcie, tylko odczyt na ADC jest cały czas 0. Zapewne źle podłączam czujnik i stąd wynika problem..

    Czujnik to KTY81-120

    edit: Kod programu jest taki jak powyżej. Czy to zasilanie ze źródła prądowego, o którym pisał janbernat jest konieczne czy można to zrobić mniej więcej tak jak ja to robię. Dodam, że nie zależy mi na super dokładności pomiaru.
  • #21 8510412
    gdL
    Poziom 27  
    Zrób dzielnik napięcia w/g rysunku, w miejsce któregoś rezystora wepnij czujnik, wyjście z dzielnika podłącz pod zdefiniowany ADC i napisz odpowiednią funkcję obsługującą, posługując się charakterystyką temp/rezystancja czujnika.

    [C]odczyt wskazania czujnika temperatury

    Rezystancje w dzielniku dobierz tak, żeby osiągane "zaprojektowane na najgorszy przypadek" napięcia były niższe od AREF.

    EDIT: Swoją drogą, czy ktoś próbował praktykować podłączenie takiego czujnika temp równolegle z kondensatorkiem i podpięcie do NIE-ADC-portu procesora ? Najpierw toto naładować (noga-OUT,stan:1), następnie jako wejście (bez pullup'a). Zmierzona ilość cykli zanim stan nogi przejdzie z 1, w 0, powinna korespondować z temperaturą w/g znanej funkcji temp/rezystancja.
  • #22 8510585
    janbernat
    Poziom 38  
    Coś takiego było opisane w w którymś z kursów Bascoma albo i w samplach.
    Podłączone do komparatora w procesorze- ale kondensator w szereg z opornikiem.
    Pomiar stałej RC.
    Znalazłem.
    Gotowa procedura.
    Nazywa się Getrc.
    Opornik 10k i kondensator 100n
  • #23 8510629
    gdL
    Poziom 27  
    Bo wiem, że w przypadku uzycia diody LED jako sensora, można sprawdzać jak szybko rozładowuje się wewnętrzna pojemność. Zdaje się, to szło tak, że po wcześniejszym zapaleniu (naładowanie), przy padaniu kwantów promieniowania na złącze, dioda zaczynała przewodzić i rozładowywała wewnętrzną pojemność. Po jakimś czasie poziom logiczny wejścia uC zmieniał się z 1 na 0 i stała czasowa była zależna od jasności. Przy tym trzeba było jednak badać tło. Jest to o tyle problematyczne, bo idea piękna.

    Temat tutaj : https://www.elektroda.pl/rtvforum/topic1286103.html

    Wydaje mi się, że ten czujnik można "podobnie" potraktować dokładając kondensatorek. Można połączyć czujnik z z kondensatorem w szereg rzeczywiście, jak mój przedpisca wspomniał. Tak jest nawet lepiej. To by nawet udawało schemat elektryczny diody w pewien sposób, z tym, że niezależny od światła.
  • #24 8535102
    duszynski
    Poziom 10  
    Już teraz wszystko działa jednak nie do końca poprawnie. Otóż zrobiłem dzielnik napięcia tak jak napisaliście i całość zasiliłem ze źródła prądowego. Kupiłem LM317 i zrobiłem aplikację jak na figure 4 w podanym datasheet-cie - http://focus.ti.com/lit/ds/symlink/lm317.pdf .

    Problem mój polega na tym, że czujnik nie daje dobrych rezultatów. Przez czujnik powinien przechodzić 1mA aby ładnie wyniki można było odczytywać, a wyczytałem że LM317 nie generuje tak małych prądów.

    Z drugiej jednak strony zmierzyłem sobie napięcie na rezystorze w dzielniku i rezystancje (na oporniku odpiętym z układu) i wyszło mi, że prąd płynący wynosi 0,79mA, więc powinno być w miarę OK. W temperaturze pokojowej wskazania są dobre, jednak na przykład gdy powinien wskazywać około 60 stopni to czujnik wskazuje tylko około 40 stopni.

    Nie jestem też przekonany czy do końca dobrze zrobiłem to źródło prądowe, ponieważ opierałem się podanym w datasheecie wzorze - I = 1.2 / R1, ale coś nie do końca oczekiwany generowany prąd pokrywa się z tym wyliczonym ze wzoru przy użytej rezystancji.[/tex]
  • #25 8536522
    gdL
    Poziom 27  
    Zapomnij o tym źródle prądowym na początek. Po prostu podłącz ten dzielnik pod vcc, adc i gnd :) Chciałeś to zrobić tak, że stabilizator LM działa jak źródło prądowe o prądzie zależnym od oporności czujnika, a rezystor pomiarowy daje Ci spadek napięcia ? Czy mierzysz po prostu napięcie na czujniku, bo w tej aplikacji napięcie ~ rezystancja (I = U/R, a wiemy, że I=const.) ? Jeśli rzeczywiście źródło prądowe działa, powinno być OK.
  • #26 8548285
    duszynski
    Poziom 10  
    Wstawiłem osobny rezystor do tego układu, który jest na figure 4 w podanym linku narysowany i prąd dopiero po przejściu przez ten układ wchodzi do dzielnika napięcia. Sądziłem, że powinno być w miarę ok jeśli użyję tego wzoru, ale później wyczytałem, że tym źródłem prądowym nie osiągnę tak małych prądów, więc w sumie to jest trochę dziwne, że mam prąd poniżej 1mA i nie wiem do końca skąd to się bierze.

    Temperaturę mierzę już na samym czujniku, odczytuję napięcie, prąd mam ustalony, więc obliczam sobie rezystancję i skaluję wynik (wykładniczo) bo przy wyższych temperaturach nie pokrywa on się z rzeczywistością. Przy temperaturze do około 30 stopni jest w miarę ok.

    I jeszcze jedno pytanie, gdyż chcę do układu wpiąć diodę, ale gdy + podpinam pod wyjście mikrokontrolera, a - pod gnd to gdy dioda świeci mam inny spadek napięcia na czujniku niż gdy nie świeci. Muszę jakąś osobą masę mieć czy w jaki sposób mogę to rozwiązać?
  • Pomocny post
    #27 8553567
    janbernat
    Poziom 38  
    [C]odczyt wskazania czujnika temperatury
    Zrób sobie układ z takim źródłem prądowym.
    Nie jest to najwspanialsze źródło prądowe na świecie ale wystarczające do tego zadania.
    Zakładając rezystancję termistora na 1k w temp. pokojowej ustaw potencjometrem 1V na termistorze- to spowoduje przepływ prądu ok.1mA.
    Potencjomert może mieć od 1-47k.
    Ma to małe znaczenie.
    Rezystor w emiterze też od 500-1.2k.
    Sprawdzone, działa.
  • #28 8555434
    duszynski
    Poziom 10  
    Ok, spróbuję dzisiaj to zrobić. A jakaś podpowiedź odnośnie drugiego pytania?

    I jeszcze jedno pytanie, gdyż chcę do układu wpiąć diodę, ale gdy + podpinam pod wyjście mikrokontrolera, a - pod gnd to gdy dioda świeci mam inny spadek napięcia na czujniku niż gdy nie świeci. Muszę jakąś osobą masę mieć czy w jaki sposób mogę to rozwiązać?
  • #29 8555471
    gdL
    Poziom 27  
    Jaki masz spadek napięcia bez i z obciążeniem ? Konfiguracja dalej z LM'em ? Rezystancja czujnika przez zapalenie diody Ci się nie zmienia, więc zmienia się pewno prąd płynący przez czujnik. Być może masz mało wydajne źródło zasilania, albo ten układ z LM przy tak małych prądach jest niestabilny.
  • #30 8555653
    janbernat
    Poziom 38  
    Jak masz układ LM fig.4 z tego DS który podałeś to masz źródło prądowe a nie zasilacz o stabilizowanym napięciu.
    Zmontuj zasilacz w klasycznym układzie.
    Źródło prądowe podałem Ci wyżej- tranzystor PNP.
REKLAMA