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



Teraz jest 31 sty 2025, o 08:44


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 13 kwi 2012, o 21:47 
Offline
Użytkownik

Dołączył(a): 18 lut 2012
Posty: 50
Pomógł: 0

Witam
Koncepcja PWM z 16 bitowym timer'em 1 nie dała mi spokoju i postanowiłem do niej wrócić. Jednak tym razem postanowiłem rozpocząć zabawę od wyświetlenia zmiennej uint16_t (od 0 do 64 535) i okazało się, że ujawniła mi się dosyć nie ciekawa sprawa. Aczkolwiek ostatnią zmienną, która jest generowana przez procesor to int16_t (od -32 768 do 32 767) i nie wiem dla czego każda zmienna powyżej int16_t jest degradowana do niej. Oczywiście nie jest ona wkomponowana jak narazie w żadną skomplikowaną procedurę bo wpisałem ją w "czysty" program.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Możecie mi powiedzieć w czym tkwi problem?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 kwi 2012, o 22:00 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27352
Lokalizacja: Szczecin
Pomógł: 1042

Problem w niczym nie tkwi .... niestety co najwyżej kolega nie doczytał w książce na temat tworzenia funkcji lcd_int() :(

Przecież tam wyraźnie masz napisane że posłużyłem się funkcją ITOA() (jak nazwa nadrzędnej funkcji lcd_int) bo chciałem mieć i pokazać jak można zrobić konwersję liczb właśnie int (Integer z zakresu -32768 do 32767) ....

Więc nic nie jest degradowane jak piszesz ;) .... taki był zamiar i warto czytać jak się tworzy takie biblioteki w szczegółach a nie tylko z nich korzystać w ciemno .....

Bo gdyby kolega zajrzał dalej do pliku PDF na własnym dysku z dokumentacją tych funkcji wbudowanych w C to szybko by znalazł odpowiedniki konwertujące do innych zakresów, np:

LTOA() - tym razem Long Int To Ascii

albo

UTOA() - czy np Unsigned To Ascii

wtedy można sobie albo przerobić lcd_ind() albo może lepiej dorobić np:

lcd_lint()

albo

lcd_uint()

co za problem hmmmm? ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 kwi 2012, o 22:19 
Offline
Użytkownik

Dołączył(a): 18 lut 2012
Posty: 50
Pomógł: 0

Dzięki za odpowiedź. Zmodyfikowałem konwersje na utoa i poszło teraz mogę kontynuować zabawę z PWM'em



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 kwi 2012, o 22:23 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27352
Lokalizacja: Szczecin
Pomógł: 1042

Proponuję też zajrzeć na DVD do kodów z lekcji o ADC - tam jest z kolei przykład własnej procedurki konwertującej liczby na ASCII z jakimś prostym formatowaniem - warto popatrzeć jak to można robić we własnym zakresie bo też czasem może się przydać.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 kwi 2012, o 22:59 
Offline
Użytkownik

Dołączył(a): 18 lut 2012
Posty: 50
Pomógł: 0

Jak już pisałem potrzebuję tego typu do PWM i wykonałem je na TIMER1 o dziwo działa jednak jak już pisałeś w książce PWM jeszcze bardziej dzieli Hz dlatego postanowiłem nie preskalować procesora. Rezultat jest taki, że owszem gdy wzrasta "i" długość impulsu jest dłuższa ale wartość odświeżania jest zbyt mała aby oszukać oko, a dodatkowe wyświetlanie tej zmiennej jeszcze bardziej zajmuje procesor. Pytanie więc brzmi: Jak temu zaradzić? Próbowałem zwiększać i zmniejszać rejestr OCR ale chociaż przyśpieszyło się wykonanie zadania to jednak nadal bez oszustwa.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 kwi 2012, o 23:00 
Offline
Użytkownik

Dołączył(a): 18 lut 2012
Posty: 50
Pomógł: 0

Oczywiście mam pod PWM podpięte dwie diody



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 kwi 2012, o 23:10 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27352
Lokalizacja: Szczecin
Pomógł: 1042

