Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 19 mar 2026, o 10:17


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 7 lut 2017, o 00:07 
Offline
Nowy

Dołączył(a): 05 kwi 2016
Posty: 3
Pomógł: 0

Witam,

chcę zrealizować programowy PWM o rozdzielczości 9 bit, oraz częstotliwości 50Hz na liczniku 16 bitowym na atmedze32.
Moim dotychczasowym pomysłem było skorzystanie z trybu CTC. W momencie zliczenia do 511, wywoływane jest przerwanie.
uC jest taktowany zegarem 8MHz.
8MHz/8/512 = 1953
1953/50 = 39 taktów

Dlaczego programowy? Bo potrzebuję PWM na 5 kanałach (dla 5 serw).

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Niestety taki pomysł nie działa.

Wcześniej na liczniku 8-bitowym zrealizowałem takiego PWM'a przy użyciu przerwania OVF (działa).
Czy tu ma to sens zastosować ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lut 2017, o 07:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 mar 2015
Posty: 116
Pomógł: 16

Przy 5 serwach ,rozważ zastosowanie układu PCA9685 firmy NXP. Jest to 16 kanałowy, 12 bitowy kontroler PWM sterowany magistralą I2C.
Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lut 2017, o 10:40 
Offline
Użytkownik

Dołączył(a): 29 gru 2013
Posty: 82
Pomógł: 3

Dasz radę debouncing w przerwaniu zrobić?
Poza tym nie lubię while'ow w przerwaniu. Możesz mi powiedzieć czemu ten TCNT1 I ICR1 w dwóch miejscach zadajesz? Chyba że źle widzę bo w tapatalku nie działają mi syntaxy.

Wysłane z mojego GT-I9301I przy użyciu Tapatalka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lut 2017, o 18:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1041
Lokalizacja: Trójmiasto
Pomógł: 190

idzik15 napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i tu prawdopodobnie tkwi błąd bo to ustawienie odpowiada preskalerowi 64 a nie 8 przez co częstotliwość sygnału jest bardzo niska (przy wartości 511 rejestru porównania jeśli dobrze liczę to ok 0,5Hz)
Nie wiem też dla czego w rejestrze porównania masz wartość 511? skoro z obliczeń Ci wyszło 39?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lut 2017, o 23:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 lip 2014
Posty: 30
Pomógł: 2

Może pomyśl nad takim sposobem:
- tablica wychyleń serw;
- Timer1 w trybie FastPWM (z preskalerem 8), gdzie TOP to OCR1A;
- wykorzystanie przerwania od OCR1A i OCR1B;
- ustawienie OCR1A na 3 999;
- do rejestru OCR1B wpisujemy wartość wychylenia serwa (np 1023, 1456, - wartości te odpowiadają czasie trwania stanu wysokiego wyrażonego w mikrosekundach).

W przerwaniu od OCR1A ustawiamy pin sterujący serwem np A1 na "1", a do rejestru OCR1B wczytujemy wartość wychylenia z tablicy dla tego serwa. W przerwaniu od OCR1B ustawiany pin sterujący serwem A1 na "0". W kolejnym przerwaniu od OCR1A zmieniamy pin i wartość OCR1B na kolejne serwo, np A2. W następnym przerwaniu od OCR1B ustawiany pin sterujący serwem A2 na "0". I tak dalej, i tak dalej.

Skąd się wzięła wartość 3999 w OCR1A:
1.) częstotliwość z preskalerem : 8 000 000 Hz / 8 = 1 000 000 Hz;
2.) ilość taktów Timer1, by uzyskać 50 Hz: 1 000 000 Hz / 50 Hz = 20 000;
3.) standardowe serwa przyjmują sygnał w zakresie od około 0.8 ms do około 2.2 ms, natomiast długość całej ramki to 20 ms.

Mając te wszystkie informacje możemy założyć, że na obsługę jednego sygnału dla serwa, czas trwania jednego pełnego obiegu Timer1 to minimum 2.5 ms. Dzieląc 20 ms przez 2.5 ms otrzymujemy maksymalną ilość obsługiwanych serw równą 8. Chcąc sterować 5 serwami, wystarczy 20 ms (20 000 taktów Timer1) podzielić przez 5, co daje nam 4 ms (4 000 taktów Timer1). Pamiętając o tym, że zaczynamy liczyć od 0, a nie od 1, to zamiast do OCR1A wpisać 4 000, musimy wpisać 3 999. Mam nadzieję, że w miarę jasno się wyraziłem :P



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO