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

Minimalna częstotliwość PWM

nsmarcin 17 Lip 2011 11:19 4250 27
REKLAMA
  • #1 9727416
    nsmarcin
    Poziom 12  
    Witam,
    Jaka jest minimalna częstotliwość PWM na Atmega16? Konkretnie chodzi mi o 1Hz albo nawet 0,5Hz. Przy ustawieniu częstotliwości mikrokontrolera na 1MHz i PWM 10bitowego z preskalerem 1024 ze wzoru wychodzi jakieś 0,95Hz o ile oczywiście poprawnie liczę. Czy lepszym rozwiązaniem będzie zmniejszenie clk do odpowiedniej wartośc aby wyszła interesująca mnie wartość (z jaką najmniejszą szybkością może pracować ten układ?), czy w ogóle najlepiej zastosować zewnętrzny oscylator?
  • REKLAMA
  • #2 9727507
    acid12
    Poziom 21  
    mozesz go nawet uruchomic z kwarcem zegarkowym 37kHz (ale spr czy zdolasz go zaprogramowac wtedy). Przy tak małej czestotliwości, moze lepiej zrezygnuj z sprzetowego PWM tylko zrob sobie programowy, uC bedzie miał duuuzo czasu na inne rzeczy a Ty sobie ustalisz dokładoność jaką bedziesz chciał.
  • #3 9727579
    mirekk36
    Poziom 42  
    A powiedz po jakiego grzybka potrzebny ci do programowego PWM'a zewnętrzny kwarc ???

    Po pierwsze to możesz przecież użyć najspokojniej w świeci wewnętrznego oscylatora ale 8MHz zamiast tego co masz ustawione fabrycznie (1MHz)

    Po drugie to nawet przy taktowaniu (obojętnie z jakiego źródła) 1MHz także możesz zrobić programowego PWM'a

    no ale już zmniejszanie tego taktowania poniżej 1MHz to raczej sztuka dla sztuki i niestety robi się to bez sensu :(

    A tak w ogóle to coś totalnie sobie źle liczysz - z tym twoim 1MHz i 10bit PWM, że wyszło ci jakieś 0,95Hz ...... skądś pan to wziął ??? ;)

    Żeby mieć jakiś znośny PWM np do sterowania jasnością diody to minimum powinno to być co najmniej 100Hz a najlepiej dużo więcej od tej wartości.

    czyli np:

    preskaler = 8
    PWM_10bit = 1024

    1000000Hz / preskaler / PWM_10bit = 122Hz

    zatem spokojnie uzyskujesz częstotliwość PWM 122Hz

    No ale taktując procesor 1MHz będziesz tracił strasznie dużo czasu na ten programowy PWM, innymi słowy będzie on zabierał dużo czasu procesora ;)

    dlatego weź pan zajrzyj do FUSEBITÓW i przestaw sobie od razu procka na normalny wewnętrzny oscylator 8MHz i wtedy:

    preskaler = 8
    PWM_10bit = 1024

    8000000Hz / preskaler / PWM_10bit = 976.5Hz

    zatem spokojnie uzyskujesz częstotliwość PWM ok 976Hz

    to już ładna częstotliwość i nic nie będzie migało ;)
  • #4 9727613
    piotrva
    VIP Zasłużony dla elektroda
    Koledze chyba chodzi o jakieś super-wolne PWM, choć nie wiem.
    Sprzętowo przy 1 MHz mnie wychodzi jakieś 900Hz, jak chcesz wolniej to daj na mniejszym kwarcu (choćby ten 32768Hz) i wtedy zbijesz sprzętowo do 32Hz. Ale z drugiej strony, wtedy już programowanie procesora po ISP będzie trwało wieki, a po co Ci w ogóle tak wolne PWM?
    W takiej sytuacji lepiej już taki przebieg generować programowo...
  • #5 9727616
    nsmarcin
    Poziom 12  
    Te 0,95Hz wyszło przy 10bit PWM i preskaler = 1024 a clk =1MHz. A potrzebne mi to jest wyłącznie w celach powiedzmy edukacyjnych dokładnie chcę sterować diodą z okresem 2sek i wypełnieniem np 50% i dioda będzie przez 1sek świeciła a przez drugą sekundę nie. Po prostu chcę naocznie zobaczyć, że dobrze steruję tym PWM.
  • #7 9727661
    nsmarcin
    Poziom 12  
    Jednak wolałbym użyć tylko uC i diody, poza tym to poznanie kolejnych możliwości tego uC być może kiedyś się przyda taka wiedza
  • #8 9727666
    tymon_x
    Poziom 30  
    nsmarcin napisał:
    Jednak wolałbym użyć tylko uC i diody, poza tym to poznanie kolejnych możliwości tego uC być może kiedyś się przyda taka wiedza

    Raczej robisz Sobie pod górkę, jak chcesz tak wolny przebieg, zrób Sobie programowo, też się czegoś nauczysz...
  • REKLAMA
  • #9 9727719
    Osmo
    Poziom 18  
    Zamiast diody, mały głośniczek, wtedy na własne uszy usłyszysz czy PWM działa, do tego można testować w bardzo szerokim zakresie ustawień PWM. Nieco trudniej ustalić wtedy czy działa dobrze, ale zawsze można nagrać dźwięk mikrofonem i w pierwszym lepszym programie do edycji audio dokonać analizy częstotliwości, odczytać wynik, dobrze nagrany będzie się wybijał ponad szum.


    PS. AtMega 8 pozwala na uruchomienie PWM 16-bit o ile dobrze przeczytałem dokumentacje. To pozwala porządnie zredukować częstotliość PWM co z reguły jest bezcelowe ale...
  • #10 9727779
    nsmarcin
    Poziom 12  
    Ale mam problem ze sprzętowym PWM, a nie programowym, chciałbym rozwiązać ten problem, a jeśli się nie da to nie chcę innych rozwiązań zastępczych tylko w miare możliwości to jedno
  • Pomocny post
    #11 9727848
    Osmo
    Poziom 18  
    Ja proponowałem użycie sprzętowego PWM.
    8 MHz / 256 preskaler / 2^16 da Ci w przybliżeniu 0.5 Hz.
    16 bitowe PWM masz na Timer1, obliczenia dla trybu FAST PWM.
    W trybie normalnym (standardowe PWM) trzeba wynik podzielić jeszcze przez 2.
  • #12 9727909
    manekinen
    Poziom 29  
    Minimalna częstotliwość jaką da się uzyskać to 0,015Hz. Teoretycznie, nie bawiłem się nigdy w takie rzeczy, no bo po co?

    Atmega16 taktowana z wewnętrznego oscylatora 1MHz.
    Prescaler dla timera /1024.
    Timer1 jako FAST PWM tryb 14 lub 15, daje 16bit PWM.

    1000000Hz / 1024 / 65536 = 0,0149Hz.
  • #13 9727920
    nsmarcin
    Poziom 12  
    Ja myślałem, że najdokładniejszy jest tylko 10bit PWM a nie ma 16bitowego
    EDIT:
    Kurcze rzeczywiście znalazłem w datasheet'cie Atmegi. Jeśli dobrze rozumiem muszę ustawić bity WGM10, WGM1, WGM12, WGM13 i wtedy rozdzielczość ustawiam przez rejestr ICR1 albo wyzerować WGM10 i rozdzielczość ustawić przez OCR1A. Może mi ktoś powiedzieć czy te dwa sposoby w jakiś konkretny sposób różnią się od siebie?
    EDIT2:
    Mam taki kod ale okres wychodzi mi jakieś 12 sekund:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #14 9728448
    manekinen
    Poziom 29  
    Różnica będzie taka że w trybie 14 nie uzyskasz zerowego wypełnienia, a w trybie 15 nie uzyskasz maksymalnego wypełnienia.

    Jakiś czas temu sam się na to naciąłem TUTAJ

    Dla takiego zastosowania nie ma to znaczenia.

    Szczegóły są w nocie:
    Cytat:
    The procedure for updating ICR1 differs from updating OCR1A when used for defining the TOP
    value. The ICR1 Register is not double buffered. This means that if ICR1 is changed to a low
    value when the counter is running with none or a low prescaler value, there is a risk that the new
    ICR1 value written is lower than the current value of TCNT1. The result will then be that the
    counter will miss the compare match at the TOP value. The counter will then have to count to the
    MAX value (0xFFFF) and wrap around starting at 0x0000 before the compare match can occur.
    The OCR1A Register however, is double buffered. This feature allows the OCR1A I/O location
    to be written anytime. When the OCR1A I/O location is written the value written will be put into
    the OCR1A Buffer Register. The OCR1A Compare Register will then be updated with the value
    in the Buffer Register at the next timer clock cycle the TCNT1 matches TOP. The update is done
    at the same timer clock cycle as the TCNT1 is cleared and the TOV1 Flag is set.
    Using the ICR1 Register for defining TOP works well when using fixed TOP values. By using
    ICR1, the OCR1A Register is free to be used for generating a PWM output on OC1A. However,
    if the base PWM frequency is actively changed (by changing the TOP value), using the OCR1A
    as TOP is clearly a better choice due to its double buffer feature.

    Nie wnikałem dokładnie w sposób działania bo nie było mi to potrzebne.
  • #15 9728473
    nsmarcin
    Poziom 12  
    mi wydaje się, że stosując OCR1A do ustawienia TOP można mieć tylko 100% albo 0% wypełnienie, chociaż ciężko mi w to uwierzyć ale chyba tak jest. W każdym razie przy stosowaniu ICR1 do ustawienia TOP program jakoś działa ale nie dokładnie tak jak bym chciał, problem opisany w poprzednim poście razem z kodem.

    Dodano po 5 [godziny] 47 [minuty]:

    Problem tkwi w częstotliwości uC, która wynosi 1MHz, a nie jak myślałem 8MHz. Jako, że nie wiem jak to zmienić tzn nie bardzo wiem jak dostać się do fuse bitów to zostawiłem 1MHz i preskaler 64 i mam okres 4 sekundy, ale mniej więcej mój problem został rozwiązany. Jeśli ktoś mógłby w przystępny sposób nakierować mniej jak zmienić te fuse bity to byłbym wdzięczny.
  • #18 9730738
    nsmarcin
    Poziom 12  
    Czy fuse bity można ustawiać bezpośrednio w kodzie programu bo PonyProg mi nie działa z moim programatorem
  • #19 9730763
    piotrva
    VIP Zasłużony dla elektroda
    Nie, nawet aplikacje bootloadera nie umożliwiają modyfikacji fusebitów.
    Poza tym, dlaczego PonyProg (nb. program którym najłatwiej zablokować uC)? Jaki masz programator sprzętowy? Jak podasz model to powiemy Ci jaką aplikacją najlepiej zmieniać fuski.
  • #20 9731141
    nsmarcin
    Poziom 12  
    STK500 v.2

    Dodano po 2 [godziny] 2 [minuty]:

    Przy okazji możecie mi wytłumaczyć o czym decydują rejestry ICR1 oraz OCR1A w trybach 14 i 15? Bo z datasheetu nie bardzo to rozumiem.
  • #22 9733627
    dondu
    Moderator na urlopie...
    nsmarcin napisał:
    Czy fuse bity można ustawiać bezpośrednio w kodzie programu ...

    Niestety AVR w przeciwieństwie do PIC-ów tego nie umożliwiają.

    nsmarcin napisał:
    Przy okazji możecie mi wytłumaczyć o czym decydują rejestry ICR1 oraz OCR1A w trybach 14 i 15? Bo z datasheetu nie bardzo to rozumiem.

    To może przyda Ci się polska dokumentacja do tego mikrokontrolera (str. 25):
    http://mikrokontrolery.blogspot.com/2011/04/polska-dokumentacja-atmel.html

    A jeżeli to nie wystarczy to zainwestuj w którąś z książek i od razu wszystko stanie się jasne jak słońce:
    http://mikrokontrolery.blogspot.com/p/ksiazki-dla-ciebie.html
  • #23 9733761
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #24 9734542
    nsmarcin
    Poziom 12  
    O podwójnym buforowaniu wiem, datasheet oryginalny i polski mam ale niewiele mi on tłumaczy w tej sprawie. Chodzi mi konkretnie o to, że mam niby ustawiony tryb 14 czyli zgodnie z tabelą w datasheet'cie wartość TOP ustawiam rejestrem ICR1 natomiast w kodzie programu wygląda to tak, że rejestrem ICR1 mam ustawioną maksymalną wartość licznika, a rejestrem OCR1A wartość wypełnienia. Czy to jest poprawne rozumowanie? I w takim razie w trybie 15 co ustawiam rejestrami ICR1 i OCR1A, czy jest to tak samo jak w trybie 14, a jedyna różnica to brak podwójnego buforowania, czy może coś jeszcze?
  • #25 9737368
    Konto nie istnieje
    Poziom 1  
  • #26 9737743
    nsmarcin
    Poziom 12  
    Chodzi mi konkretnie o tryb 14 i 15, który dostępny jest wyłącznie w Timer1
  • #27 9740812
    Konto nie istnieje
    Poziom 1  
  • #28 9742856
    nsmarcin
    Poziom 12  
    W tych tutorialach nigdzie nie jest pokazane do czego służą rejestry ICR1 oraz OCR1A w trybach 14 i 15

    Dodano po 38 [minuty]:

    Rozumiem tyle, że w trybie 14 rejestrem ICR1 steruje się częstotliwością PWM, a rejestrem OCR1A jego wypełnieniem. Natomiast nie mam pojęcia jak to jest w trybie 15.

    Dodano po 24 [minuty]:

    OK, już wszystko wiem ;)
REKLAMA