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

Atmega8 i LM35 – jak uzyskać płynny odczyt temperatury bez nagłych skoków?

ufalowiec 02 Maj 2006 13:51 3146 4
  • #1 2583740
    ufalowiec
    Poziom 11  
    Posty: 32
    Pomógł: 1
    Ocena: 1
    czesc wszystkim,
    zrobilem ukladzik atmega8 plus lm35 (do sygnalu Vout z lm35 podpialem rownolegle kondensator i rezystor). AVCC do atmegi jak w nocie, czyli dlawik 10u i kondensator 100n.
    sprawa jest taka ze jak mierzy temp, to pokazuje wynik, np 25 stopni, sciskam termometr palcem i przez ok2-3 sekundy nic sie nie dzieje, az nagle skacze (jest pokazane jak sie cyfry zmieniaja) do 33 stopni.
    potem jak np podgrzewam (np. suszarka) , to znowu 2-3 sek cisza i nagle skok (znowu o 8 stopni) do 41.
    Jak to "zwolnic", tak no zeby temp. zmieniala sie wolnieji i co stopien, a nei takimi skokami ?
  • Pomocny post
    #2 2583876
    shg
    Poziom 35  
    Posty: 2289
    Pomógł: 339
    Ocena: 135
    A z jaką częstotliwością odczytujesz dane z ADC? Może za wolno?. Jeszcze ten równoległy kondensator, on zachowuje się jak filtr dolnoprzepustowy.
  • #3 2583985
    ufalowiec
    Poziom 11  
    Posty: 32
    Pomógł: 1
    Ocena: 1
    dzielnik czestotliwosci (division factor) ustawilem na 4 (atmega pracuje z zegarem wew 8 MHZ).

    a moze jeszcze kwestia wysiwetlania cyfr:
    program zwraca mi zawartosc ADCH (8 bit)
    zmienna TEMP to jest suma tych bitów
    temperature prezentuje nastepujaco
    dzies = temp%10;
    dzies = temp/100;

    jedn = temp%10;
    jedn = jedn/10;
    po takim czyms temperatura skacze mi teraz o 10 stopni
  • Pomocny post
    #4 2584227
    cyberdar
    Poziom 31  
    Posty: 1465
    Pomógł: 161
    Ocena: 73
    Witam

    Opóźnienie może wynikać z killku faktów. Po pierwsze czujnik w zależności od środowiska w jakim mierzy temperaturę w różnym czasie reaguje na zmianę temperatury. Pisze o tym w nocie katalogowej LM-a. Po drugie problem może stanowić obudowia czujnika. Po trzecie trudno powiedzieć jak napisałeś program. Biorąc pod uwagę wspomniane czynniki może się tak dziać. Jeśli to jednak wyeliminujesz i dalej będzie się tak działo to proponuję "zrobić tablicę" np. 5-cio elementową i wrzucać do niej kolejne pomiary. Przy czym wyglądać to ma tak, że kolejny pomiar wrzucasz do tablicy w komórce pierwszej a pozostałe pomiary przesuwasz o jeden. Żeby nie było pomyłki to trzeba najpierw przesunąć element 4 tablicy na pozycję piątą, 3 na 4, 2 na 3, 1 na 2 a do pierwszego wpisać najbardziej aktualny wynik. Takie uśrednianie daje bardzo dobre rezultaty jeśli chodzi o dokładność no i o efekt wizualny - nie skacze wynik w tak dziwny sposób.

    --
    pozdrawiam
  • #5 2584345
    ufalowiec
    Poziom 11  
    Posty: 32
    Pomógł: 1
    Ocena: 1
    dzieki,
    zanim jednak sie zabiore za tablice , jest sprawa jeszcze:
    oto kod programu (zczytywanie i zamiana):

    unsigned char adc_convert(void)
    {

    ADMUX=0x63;
    ADCSRA=0xC2;

    while(!(ADCSRA & 0x10)) //oczekiwanie na zakonczenie
    {; }
    return ADCH ; //wynik: 8 bitów;
    }

    oraz kawalek funkcji do zamiany

    while(1)
    {
    temp=0;
    for(sredn=0;sredn<sredn_const;sredn++)
    {
    temp += (unsigned int)adc_convert();
    }

    temp += stala;

    dzies = temp%10;
    dzies = temp/10;
    jedn = temp%10;
    jedn = jedn/100;

    }

    i tam jeszcze jest kod do wyswietlania na lcd (ale nie w tym rzecz)

    teraz pytanie:
    czy ma byc modulo 10 ? czy np moze byc modulo 8,4,2 itp.. ? , dzielic przez 10 czy przez 100?
    czy mozna to jakos "policzyć" czy poprostu na chybil trafil i szukac kiedy wynik (temperatura) bedzie dobry ?

    Dodano po 2 [minuty]:

    "stala" to stała kalibrujaca termometr = 9000,
    sredn_const= 78 ( tez do kalibracji)
REKLAMA