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.

ATmega32 - Sterowanie wypełnieniem PWM, obroty wentylatora

cyber90 18 Mar 2014 19:11 2919 12
  • #1 18 Mar 2014 19:11
    cyber90
    Poziom 15  

    Witam, zamierzam zrobić sterownik który sterowałby obrotami wentylatora w komputerze w zależności od temperatury. Czujnik temperatury mam skonfigurowany, wyświetlacz też teraz biorę się za sterowanie przez PWM. Mam jakieś pojęcie o mikrokontrolerach, a i Timer/Licznik nie jest mi obcy. Chcę zrobić możliwość sterowania wypełnienieniem za pomocą przycisków. Może ktoś napisać jak steruje się wypełnieniem? Czym różni się Tryb pracy PWM, z poprawna fazą 8 bitowy od 10 bitowego? Szukałem jakiś programów w C i znalazłem ale nie jestem w stanie sobie wyobrazić jak zmienia się wypełnienie. Rozumiem, że po porównaniu na danej wyjściu OC1A/B ma nastąpić zerowanie. Załóżmy, że licznik zlicza do jakiejś wartości wpisanej do rejestru OCR1A/B, po porównaniu na wyjściu OC1A będzie stan zerowy. Jak długo ten stan się utrzyma? Co się stanie po kolejnym przepełnieniu?

    0 12
  • #3 19 Mar 2014 21:59
    cyber90
    Poziom 15  

    Dzięki dondu za przykłady, niestety nie mam dostępu do końca tygodnia do mojego zestawu testującego. Zanim przetestuję sterowanie PWM na diodzie chciałbym dobrze zrozumieć zasadę. Proszę mnie poprawić jeżeli źle rozumuję. Na podstawie tabeli trybów pracy licznika:

    ATmega32 - Sterowanie wypełnieniem PWM, obroty wentylatora

    Załóżmy że w rejestrze TCCR1A ustawiamy:
    TCCR1A = (1<<COM1A1)|(1<<COM1A0)|(1<<WGM10);
    TCCR1B = (1<<WGM12);
    Porównanie ustawia OC1A, zeruje przy wartości szczytowej. Tryb pracy 5.

    Rozumiem że w 5 trybie (FAST PWM, 8 bitowy) licznik może zliczać do 255. Jeżeli do rejestru OCR1A wpiszę 155.
    OCR1A=155;

    To uzyskam taki przebieg?

    ATmega32 - Sterowanie wypełnieniem PWM, obroty wentylatora

    w którym czas impulsu = 100, a okres = 255?
    a z wzoru na wspł. wypełnienia uzyskam 40%?
    wzór: wspł = (czas impulsu/okres) × 100% = (100/255)×100% ≈40%

    0
  • Pomocny post
    #4 20 Mar 2014 07:42
    ptaqu777
    Poziom 10  

    Dokładnie tak cyber90
    Poniżej konfiguracja timer0 w trybie fast PWM dla Atmega 644p

    Kod: C
    Zaloguj się, aby zobaczyć kod

    Należy pamiętać o ustawieniu wyjścia na pinie odpowiedzialnym za generowanie PWM.
    Pozdrawiam

    0
  • #5 27 Mar 2014 23:11
    cyber90
    Poziom 15  

    Dzięki za odpowiedzi. Sterowanie PWM już mam zrobione, teraz chciałbym wyświetlać prędkość obrotów. W jaki sposób się za to zabrać? Za pomocą licznika? Może ktoś podpowiedzieć? Wentylator jest 4 pinowy i ma oddzielny kabel do tego celu przeznaczony.

    I drugie pytanie, czy przy zerowym wypełnieniu wentylator powinien się obracać? Czy to zależy od typy wentylatora? U mnie przy zerowym wypełnieniu obraca się, a teoretycznie powinien się zatrzymać.

    0
  • #6 28 Mar 2014 05:47
    ptaqu777
    Poziom 10  

    Nie wiem ile daje impulsów na obrót, ale jedną z metod jest generowanie oraz zliczanie wystąpienia przerwań od stanu wysokiego. Wtedy podłączamy 4 pin wentylatora pod wejście INT0 i w przerwaniu ustawiamy flagę że wystąpiło, w kodzie programu głównego sprawdzamy czy wystąpiło i jeśli tak to dodajemy do aktualnej wartości obrotów.

    0
  • #7 28 Mar 2014 15:24
    cyber90
    Poziom 15  

    Kurcze spędziłem cały dzień i nie działa tak jak chce. Na początek chciałem sprawdzić czy wogóle reaguje na zbocze narastające. Oto mój kod:

    Z tego co wyczytałem jeżeli na pienie ICP1 pojawi się zbocze narastające automatycznie wykona się przerwanie. W przerwaniu zliczam pojawiające się zbocza.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Na wyświetlaczu nie zależnie czy podepnę żółty kabel czy nie to raz zlicza impulsy a raz nie. Nawet jak jest odpięty zlicza jakieś impulsy, ale to chyba jakieś zakłócenia. Podając napięcie z programatora +5V na pin teoretycznie powinien potraktować to jako impuls i zwiększyć stan o jeden, ale nie reaguje. Proszę o jakieś wskazówki.

    0
  • #8 30 Mar 2014 17:37
    ptaqu777
    Poziom 10  

    Spróbuj podłączyć to do pinu INT0, wg mnie pin ICP1 nie powinien ci dawać impulsów z "powietrza". Poniżej fragment dla przerwania od INT0

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #9 02 Kwi 2014 13:53
    cyber90
    Poziom 15  

    ptaqu777 napisał:
    Spróbuj podłączyć to do pinu INT0, wg mnie pin ICP1 nie powinien ci dawać impulsów z "powietrza". Poniżej fragment dla przerwania od INT0
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Też mnie to zastanawia, dlaczego pokazuje wogóle jakieś wartości. Ok tylko wiesz co ja chcę zmierzyć prędkość , a nie ilość obrotów i chcę to zrobić przy pomocy jednego licznika (timer1 16bitowy) bo pozostałe dwa już wykorzystuję w innym celu. Spróbuję tak jak napisałeś, ale w taki sposób zliczę ilość obrotów, a co dalej z nimi zrobić żeby otrzymać prędkość? I rozumiem że przez wejście INT0 zliczane będą impulsy tylko o amplitudzie równej warości napięcia zasilania mikrokontrolera (w tym wypadku 5V) ?

    0
  • #10 23 Kwi 2014 11:00
    ptaqu777
    Poziom 10  

    I jak udało się coś ugrać :) ?
    Przez INT0 możesz mieć też zliczane sygnały trochę niższe, w zależności jak skonfigurujesz np. przy wykrywaniu od rising edge wystarczy ze uC wykryje zmianę zbocza - czyli wartość sygnału wskoczy na poziom logiczny 1 (a to chyba od 3.3 wzwyż).

    0
  • #11 25 Kwi 2014 21:39
    cyber90
    Poziom 15  

    Postanowiłem mierzyć ilość impulsów przy pomocy komparatora. Narazie zamiast sygnału z wentylatora mam potencjometr. Jest jednak problem bo program nie działa w zamierzały sposób.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Gdy napięcie mierzone jest mniejsze od napięcie ref (1,2V) to cały czas inkrementuje mi zmienną stan, a chodzi mi o to żeby po wykryciu gdy napięcie mierzone jest mniejsze zmienną stan zwiększył raz, potem po ponownej zmienie zwiększył ją znowu też o jeden. Macie jakiś pomysł?

    0
  • #12 01 Maj 2014 08:03
    ptaqu777
    Poziom 10  

    Według mnie błędem jest inkrementacja w przerwaniu. Lepiej ustawić sobie w nim tylko flagę że wystąpiło. Teraz w pętli głównej jeśli flaga wystąpiła to zwiększamy wartość zmiennej stan o 1. Następnie w main zerujemy flagę.

    Napisz czy pomogło.
    Pozdrawiam

    0
  • #13 01 Maj 2014 16:59
    emarcus
    Poziom 35  

    cyber90 napisał:
    Postanowiłem mierzyć ilość impulsów przy pomocy komparatora.


    Nie jest to najlepszy pomysł...
    Zacznij od przeanalizowania podstawowych założęń dla 4-wire comp. vent.
    1. "Motherboard jest compatible z 3-wire vent" co oznacza że pierwsze 3 przewdy maja te same funkcje.
    1- GND
    2- +12V
    3 - TACH
    oraz dla 4-wire:
    4- sterowanie obrotów sygnałem PWM

    2. Przewód 3 w zależności od producenta możę mieć różny kolor, lecz funkcję spełnia tą samą: - wysyła 2 impulsy na każdy obrót wirnika.
    3. Impulsy te są z wyjścia typu "open collector, or open drain" - co oznacza że potrzebujesz tam zastosować "pull up" aby ten sygnał był użyteczny. Pull up nie powinien być wyższy niż 5.5 V.

    Ponieważ jeden z timerów jest już wykorzystany do 'produkcji' sygnału PWM; to dla pomiaru RPM potrzebujesz wykorzystać następny dowolny timer.
    RPM możesz mierzyć na co najmniej dwa sposoby; albo mierzysz czas pomiędzy dwoma impulsami z sygnału Tach; albo zliczasz ilość impulsów w oznaczonym czasie, następnie prosty rachunek arytmetyczny daje RPM.
    Najbardziej praktyczny i prosty sposób wydaje się być ustawienie timera na interwały co 1 sec, w przeciągu której zliczasz impulsy z TACH, które po wymnożeniu przez 30 (60 sec/2 impulsy) dają RPM, a jednocześnie możesz wykorzystać ten interwał/interrupt do odświerzenia display i jeżeli pomiar temperatury jest dokonywany przez DS18B20 to sygnał ten przydatny jest do wysłania commendy conversji T.

    e marcus

    0