Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[atmega8][C] - Pomiar temperatury KTY 81-210

butcherfl 19 Gru 2012 12:24 11337 24
  • #1 19 Gru 2012 12:24
    butcherfl
    Poziom 11  

    Siemanko,
    Potrzebuje pomocy przy prostym układzie do mierzenia temperatury.
    Chciałbym go wykonać z części, które mam w posiadaniu, dlatego też chciałbym użyć czujnika KTY 81-210.
    Z tego co wyczytałem powinienem mierzyć jego rezystancje na ADC, z programem nie powinno być problemu (jeśli będzie to napiszę), ale chodzi mi o schemat podłączenia (KTY-Mega8(lub16)-7segment) oczywiście z wyswietlaczem jestem w stanie sobie poradzić sam, ale co do KTY nie jestem pewny, bo to nie może być takie proste żeby podłączyć bezpośrednio (wiem o ekranie).
    Pozdrawiam

    0 24
  • #2 01 Sty 2013 20:21
    928879
    Użytkownik usunął konto  
  • #3 03 Sty 2013 19:38
    butcherfl
    Poziom 11  

    W dniu w którym napisałeś posta rozwiązałem to w ten sam sposób. Tylko na przetworniku 8 bit nie za bardzo mogę uzyskać dokładności 1 stopnia więc następnym krokiem jest zmiana na 10 bit.
    Czy u Ciebie to wygląda podobnie?
    [atmega8][C] - Pomiar temperatury KTY 81-210 [atmega8][C] - Pomiar temperatury KTY 81-210
    W schemacie oczywiscie brak filtracji, która jest KONIECZNA ale chodiło mi tylko o zasadę
    D1 to KTY
    C1 to rezystor (980)

    0
  • #4 03 Sty 2013 20:40
    928879
    Użytkownik usunął konto  
  • #5 03 Sty 2013 20:46
    dondu
    Moderator Mikrokontrolery Projektowanie

    butcherfl napisał:
    W schemacie oczywiscie brak filtracji, która jest KONIECZNA ale chodiło mi tylko o zasadę

    OK, ja tylko dodam, że filtracja to tylko jeden z wielu aspektów wpływających na dokładność pomiarów więc nie zapomnij o pozostałych: http://mikrokontrolery.blogspot.com/2011/03/avr-adc-podlaczenie.html

    0
  • #6 03 Sty 2013 21:03
    928879
    Użytkownik usunął konto  
  • #7 04 Sty 2013 11:59
    butcherfl
    Poziom 11  

    piszecie o wew Vref 2,56 ale ono waha się od 2,2 do 2,7 (czy coś koło tego) czy po prostu przyjmuje daną wartość i jest stałe i stabilne - np. moja przyjmie 2,5 i taką będzie miała do końca swojego życia?
    Jeśli chodzi o rezystor 2k to myślalem o tym, ale po przeliczeniu dalej na 1 wartość przypadają 2 stopnie
    Wartości jest 200 (oczywiscie nie chce docelowo pełnego zakresu, ale niech już bedzie) a przy 8 bitach mamy 256 pozycji, proste by było zmieszczenie tego gdyby wartości zmieniały się liniowo a tak potrzeba przynajmniej 9 bit - przynajmniej się nauczę korzystania z oby2 rejestrów.
    Edit:
    Odnośnie jeszcze Vref jaka jest wg was najlepsza metoda (może jakiś dobry stabilizator)?

    0
  • #9 04 Sty 2013 12:28
    928879
    Użytkownik usunął konto  
  • #11 04 Sty 2013 20:57
    butcherfl
    Poziom 11  

    Treść kryjącą się pod tym linkiem przeczytałem już nieraz ostatnimi czasy, chciałem zapytać jeszcze was. Mariusz 2009 rzeczywiście wyeliminowanie z wartości równania Uref rozwiąże problem, czemu sam o tym nie pomyślałem.
    Z tego co wiem to przy czytaniu 10 bitów muszę przeczytać ADCL (pełny) i ADCH czy może jest jakaś metoda żeby wyczytać od razu?

    0
  • #12 05 Sty 2013 07:51
    928879
    Użytkownik usunął konto  
  • #13 05 Sty 2013 23:46
    butcherfl
    Poziom 11  

    dzięki chodziło mi tylko o tego while, co do wyliczeń to nie ma problemu, ale mam nadzieje że przyda się innym.
    Odezwę się co i jak kiedy przysiądę do tego.

    0
  • #14 06 Sty 2013 09:00
    928879
    Użytkownik usunął konto  
  • #15 07 Sty 2013 09:09
    butcherfl
    Poziom 11  

    Wszystko gra - mam zrobione u siebie niemal identycznie, tylko chyba zastosuje wzór uśredniony dla przedziałów załóżmy co 10st

    0
  • #16 13 Sty 2013 18:11
    butcherfl
    Poziom 11  

    Ma ktoś przykład wyświetlania wyniku ADC na wyświetlaczu 2x7segment, ja trochę teraz nie za bardzo mam wenę bo kiedy zająłem się wyświetlaniem 2 cyfr (bez timera jeszcze) to padło wyliczanie ADC. Jak nikt nie odpiszę to najwyżej jutro prześle swój kod i napiszecie co poprawić

    Moderowany przez _Robak_:

    3.1.17. Zabronione jest publikowanie wpisów obniżających ogólny poziom dyskusji, wynikających z lenistwa lub zawierających roszczeniowy charakter wypowiedzi.

    0
  • #17 15 Sty 2013 02:50
    butcherfl
    Poziom 11  

    No tak, już moderator, pisałem przecież że to na jeden dzień.
    Nieważne , trochę podłubałem, jednakże dalej jest mały problem.
    Czy przy przeczytaniu całego wyniku (10bit) wystarczyłoby takie coś?

    Code:
    wynik = ADCH*4 + ADCL;

    i czy to równa się z zapisem
    Code:
     wynik = (ADCH<<8) | ADCL;

    i dlaczego przy wyświetlaniu samego ADCL mam wynik 0, gdzie na ADCH to samo działa (wyrównanie do lewej jest).

    0
  • #18 15 Sty 2013 06:32
    928879
    Użytkownik usunął konto  
  • #19 15 Sty 2013 13:23
    butcherfl
    Poziom 11  

    Inkludy i zmienne

    Code:

    #include <avr/io.h>
    #include <avr/pgmspace.h>
    #include <util/delay.h>
    #define F_CPU 8000000UL

    uint8_t temp;
    uint16_t wynik;
    uint8_t x = 0;

    funkcja inicjująca ADC:
    Code:
    void adcInit()
    
    {
    ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (0 << ADPS0); // Preskaler 8MHZ/64 = 125KHz
    ADMUX |= (1 << REFS0) | (1 << REFS1) ; // Wewnetrzne Vref
    ADMUX |= (1 << ADLAR); //do lewej
    ADCSRA |= (0 << ADFR);
    //ADCSRA |= (1 << ADFR);  // ADC FreeRun
    ADCSRA |= (1 << ADSC);  // ADC Start Conversion
    ADCSRA |= (1 << ADEN); // Włącz ADC
    }

    funkcja licząca ADC:
    Code:

    uint16_t policzADC()
    {
    wynik = ADCL | (ADCH << 8);
    temp = (uint8_t)(wynik / 10);
    return  temp;
    }

    temp później jest wysyłane do funkcji wywalania na 2cyfrowy 7 segment na samym ADCH działa bez zarzutu (wynik zgodny do zależności temperatury) tylko, że wolałbym się nauczyć jak to połączyć z ADCL i przy okazji zwiększyć rozdzielczość

    0
  • #20 15 Sty 2013 13:27
    dondu
    Moderator Mikrokontrolery Projektowanie

    Dlaczego ignorujesz warningi (10 stopień piekiełka)?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Dodatkowo zamiast definiować F_CPU w kodzie definiuj w opcjach projektu: http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html

    Przy odczycie tylko ADCH można wyrównać do lewej za pomocą ADLAR i tak robiłeś.
    Teraz gdy odczytujesz ADCH, nie ma potrzeby wyrównywania do lewej.
    Zostaw wyrównanie do prawej i nie przesuwaj wyniku za pomocą <<
    Wynik odczytuj za pomocą rejestru ADC, a nie osobno ADCL i ADCH. Kompilator sam sobie radzi z odpowiednią kolejnością odczytu.

    No i zaglądnij do datasheet:

    [atmega8][C] - Pomiar temperatury KTY 81-210

    0
  • #21 15 Sty 2013 14:15
    butcherfl
    Poziom 11  

    Procek jest na 8MHz zdefiniowany w projekcie, w kodzie jest bo kompilator coś sapał kiedyś.
    co do odczytu z prawej z lewej to probowalem już różnych kombinacji.
    Natomiast teraz
    - Free Runing
    - Bez wyrównania do lewej
    - Z odczytem całego ADC
    mam wartości od 507-521 - więc na razie wszystko jest ok.
    Możliwe że próbowałem przedwczoraj tej kombinacji, tylko wtedy miałem skopaną sprawę
    z wyświetlaniem.
    Pewnie odezwę się jeszcze.

    0
  • #22 15 Sty 2013 14:37
    dondu
    Moderator Mikrokontrolery Projektowanie

    butcherfl napisał:
    Procek jest na 8MHz zdefiniowany w projekcie, w kodzie jest bo kompilator coś sapał kiedyś.

    Nigdy nie definiuj w dwóch miejscach. Musisz się zdecydować.
    Oczywiście rób to w opcjach, a jeżeli występuje problem, to trzeba dojść gdzie leży przyczyna, a nie łatać przez dodanie definicji w kodzie.

    No i nie lekceważ żadnych warningów ...

    0
  • #23 15 Sty 2013 16:10
    928879
    Użytkownik usunął konto  
  • #24 15 Sty 2013 17:10
    butcherfl
    Poziom 11  

    A wiecie że żadnych warningów nie miałem nawet z tą multidefinicją.
    Co do tego to wiem żeby nie deklarować w kodzie najlepiej wcale, ale to wersja robocza.
    Teraz już wywaliłem z kodu i myśle o tym żeby zastosować jednak single conversion o wynikach poinformuje w późnych godzinach wieczornych. Dzięki za wszelką pomoc i krytykę.

    0
  • #25 15 Sty 2013 17:28
    928879
    Użytkownik usunął konto