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

[ATtiny2313][Bascom] Serwomechanizm - obsługa PWM

astral 10 Lis 2008 23:35 5128 6
REKLAMA
  • #1 5724319
    astral
    Poziom 17  
    Witam,

    po prześledzeniu masy materiałów dotyczących obsługi PWM, oraz sterowania nim serwa nadal mam kilka pytań.
    Następująco:

    Pełen cykl serwa wynosi 50Hz czyli 20ms, podczas którego zwięszkając/zmniejszając wypełnienie o 0.5ms porusza się silnikiem.
    Problem w tym aby dokładnie podzielić zegar procesora (który wynosi 4MHz) na 50Hz. Przy preskalerze o maks. wartości 1024, czas będzie wynosić 0.256ms, jak dalej go opóźnić? Poleceniem Waitms?

    Przykładowy program obsługi PWM wygląda następująco:
    Config Timer1 = Pwm, Pwm = 8, Prescale = 1024, Compare A Pwm = Clear Down
    
    Do
    	Incr Pwm1a
    	If Pwm1a = 255 Then Pwm1a = 0
    	Waitms 5
    Loop
    
    End


    Rozdzielczość PWM 8bit zapewnia 255 kroków co w zupełności wystarcza do sterowania serwem.

    Będę wdzięczny za wszelkie rady w tej kwestii.
  • REKLAMA
  • #2 5724367
    K_o_n_r_a_d
    Poziom 23  
    Źle to rozumujesz. W ten sposób, który pokazujesz tym kodem wykorzystujesz PWM sprzętowy i nie opóźnisz go tak jak myślisz. Przeczytaj datasheeta do swojego uK, rozdział o PWM.

    256 kroków (8 bitów rozdzielczości) masz na cały okres - czyli 20ms a nie na zakres wykorzystywany przez serwomechanizm.
    Ja wykorzystując serwomechanizm i potrzebując ok. 8 kroków w zakresie 90 stopni obrotu użyłem rezonatora kwarcowego o częstotliwości która ładnie podzieliła się na 50Hz.
    Jeśli potrzebujesz więcej kroków to musisz zrobić programowego PWMa (wykorzystując do tego Timery lub dowolnie inaczej).
  • REKLAMA
  • REKLAMA
  • #4 5725154
    astral
    Poziom 17  
    K_o_n_r_a_d, rozumiem. Nie potrzebuję aż tak dużej dokładności na zakres obrotu serwa jaką przypuszczałem. Problem tkwi w uzyskaniu tych 50Hz z zegara 4MHz. Sam preskaler nie jest w stanie tego uzyskać. W jaki sposób to zrealizować? (w tym przykładowym programie opóźnienie "Waitms 5" dałem jako przykładowe - zupełnie przypadkowe).

    ZbeeGin, wiem, że Bascom udostępnia takie polecenie, ale świadomie chciałem to zrealizować na sprzętowym PWM z myślą o przesiadce na C (obecnie jestem zmuszony do korzystania z Bascoma).
    A ponad to użycie tego polecenia, jest to poniekąd pójście na łatwiznę, ponieważ przez to nie będę w stanie zrozumieć sposobu sterowania serwem.
  • #5 5725186
    K_o_n_r_a_d
    Poziom 23  
    astral napisał:
    K_o_n_r_a_d, rozumiem. Nie potrzebuję aż tak dużej dokładności na zakres obrotu serwa jaką przypuszczałem. Problem tkwi w uzyskaniu tych 50Hz z zegara 4MHz. Sam preskaler nie jest w stanie tego uzyskać. W jaki sposób to zrealizować? (w tym przykładowym programie opóźnienie "Waitms 5" dałem jako przykładowe - zupełnie przypadkowe).
    Waitms 5 w żaden sposób nie zmienia okresu Timera.

    astral napisał:
    ZbeeGin, wiem, że Bascom udostępnia takie polecenie, ale świadomie chciałem to zrealizować na sprzętowym PWM z myślą o przesiadce na C (obecnie jestem zmuszony do korzystania z Bascoma).
    A ponad to użycie tego polecenia, jest to poniekąd pójście na łatwiznę, ponieważ przez to nie będę w stanie zrozumieć sposobu sterowania serwem.
    Faktycznie jest w Bascomie Config Servo, ale jest to paskudne rozwiązanie. Nic innego tak bardzo nie obciąża uK jak właśnie to. Samemu, wykorzystując przerwania Timera i w podrpogramie obsługi przerwania zmieniać ustawienia Timera można zrobić równie dokładne (a nawet dokładniejsze, co do 1 taktu zegara) i nie obciążające uK.

    Jeśli taka rozdzielczośc jest wystarczająca to proponuję użyć rezonatora o częstotliwości 3,2768MHz i wykorzystać sprzętowego PWMa - ta częstotliwość ładnie podzieli się na 50Hz.
  • REKLAMA
  • #6 5725538
    astral
    Poziom 17  
    Miałem nadzieję, że uda się to rozwiązać z poziomu programu. Według kalkulatora AVRCalc, przy tej częstotliwości zegara można uzyskać 20ms przy preskalerze 8 i 64.
    Przy 64 rejestr OCR1AL = 0xE2, OCR1AH = 0x04
    W tym wypadku trzeba będzie ręcznie poustawiać w Bascomie rejestry procesora.

    Czy jestem aby na dobrej drodze?
  • #7 5726613
    miroskop
    Poziom 23  
    Serwomechanizm nie musi otrzymywać impulsu dokładnie co 20ms. Będzie działał i przy innych wartościach, dlatego nie warto aż tak się tym przejmować :)
REKLAMA