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

ATmega32 - Sterowanie wypełnieniem PWM, obroty wentylatora

cyber90 18 Mar 2014 19:11 4212 12
REKLAMA
  • #1 13418234
    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?
  • REKLAMA
  • Pomocny post
    #2 13418336
    dondu
    Moderator na urlopie...
    Witaj.

    Możesz wzorować się i analizować przykład sterowania jasnością diod:
    Trzy przykłady: http://mikrokontrolery.blogspot.com/2011/03/epp-rozgrzewka.html

    Zaglądnij także do spisu treści i szukaj silnika BLDC. Tam znajdziesz przykłady sterowania PWM faz silnika.
  • REKLAMA
  • #3 13422923
    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%
  • REKLAMA
  • Pomocny post
    #4 13423711
    ptaqu777
    Poziom 11  
    Dokładnie tak cyber90
    Poniżej konfiguracja timer0 w trybie fast PWM dla Atmega 644p
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Należy pamiętać o ustawieniu wyjścia na pinie odpowiedzialnym za generowanie PWM.
    Pozdrawiam
  • #5 13450761
    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ć.
  • #6 13451051
    ptaqu777
    Poziom 11  
    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.
  • #7 13452206
    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 / 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.
  • REKLAMA
  • #8 13458877
    ptaqu777
    Poziom 11  
    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 / C++
    Zaloguj się, aby zobaczyć kod
  • #9 13468247
    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 / 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) ?
  • #10 13534978
    ptaqu777
    Poziom 11  
    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ż).
  • #11 13542651
    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 / 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ł?
  • #12 13558556
    ptaqu777
    Poziom 11  
    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
  • #13 13559807
    Konto nie istnieje
    Poziom 1  
REKLAMA