Witam, chciałbym generować pwm dla serwomechanizmów modelarskich na pinach PD3 i PD4. To samo przerwanie (tak sobie pomyślałem) chciałbym wykorzystać do generowania PWM dla silników DC PC6 i PC1. Sterowanie kierunkiem silników PC5 i PC4 dla jednego oraz PC3 i PC2 dla drugiego.
Sprzęt: Atmega32, kwarc: 16 Mhz.
Teraz po kolei. Utworzyłem sobie "unio-strukturę" wg przepisu Mirka, która będzie mi przetrzymywała dane odpierane z UART. Dane są ładnie aktualizowane wysyłam z terminala i wyświetlam na lcd to działa.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
W pętli głównej poczyniłem dwa switche do aktualizacji kierunku
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
po czym policzyłem sobie jak zrobić PROGRAMOWY PWM dla serw i ten sam dla silników
Dla serw wartość będzie miała możliwość zmieniać się w zakresie 12-26 (union_recive.frame_recive.cam_pion)
Natomiast dla silników 0-256 (union_recive.frame_recive.pwm_p)
Serwa czyli 50 Hz -> 20 ms
50Hz * 256 = 12800 Hz
obliczanie OCR0: 16000000/8/12800 = 156,2
czyli OCR0 = 155.
inicjalizacja Timera 0 wygląda tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
no i teraz treść przerwania :
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
przerwanie działa bo union_send.frame_send.fault (jest w innej strukturze też ze specyfikatorem volatile) wyświetlam na lcd i widać że sobie przelatuje bardzo szybko
natomiast na PC6 PC1 PD3 PD4 nie mam pwm
Dodam że JTAG jest wyłączony oraz wejście TOSC1 (PC6) (na pewno nie działa jako wejscie bo dla pewności na poczatku dorzuciłem ASSR&=~(1<<AS2) )
na dodatek gdy już w pętli głównej użyje
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
to dioda podłączona anodą dla testów do PD2 świeci ciągle.
Ukłony komuś kto spróbuje pomóc.