Ale ja nie za bardzo widzę o co chodzi - musiałbym przynajmniej twój kod zobaczyć - inaczej nie umiem nic podpowiedzieć :(

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 kwi 2012, o 11:50 
Offline
Użytkownik

Dołączył(a): 18 lut 2012
Posty: 50
Pomógł: 0

Jeżeli dobrze rozumuję działanie timera to jest to taki licznik, który każdy nowy Hz uderzenia procesora inkremenduje jego wartość po czym jeżeli dojdzie do swojej maksymalnej wartości, w tym przypadku 65 536 rozpoczyna liczenie od nowa?
Czyli jeżeli mam taktowanie 20MHz bez preskalacji 20MHz/65 536 = ok. 305Hz? Tyle razy jest zliczane uint16_t przez procesor.

W ostatnim akapicie ze strony 228 jest napisane:
Cytuj:
"Jeżeli nasz licznik zlicza z częstotliwością 40kHz, to jeśli utworzymy PWM 8-bitowy, częstotliwość tę trzeba podzielić przez 256[...]"


Czyli w teorii mam odświeżanie ok 305Hz czyli oko powinno się poddać a reszta programu (wyświetlanie zmiennej na LCD) nie powinno spowalniać działania procesora a dzieje się odwrotnie: inkremendowanie zmiennej jest bardzo spowolnione(bez polecenia delay zachowuje się jakby to polecenie było z wartością ms(100) ) a o "mruganiu" diody nie wspomnę.

Pomyślałem sobie, że jeżeli nie preskaluje automatycznie wykorzystuję 100% procesora to dodałem preskaler przez 8 (305/8=38Hz) niby 25Hz wystarczy ale preskalacja w ogóle nie zmieniła działania diody, owszem inkremendacja zmiennej przyspieszyła się ale to nie jest rozwiązaniem bo program ma działać w 100% a nie w 50%.

Oto kod który wyskrobałem bazując na przykładzie z płyty
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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 kwi 2012, o 13:25 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27352
Lokalizacja: Szczecin
Pomógł: 1042

Po pierwsze to nie zrozumiałeś może do końca - a przecież przytoczyłeś prawidłowy cytat z książki, przeanalizuj sobie jak to jest z tym 8-bitowym PWM'em bo popełniasz duży błąd w rozważaniach i w ogóle niepotrzebnie sięgasz po ten timer 16-bitowy.

pomyśl sobie co ci da to że przy F_CPU = 20MHz użyjesz timera1 i po przepełnieniu będziesz miał 305Hz ???

z tą częstotliwością 305Hz to ty dopiero będziesz miał przerwanie w którym masz zamiar inkrementować liczniki programowych PWM'ów .... to jak sobie to wyobrażasz - przecież nawet jak byś chciał zrobić 8-bitowy to:

305/8 = 38 !!!! i to jest dopiero odświeżanie !!!

a ty przecież chcesz zrobić 16-bitowy więc:

305/65536 = 0.0046Hz ;) co to jest ? coś tam będzie sobie pomigiwać

zacznij może od tyłu to będzie ci łatwiej - np ustalasz sobie że odświeżanie chcesz mieć powiedzmy 100Hz

więc 100 * 65536 = 6553600Hz (6,5MHz !!!!!!) taka musi być częstotliwość timera !!! ale i przerwania - a to już tak mało czasu na wykonanie przerwania będzie, że samo przerwanie będzie absolutnie spowalniać ci działanie nie tylko programu głównego ale będziesz wręcz gubił przerwania jeśli w tej procedurze będziesz nawet proste i niewiele operacji wykonywał. Efektem tego będzie jedno wielkie nieporozumienie niestety

zrób sobie 9- albo nawet 10-bitowy PWM programowy to ci jeszcze się uda żeby procek wydolił

dla 9-bitowego:

100 * 512 = 51200Hz (to i tak już bardzo krótki czas na przerwnia - policz sobie przerwanie musi się wykonać co ok 19us !!! no ale jeśli założyć że weźmiesz taktowanie 20MHz to jeden cykl/rozkaz wykona się w czasie 50ns - teraz zależy ile tych rozkazów będzie w przerwaniu - jeśli podzielisz:

19us / 50ns - to wyjdzie ci że masz 380 cykli pomiędzy przerwaniami. Jeśli zużyjesz kodu na połowę tego to jeszcze będzie jakoś całość działać

przy 10-bitowym będzie jeszcze gorzej ;)

100 * 1024 = 102400Hz ....

czyli przerwanie co ok 9,7us !!!!!!!!!!!!!!

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 kwi 2012, o 13:44 
Offline
Użytkownik

Dołączył(a): 18 lut 2012
Posty: 50
Pomógł: 0

Czyli jeżeli dobrze rozumiem to bardziej się opłaci użyć timera 8-bitowego bo można uzyskać większe odświeżanie a większa rozdzielczość PWM uzyskać za pomocą dania większego typu zmiennej licznik w przerwaniu?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 kwi 2012, o 14:08 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27352
Lokalizacja: Szczecin
Pomógł: 1042

Tzn inaczej - timera to można użyć dowolnego ale jak pisałem w książce:

- jeśli daną operację można wykonać za pomocą timera 8-bitowego i 16-bitowego : to zawsze wybierz 8-bitowy bo 16-bitowy jest cenniejszy z punktu widzenia programistycznego i zostaw go sobie na później ;)

o to z tym chodzi

natomiast w przypadku liczenia podziałów dla programowego PWM to właśnie zapominasz o ostatnim podziale przez rozdzielczość swojego PWM'a

czyli przypominam:

np F_CPU = 8MHz a odświeżanie ma być powiedzmy 150Hz i PWM 8-bitowy:

F_CPU / preskaler / rozdzielczość_PWM / odswieżanie = OCR

8MHz / 1 / 256 / 150 = 208 do rejestru OCR gdy timer odpalisz w trybie CTC

a teraz np:


F_CPU = 20MHz a odświeżanie ma być powiedzmy 100Hz i PWM 9-bitowy:

20MHz / 1 / 51200 / 100 = 3,9 ale można zaokrąglić do 4 to odświeżanie wyjdzie ( 20MHz/1/51200/4 = ok 97Hz)

teraz jaśniej ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 kwi 2012, o 14:23 
Offline
Użytkownik

Dołączył(a): 18 lut 2012
Posty: 50
Pomógł: 0

Czyli nieważne jakiego timera użyję ale ważne jest z jaką rozdzielczością chcę go użyć.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 kwi 2012, o 14:51 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27352
Lokalizacja: Szczecin
Pomógł: 1042

infa08 napisał(a):
Czyli nieważne jakiego timera użyję ale ważne jest z jaką rozdzielczością chcę go użyć.


tak tylko że chodzi o rozdzielczość PWM'a a nie timera w tym wypadku - taka tylko już drobna uwaga.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



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: 13 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO