Elektroda.pl
Elektroda.pl
X
Relpol przekaźniki
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] Wentylator sterowany PWM i pomiar temperatury przez ADC

24 Mar 2013 18:35 3558 16
  • Poziom 9  
    Witam,
    mam problem z działaniem obu tych układów razem. Sterowanie wentylatora odbywa się przez PWM które jest wyliczane na podstawie zmierzonej temperatury z ADC.

    Posiadam dwa wentylatory, dwa czujniki LM35, korzystam z licznika 1 (rejestry OCR1A i OCR1B). I tu pojawia się problem. Wraz ze wzrostem wartości PWM odczyt temperatury skacze i gdy PWM jest bliskie maksimum temperatura obliczona na podstawie wzoru zostaje zaniżony o ok 5stC. Napięcie mierzone na wyjściu lm35 jest odpowiednie przez cały czas. Najbardziej się to uwidacznia gdy w użyciu jest rejestr OCR1B. Gdy wynosi 255 wartości temperatury stale są zaniżone z obu kanałów adc. Gdy wynosi 0 odczyt temperatury skacze pomiędzy właściwą temperaturą a zaniżoną.

    Kod: C
    Zaloguj się, aby zobaczyć kod
  • Relpol przekaźniki
  • Specjalista - Mikrokontrolery
    Błędna obsługa ADC - czytasz wynik zaraz po rozpoczęciu konwersji.

    Nie używaj przerwania ADC, bo nie masz w ten sposób kontroli nad częstotliwością pomiarów - użyj przerwania timera zgłaszanego ze stałą częstotliwością, w nim czytaj wynik poprzedniego pomiaru i startuj następny.
  • Relpol przekaźniki
  • Poziom 9  
    Wg rad użytkownika BlueDraco zmieniłem przerwanie od ADC na przerwanie od przepełnienia Timer0. Częstotliwość pomiaru wynosi 1Hz (8MHz/256/250=125 przerwań/takt). Jednak zmiana ta pogorszyła działanie programu. Obecnie gdy temperatura rośnie na jednym czujniku to na wyświetlaczu widać wzrost na dwóch (jakby obie temperatury rosły w podobnym tempie +-1stC).

    Kod: C
    Zaloguj się, aby zobaczyć kod


    Zauważyłem że wcześniejsza wersja programu działa lepiej. Do testów używałem diody led i to przez nią pomiary były sporo zaniżone. Obecnie gdy są podpięte dwa wentylatory to temperatura zaniżona jest o ok 2stC i co jakiś czas wyświetli się zła temperatura.

    Co można poprawić aby nie było przekłamań temperatury?
  • Poziom 15  
    Cześć.
    Chyba zbyt szybko odczytujesz wartość rejestru ADCW. Według mnie konwersja powinna wyglądać mniej więcej tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Daj znać, jak to działa, będziemy szukać dalej.
  • Specjalista - Mikrokontrolery
    Miałeś to zrobić w przerwaniu timera, a robisz coś bardzo dziwnego - w pętli głównej na okrągło coś odczytujesz, coś wyświetlasz i czekasz sekundę. Skoro masz już timer startujący pomiar i odczytujący wyniki - ustaw w przerwaniu timera znacznik, że wynik jest gotowy, a w pętli głównej testuj ten znacznik i rób to, co trzeba, kiedy timer powiedział, że trzeba to zrobić. Nie odczekuj sekundy w pętli , bo to nie ma sensu.

    Przerwanie timera ma się zaczynać od odczytu wyniku poprzedniego przetwarzania, a potem ma startować następny pomiar i koniec - nie odczytuj następnego wyniku. Przy takim podejściu nie musisz sprawdzać gotowości ADC. W każdym innym przypadku musisz, a tego nie robisz, więc czytasz śmieci.

    Ty masz w kodzie wciąż ten sam błąd - startujesz pomiar i nie czekając na gotowość natychmiast czytasz wynik.

    To się kupy nie trzyma...
  • Poziom 9  
    Poprawiłem program i działa lepiej lecz nadal czasami występuje większe wahanie wyświetlanej temperatury (najczęściej gdy temperatura rośnie na jednym czujniku to temperatura drugiego pokazuje wahania +-2stC od prawidłowej).

    Kod: C
    Zaloguj się, aby zobaczyć kod
  • Specjalista - Mikrokontrolery
    Cały czas jest źle, chociaż teraz ma szanse działać.

    Zrób przyzwoite wcięcia w main.

    W przerwaniu timera NAJPIERW czytaj wynik poprzedniej konwersji (pisałem to 2 razy, bez skutku), potem startuj jedną następną. Wtedy nie musisz czekać na konwersję w przerwaniu.

    Jeśli wsk_kan ma wartość 0 albo 1, to nie ma sensu sprawdzać, czy jest równ1, kiedy już sprawdziliśmy, że nie jest zerem.
  • Poziom 9  
    O takie poprawki chodziło

    Kod: C
    Zaloguj się, aby zobaczyć kod
  • Specjalista - Mikrokontrolery
    Z grubsza tak. Jest jeszcze sporo krzaków, ale jakoś zadziała. Wyrzuć delay z pętli, potem skróć kod o połowę i będzie ok.
  • Poziom 9  
    Tylko że nadal występują wahania temperatury. Pomiar na wyświetlaczu umie przeskoczyć nawet o 4stc z 17 do 21 gdzie w pokoju jest 20stC.

    Próbowałem jeszcze bez przerwań i również występują co jakiś czas większe przekłamania temperatury.

    Kod: C
    Zaloguj się, aby zobaczyć kod
  • Specjalista - Mikrokontrolery
    Schematu na wszelki wypadek nie pokazałeś...
  • Poziom 9  
    Oto schemat:

    [ATmega8][C] Wentylator sterowany PWM i pomiar temperatury przez ADC

    Brak jeszcze podpiętych klawiszy, komunikacji rs232 i diod przy wentylatorach.
  • Poziom 20  
    myku1 napisał:
    Tylko że nadal występują wahania temperatury. Pomiar na wyświetlaczu umie przeskoczyć nawet o 4stc z 17 do 21 gdzie w pokoju jest 20stC.

    Próbowałem jeszcze bez przerwań i również występują co jakiś czas większe przekłamania temperatury.

    Kod: C
    Zaloguj się, aby zobaczyć kod

    Tyle że kolega żle wylicza temperaturę to tak rzuca się w oczy,albo czegoś nie widzę bo nijak nie wychodzi mi tu 100 max
    tempw=tempw*28;
    cz_d=tempw/100;

    Już lepiej było by zastosować wzór na napięcie np Vin=adc*Vref/1024 np 400*25600/1024/100=100.00 z dokładnością 0.25°C teraz dzielimy przez 100 i mamy te 100°C dziesiątki i % 100 mamy po przecinku. Tak nawiasem mówiąc czy kolega zastosował się do datasheeta układu podpowiadam- odpowiedni filtr RC 75Ω C 1uF tym bardziej że PWM generuje duże zakłócenia.
  • Poziom 9  
    Wyliczenie temperatury jest właściwe, tylko zamiast 28 powinno być 25. Wtedy wyjdzie 100. Zastosowałem większą wartość ponieważ w datasheetcie pisze że wartość Vref może wahać się nawet do 2,9V. W programie z przerwaniem musiałem dodatkowo ratować się dodaniem 2stC do wyliczonej wartości, tak była zaniżona. Prawdopodobnie zmyliły cię nazwy cz_d i cz_u. W programie są to liczby dziesiętne (bez ułamkowych) kolejno kanału 0 i 1 ADC.

    Co do filtru to nie znalazłem takiej informacji, przeoczyłem. Na której konkretnie jest stronie.

    Co ciekawe program z przerwaniem od timera0 zaczął działać poprawnie po przemienieniu podpięcia wentylatorów (wentylator z pierwszego kanału ADC0 podpięty do ADC1 i odwrotnie). Rzadko kiedy występuje większy przeskok temperatury.
  • Pomocny post
    Poziom 20  
    myku1 napisał:
    Wyliczenie temperatury jest właściwe, tylko zamiast 28 powinno być 25. Wtedy wyjdzie 100. Zastosowałem większą wartość ponieważ w datasheetcie pisze że wartość Vref może wahać się nawet do 2,9V. W programie z przerwaniem musiałem dodatkowo ratować się dodaniem 2stC do wyliczonej wartości, tak była zaniżona. Prawdopodobnie zmyliły cię nazwy cz_d i cz_u. W programie są to liczby dziesiętne (bez ułamkowych) kolejno kanału 0 i 1 ADC.

    Co do filtru to nie znalazłem takiej informacji, przeoczyłem. Na której konkretnie jest stronie.

    Co ciekawe program z przerwaniem od timera0 zaczął działać poprawnie po przemienieniu podpięcia wentylatorów (wentylator z pierwszego kanału ADC0 podpięty do ADC1 i odwrotnie). Rzadko kiedy występuje większy przeskok temperatury.

    Strona 8 datasheeta figura 4. LM35 with R-C dumper. LM35 lubi się gubić od zakłóceń od np przekaźników.A faktycznie masz takie różnice jak pisze w datasheecie 2.3-2.9V?? Zastosuj zewnętrzne źródło napięcia odniesienia np TL431(2.56V) przede wszystkim sprawdź co pokazuje ten czujnik miliwoltomierzem jeśli uznasz że, tam jest ok to jedynie zakłócenia.
  • Pomocny post
    Specjalista - Mikrokontrolery
    Oprócz obowiązkowego RC, a zwłaszcza kondensatora na wejściu ADC, ja bym jeszcze dorobił filtr dolnoprzepustowy w oprogramowaniu. Regulacja czegokolwiek na podstawie pojedynczego, nieuśrednionego pomiaru jest dość ryzykowna.
  • Poziom 9  
    To tak: pomiar multimetrem potwierdził dobre działanie czujników LM35, nie mam żadnego innego źródła napięcia odniesienia.

    Spróbuję z filtrem, tylko że obecnie nie mam pod ręką takich wartości elementów.

    Teraz zabiorę się może za sterowanie PWM (chciałbym zastosować algorytm PID) oraz rs232 (wysyłanie wartości pomiaru do pc oraz odbieranie przez uC ustawionej ręcznie w aplikacji wartości PWM).

    Dzięki za pomoc