Elektroda.pl
Elektroda.pl
X
Banner Multimetr Fluke 87VBanner Multimetr Fluke 87V
Proszę, dodaj wyjątek dla 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

19 Gru 2012 12:24 13191 24
  • 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
  • Banner Multimetr Fluke 87VBanner Multimetr Fluke 87V
  • Użytkownik usunął konto  
  • 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)
  • Banner Multimetr Fluke 87VBanner Multimetr Fluke 87V
  • Użytkownik usunął konto  
  • Użytkownik usunął konto  
  • 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)?
  • Użytkownik usunął konto  
  • Moderator Mikrokontrolery Projektowanie
    butcherfl napisał:
    Odnośnie jeszcze Vref jaka jest wg was najlepsza metoda (może jakiś dobry stabilizator)?

    Podałem Ci link gdzie jest to ładnie wyjaśnione.
  • 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?
  • Użytkownik usunął konto  
  • 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.
  • Użytkownik usunął konto  
  • Poziom 11  
    Wszystko gra - mam zrobione u siebie niemal identycznie, tylko chyba zastosuje wzór uśredniony dla przedziałów załóżmy co 10st
  • 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.

  • 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).
  • Użytkownik usunął konto  
  • 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ść
  • 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
  • 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.
  • 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 ...
  • Użytkownik usunął konto  
  • 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ę.
  • Użytkownik usunął konto