Elektroda.pl
Elektroda.pl
X
IGE-XAO
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] - PWM - opis, uruchomienie, zastosowanie

04 Sie 2011 14:48 11592 42
  • Poziom 9  
    Witam. Sam nie wiem czy pytanie nie jest zbyt trywialne, ale przewaliłem kawał internetu i ciągle nie mogę pojąć istoty PWM.

    Bawię się elektroniką od niedawna. Używam Atmegi 8, piszę w języku C. Mam przed sobą datasheet, czytam i czytam i ciągle nie mogę ogarnąć tych wszystkich rejestrów.

    Jakby mógł ktoś pokazać konkretne ustawienia pod PWM wraz z komentarzami za co który rejestr odpowiada oraz jakieś konkretne zastosowanie, byłbym przeszczęśliwy. Bardzo proszę.

    Pozdrawiam
  • IGE-XAO
  • Poziom 25  
    Gotowca nie dostaniesz bo zaraz zaczną krzyczeć.

    Zasada jest prosta PWM to modulacja szerokości impulsów.
    W Atmega8 szerokość impulsu jest regulowana za pomocą wartości w rejestrze OCRn.
    Po włączeniu trybu PWM timer zaczyna liczyć gdy wartość rejestru TCNTn (licznika) przekroczy wartość zapisaną w rejestrze wtedy na wyjściu PWM OCn nastąpi zmiana ze stanu wysokiego na niski a na !OCn odwrotnie.

    W Atmega8 występują 2 tryby PWM Fast i Phase Correct.
    Różnica między nimi polega na tym, że w Fast PWM licznik zlicza o zera do maksa ('przebieg piła').
    A w Phase Correct PWM licznik zlicz od zera do maksa a następnie od maksa do zera ('przebieg trójkątny').

    Dla Timera 2 (8-bit) rejestry odpowiedzialne za PWM to TCCR2, OCR2, TCNT2.

    W TCCR2 wybierz tryb bitami WGM21 i WGM20 bitami CS22:0 wybierasz preskaler, bitam COM20 i COM21 wybierasz tryb wyjścia PWM.
    Szerokość impulsów regulujesz wartością OCR2.

    Jeżeli masz więcej pytań to pytaj :)

    Reszta jest w dokumentacji.
    Pozdrawiam


    PS występuje jeszcze "Phase and Frequency Correct PWM Mode" ale to już nie do mnie bo go nie używałem.
  • Poziom 9  
    Wybaczcie, ze dopiero teraz. Nieszczęśliwa seria. Najpierw żniwa, potem burza i wywaliło internet. Siedzę na necie cichaczem w pracy o_O.

    snnaap napisał:
    Po włączeniu trybu PWM timer zaczyna liczyć gdy wartość rejestru TCNTn (licznika) przekroczy wartość zapisaną w rejestrze wtedy na wyjściu PWM OCn nastąpi zmiana ze stanu wysokiego na niski a na !OCn odwrotnie.

    Pomóż mi lepiej zrozumieć. Po "PWM" powinien być przecinek? Pomiędzy "liczyć" a "gdy" powinna być kropka?

    "Gdy wartość rejestru TCNT przekroczy wartość zapisaną w rejestrze wtedy..."
    Zapisaną, w którym rejestrze? W OCRn?

    snnaap napisał:
    Dla Timera 2 (8-bit) rejestry odpowiedzialne za PWM to TCCR2, OCR2, TCNT2.

    Zatem, jeżeli dobrze zrozumiałem:
    1. Ustawiam OCR2
    2. Ustalam tryb za pomocą TCCR2 (ustawiając odpowiednie bity - bez przykładu, bo nie moge na tym kompie otworzyć żadnego datasheetu).
    CS22:0 - do czego służy i jak właściwie działa preskaler?
    Jakie są tryby wyjscia PWM? - gdzieś już o tym czytałem (być może w datasheecie).
    3. I już? Żadnych bibliotek, dodatkowych zapisów?

    To by było dla timera 2. Timer 1 podejrzewam, że jest podobny, zwłaszcza, że w datasheet więcej piszą właśnie o timerze 1. Nęka mnie jedynie fakt, że timer 1 obsługuje tak jakby 2 PWMy? Tak wywnioskowałem z datasheetu. I nie rozumiem tego. Ciężko mi teraz to sprawdzić, bo tak jak wspomniałem, nie mam dokumentacji przed sobą.

    I z innej beczki: Czy np. serwo (RC) lub silnik DC może być podłączony bezpośrednio do atmegi przy wyjściu PWM, czy należy użyć po drodze jakiś układów (np mostka-H)? Jakie są konsekwencje?

    Dziękuję i liczę na więcej ;)
    Pozdrawiam
  • IGE-XAO
  • Poziom 25  
    santo144 napisał:

    Pomóż mi lepiej zrozumieć. Po "PWM" powinien być przecinek? Pomiędzy "liczyć" a "gdy" powinna być kropka?

    Tak jak mówisz po PWM przecinek pomiędzy liczyć a gdy postaw kropkę.

    santo144 napisał:

    "Gdy wartość rejestru TCNT przekroczy wartość zapisaną w rejestrze wtedy..."
    Zapisaną, w którym rejestrze? W OCRn?

    Tak w rejestrze OCRn.


    santo144 napisał:

    Zatem, jeżeli dobrze zrozumiałem:
    1. Ustawiam OCR2
    2. Ustalam tryb za pomocą TCCR2 (ustawiając odpowiednie bity - bez przykładu, bo nie moge na tym kompie otworzyć żadnego datasheetu).
    CS22:0 - do czego służy i jak właściwie działa preskaler?
    Jakie są tryby wyjscia PWM? - gdzieś już o tym czytałem (być może w datasheecie).
    3. I już? Żadnych bibliotek, dodatkowych zapisów?


    CS22:0 - służy do ustawienia preskalera czyli z jakim podziałem impulsy zegarowe zegara taktującego uK mają trafiać do timer. Czyli z jaką częstotliwością ma być "taktowany" Timer - jeżeli można tak powiedzieć.

    santo144 napisał:
    To by było dla timera 2. Timer 1 podejrzewam, że jest podobny, zwłaszcza, że w datasheet więcej piszą właśnie o timerze 1. Nęka mnie jedynie fakt, że timer 1 obsługuje tak jakby 2 PWMy? Tak wywnioskowałem z datasheetu. I nie rozumiem tego. Ciężko mi teraz to sprawdzić, bo tak jak wspomniałem, nie mam dokumentacji przed sobą.


    O trybach i powierzchownych różnicach pisałem w swoim 1 poście, ważne abyś miał datasheet przed sobą tam są zobrazowane poszczególne tryby pracy Timera w tym Fast PWM Mode i Phase Correct PWM Mode.

    santo144 napisał:
    I z innej beczki: Czy np. serwo (RC) lub silnik DC może być podłączony bezpośrednio do atmegi przy wyjściu PWM, czy należy użyć po drodze jakiś układów (np mostka-H)? Jakie są konsekwencje?


    Serwo może być sterowane bezpośrednio z uK, to znaczy serwo musi zostać zasilone ze źródła zasilania napięciem odpowiednim dla danego serwa a z uK podajesz sygnał sterujący (sygnał o zmiennej szerokości impulsów o stałym okresie).
    Silniki DC to inna bajka nimi steruje się za pośrednictwem wyspecjalizowanych układów. Jeżeli silnik ma się kręcić 2 dwie strony będzie to układ zwany mostkiem h. W takim przypadku uK podaje na wejścia mostka h sygnały kierunkowe (prawo lewo) oraz sygnał PWM odpowiedzialny za prędkość obrotów.


    Pozdrawiam
    PS Zaraz mi się dostanie za terminologie.
  • Moderator Mikrokontrolery Projektowanie
    snnaap napisał:
    ... zobrazowane poszczególne tryby pracy Timera w tym Fast PWM Mode i Phase Correct PWM Mode.

    Może tutaj nieco informacji: http://mikrokontrolery.blogspot.com/2011/04/pwm-co-to-takiego.html

    snnaap napisał:
    Zaraz mi się dostanie za terminologie.

    Poziom słownictwa dostosowany do poziomu pytań :)
  • Poziom 11  
    Nie chciałem tworzyć kolejnego tematu tak więc dołączam się do tego.
    Mam problem z ruszeniem serwa RC sterowanego przez Atmege8.
    Zasilanie serwa puszczam bezpośrednio ze stabilizatora L7085:
    +5VDC podłączam pod czerwony przewód serwa
    GND podłączam pod brązowy lub czarny przewód serwa (mam 2 różne serwa)

    OC1A (wyjście PB1 z Atmegi) podłączam pod pomarańczowy lub biały przewód serwa (mam 2 różne serwa)

    Atmega zasilana jest cały czas z podłączonego do niego programatora.

    No i teraz kod programu:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Preskaler wg dokumentacji ustalony jest na 1, dlatego też licząc ze wzoru: F=fuc/(2*preskaler*ICR1)
    ICR1=10000 (próbowałem też użyć wartości 9999, wyczytałem na jednej ze stron, że liczymy również bit zerowy, jednak nic to nie dało).

    Niestety nie wiem co dalej mogę zrobić z tym programem aby to dalej działało.
    Z góry dziękuję za każdą pomoc.

    Znalazłem też inny wzór odnośnie obliczenia wartości ICR1:
    F=fuc/(N*(TOP+1))
    licząc z niego, dla preskalera 1, wartość TOP wychodzi 19999, jednak wstawiając tę wartość również serwo pozostaje w spoczynku.
  • Poziom 11  
    Zmienia wartość wypełnienia sygnału pwm, początkowo jest to 2000, po odczekaniu delaya zmienia na 1000 i tak w kółko.

    Tak przynajmniej zrozumiałem twoje słowa zaczerpnięte z innego forum:
    Cytat:

    W ten sposób masz na wyjściu OC1A falę prostokątną PWM jak na załączonym wyżej linku. A ponieważ w pętli głównej zmieniasz od czasu do czasu wartość OC1A stąd zmieniasz wypełnienie (duty cycle) wykresu tak jak na animacjach z linku. W konsekwencji serwo będzie miało różny kont wychylenia przy różnym wypełnieniu sygnału PWM.
  • Moderator Mikrokontrolery Projektowanie
    retaliato napisał:
    Zmienia wartość wypełnienia sygnału pwm, początkowo jest to 2000, po odczekaniu delaya zmienia na 1000 i tak w kółko.

    Dobrze, ale jak długo będzie w tym rejestrze wartość 2000, a jak długo wartość 1000?
  • Poziom 11  
    Dodałem teraz po OCR1A = 1000; również delaya ustawionego na 1000, tak więc wartość 2000 i 1000 będą trwały tak samo długo w rejestrze, ale niestety nic to nie poprawiło w działaniu programu.
  • Moderator Mikrokontrolery Projektowanie
    retaliato napisał:
    Dodałem teraz po OCR1A = 1000; również delaya ustawionego na 1000, tak więc wartość 2000 i 1000 będą trwały tak samo długo w rejestrze, ale niestety nic to nie poprawiło w działaniu programu.

    To zrób to o co prosiłem:

    dondu napisał:
    Opisz jaki jest efekt działania Twojego kodu.


    Masz jakiś oscyloskop lub analizator stanów logicznych?
  • Poziom 11  
    No to w takim razie teraz zmiana wypełnienia sygnału PWM następuje cyklicznie po odczekaniu delaya, raz wypełnienie ma wartość 2000, a później 1000 i tak przez cały czas działania programu.

    Niestety oscyloskopu nie mam. Widziałem, że możliwe jest podłączenie tego pod kartę dźwiękową (portu LPT niestety nie mam), ale nie mam na stanie potrzebnych elementów do zabezpieczenia wejścia, a do sklepu elektronicznego będę mógł dostać się dopiero na początku/w połowie następnego tygodnia ;/


    Mam jeszcze jedno pytanie czy masę od stabilizatora i tą która wychodzi z portu USB (programator, a co za tym idzie Atmega korzysta z zasilania USB z komputera) mam zewrzeć ze sobą?
  • Moderator Mikrokontrolery Projektowanie
    retaliato napisał:
    Niestety oscyloskopu nie mam. Widziałem, że możliwe jest podłączenie tego pod kartę dźwiękową (portu LPT niestety nie mam), ale nie mam na stanie potrzebnych elementów do zabezpieczenia wejścia, a do sklepu elektronicznego będę mógł dostać się dopiero na początku/w połowie następnego tygodnia

    Dwa rezystorki i już masz dzielnik - na pewno znajdziesz, ewentualnie potencjometr montażowy - poszukaj szkoda czas tracić :)


    retaliato napisał:
    Mam jeszcze jedno pytanie czy masę od stabilizatora i tą która wychodzi z portu USB (programator, a co za tym idzie Atmega korzysta z zasilania USB z komputera) mam zewrzeć ze sobą?

    Oczywiście inaczej nie zaprogramujesz.
  • Poziom 38  
    Nie wiem skąd ten upór w stosowaniu PWM do sterowania serwa.
    Jeśli ustawimy prescaler tak aby podstawowy interwał był 20ms- a tak wymaga serwo- to rozdzielczość regulacji długości impulsu- zasadniczo 1-2ms jest bardzo kiepska.
    Zwłaszcza przy kilku serwach.
    Tu masz "gotowca"- ale dla ATMega32- pewnie ustawienia rejestrów dla ATMega8 mogą się nieco różnić.
    No i sterowanie z potencjometrów.
    Jak z czegoś innego- to program się tylko uprości.
    Działa na pewno- sprawdziłem dla ośmiu serw.
    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 11  
    dondu napisał:
    retaliato napisał:
    Mam jeszcze jedno pytanie czy masę od stabilizatora i tą która wychodzi z portu USB (programator, a co za tym idzie Atmega korzysta z zasilania USB z komputera) mam zewrzeć ze sobą?


    Oczywiście inaczej nie zaprogramujesz.


    Z programowaniem nie miałem problemu. Chodzi mi o GND ze stabilizatora którym zasilam serwo, czy ma być połączone z GND od programatora (ktore podłączone jest do Atmegi).

    Znalazłem potencjometr i zbadałem co mam na wyjściu OC1A, no i niestety nic poza szumem nie wykryło ;/ Zarówno po zasileniu układu jak również bez zasilania scope pokazywał to samo. Sprawdziłem jeszcze czy nie jest to wina błędnie podłączonego układu do karty muzycznej, ale sygnał który mruga diodą wykrywało bardzo ładnie.

    @janbernat: dziękuję za kod, postaram się go przeanalizować i przerobić na Atmege8.

    Chociaż ciągle chciałbym uruchomić tego PWMa, ponieważ wydaje mi się, że jest to dość prosta sprawa, a sterowanie za pomocą pwm można przecież użyć do wielu innych rzeczy niż tylko serwa rc.
  • Poziom 11  
    [Atmega8][C] - PWM - opis, uruchomienie, zastosowanie

    Przepraszam, za jakość schematu, ale robiłem to w paincie, ale mam nadzieję, że wszystko co potrzebne jest dobrze widoczne.
  • Moderator Mikrokontrolery Projektowanie
    1. Jaki masz programator?
    2. Masy ze stabilizatora i uC muszą być połączone <---- NAJWAŻNIEJSZE!
    3. Brak filtrowania zasilania pinów uC chyba, że nie narysowałeś.
    4. Jak są podłączone te kondensatory do stabilizatora 7805 ?
    5. RESET nie podciągnięty rezystorem do Vcc - warto to zrobić.
    6. Eagle - zainstaluj i zacznij w nim projektować schematy.
  • Poziom 10  
    Filtrowanie kolego, filtrowanie! Najważniejszym błędem, głupim błędem jest taka banalna rzecz, która powoduje resetowanie się układu i innym krzaczeniem.
  • Poziom 11  
    1.Programator mam USB AVR ISP (dokładnie ten: http://www.microsense.eu/index.php/Programatory/USB-AVR-ISP-III-mkII.html ).

    2. Co do masy stabilizatora i uC próbowałem to łączyć, niestety nie pomagało. Podczas podłączenia sygnału wyjściowego pod kartę muzyczną, nie miałem w ogóle podłączonego serwa, a sygnał z uC nie wychodził.

    3. Nie mam podłączonych żadnych filtrowań na zasilaniu.

    4. Układ stabilizatora pozostał mi z tego jak kiedyś zabierałem się za budowe zegara binarnego (również na atmedze 8), schemat taki:
    [Atmega8][C] - PWM - opis, uruchomienie, zastosowanie

    5. podłączenia brak

    6. robiłem na szybko i dlatego w paincie, Eagla dawno nie używałem i stweirdziłem, że szybciej będzie w paincie.


    Co do tego podłączenia to prędzej na takim samym podłączeniu miałem Atmegę 32L i działały na niej podstawowe programy (diody, właczniki, komunikacja po RSie, itp.), tak więc nie wiem czy wina tego, że nie mogę sterować serwem leży po stronie podłączenia zasilania, itp.
  • Moderator Mikrokontrolery Projektowanie
    retaliato napisał:
    ... tak więc nie wiem czy wina tego, że nie mogę sterować serwem leży po stronie podłączenia zasilania, itp.

    Ale my wiemy :)
    Przeczytaj dokładnie większość tematów z tego działu: Zasilanie i zakłócenia
    i zastosuj dostosuj swój projekt do tych wymagań, albo trać czas dalej.
    I połącz te masy.
  • Poziom 11  
    Zrobiłem filtrację napięcia zasilającego, połączyłem masy, podłączyłem VREF przez kondensator do masy, reset przez rezystor nie miałem jedynie na stanie cewki, aby zrobić podobny układ jak tutaj: http://mikrokontrolery.blogspot.com/2011/04/minimalne-podlaczanie-pinow.html Po podłączeniu dalej to samo, scope wykrywa jedynie szumy.

    Spróbowałem jeszcze wykorzystać jeden z wcześniejszych projektów (robiłem kiedyś sonar ultradźwiękowy), oto schemat:
    [Atmega8][C] - PWM - opis, uruchomienie, zastosowanie

    Wydaje mi się, że filtracja jest tam dość dobrze zrobiona (sprawdzane było to przez doświadczonego pana prowadzącego zajęcia). I podłączyłem się tam pod wyjście z OCR1A, wgrałem nowy program i również dalej widziałem same szumy ;/

    Zastanawiam się czy wina nie leży czasem w pliku makefile (do programowania używam programu winAVR). Dlatego załączam również i go (może ktoś z was zauważy jakiś błąd):
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
  • Moderator Mikrokontrolery Projektowanie
    Zainstaluj sobie AVR Studio Atmela, lub Eclipse i zapomnij o problemach z makefile.
    Pokaż aktualną wersję Twojego programu.
    Eagle potrafi eksportować pliki graficzne MENU > FILE > EXPORT > IMAGE

    Dlaczego AVCC podłączony jest przez rezystor 1k?! Gdzie znalazłeś taką "szkołę podłączania? Czemu nie sprawdzisz w datasheet?
  • Poziom 11  
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    ICR1 przeważnie sprawdzam dla 4 wartości: 9999, 10000, 19999, 20000
  • Poziom 11  
    Połączenie z zamieszczonego linku ułożyłem na płytce stykowej, a zamieszczony schemat jest to projekt który wykonywałem dużo wcześniej. Na schemacie jest tam błąd, faktycznie na płytce znajduje się w miejscu rezystora R23 cewka.
  • Poziom 11  
    Zdjęcia zrobiłem tego starego projektu, wykonanie jest dość średnie, ale przerwania, ADC, timery działały na tym poprawnie (jeszcze dzisiaj przed zmianą programu na uC). Z tylu płytki znajdują się 3 wystające kable - 2 znich (zaizolowane) tworzyły połączenie (nie pamiętam już do czego, znajomy się tym zajmował, teraz je rozciąłem i zaizolowałem). A trzeci szaro-różowy przewód to właśnie wyjście z OCR1A.

    Zamieszczam również schemat z eagla.

    [Atmega8][C] - PWM - opis, uruchomienie, zastosowanie [Atmega8][C] - PWM - opis, uruchomienie, zastosowanie [Atmega8][C] - PWM - opis, uruchomienie, zastosowanie
  • Poziom 11  
    Podczas projektowania płytki około 1,5 roku temu wszystkie warningi zostały zlikwidowane. W tym momencie eagle wywala mi ich aż 87, którymi w tym momencie są praktycznie tylko "no value", "overlaps pin", "junction is net...".

    Spróbuje jeszcze uruchomić program zamieszczony przez janbernata, bo tak się składa, że mam jeszcze Atmegę32L.