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



Teraz jest 11 cze 2026, o 00:35


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 23 kwi 2016, o 13:58 
Offline
Użytkownik

Dołączył(a): 08 lut 2015
Posty: 132
Pomógł: 4

Witam. Muszę zrealizować odczyt zewnętrznego sygnału PWM pochodzącego z pewnego czujnika. Sygnał ma być odczytywany przez procesor i odpowiednio obrabiany. Częstotliwość sygnału wynosi 244 Hz, czyli okres sygnału to 4097 us. Najmniejszy okres przy najmniejszym wypełnieniu wynosi 1us.
Proszę o porady w jaki sposób najlepiej obsłużyć taki sygnał ? Dodam, że muszę także wyznaczać czas trwania poszczególnych wypełnień zaczynając od zbocza narastającego i kończąc na zboczu opadającym. Czy do tego celu wystarczy zwykła obsługa sygnału wejściowego przez dowolny pin, czy może wykorzystać przerwania zewnętrzne ? Czy może są jeszcze jakieś inne sposoby na to?
Bardzo proszę o wszelkie porady :) Dodam, że procesor to ATmega32 :)
Pozdrawiam :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 kwi 2016, o 16:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
Może tutaj coś wygrzebiesz: topic14801.html
...bo to prawie to samo.

Pozdr.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 kwi 2016, o 11:19 
Offline
Użytkownik

Dołączył(a): 08 lut 2015
Posty: 132
Pomógł: 4

Wyczytalem, że odpowiednie do tego zastosowania będzie wykorzystanie timera1 jako input capture unit. Jedna rzecz mnie zastanawia. Rozumiem że licznik będzie zliczal z taką częstotliwością jaką ustawie preskaler. Czyli jeżeli chce uzyskać maksymalną różnice 4095 tak jak opisałem to w pierwszym poście to muszę załadować dodatkowo do rejestru licznika timera 1 odpowiednią wartość tak aby uzyskać częstotliwość zmian licznika co 1us tak ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 kwi 2016, o 18:05 
Offline
Użytkownik

Dołączył(a): 08 lut 2015
Posty: 132
Pomógł: 4

Napisałem taki oto program do obsługi tego sygnału, gdzie na początku ustawiam Timer1 do trybu Input Capture:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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


Wartość PulseWidth wyświetlam sobie na wyświetlaczu. Procesor ustawiony jest na taktowanie 16MHz. Przy preskalerze o wartości 8 daje to zmianę licznika Timera1 co 0,5us. W przypadku sygnału PWM, który podaję na sterownik minimalna szerokość impulsu wynosi 1us, a maksymalna 4095. Zgodnie z tym wartość zmienne PulseWidth powinna wynosić od 2 do 8190. Jednak zaczyna się od 6 i kończy na 8002. Czy ktoś mógłby mi wyjaśnić dlaczego tak jest ? Wygląda na to, że czegoś nadal nie rozumiem

Pozdrawiam

------------------------ [ Dodano po: 14 minutach ]

Wszystko już wiem. Okazało się, że czujnik który używam może oscylować swoją częstotliwością PWM w zakresie +/-10% i stąd takie różnice.
Dziękuję koledze "kicajek" za link do tematu :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 kwi 2016, o 21:29 
Offline
Użytkownik

Dołączył(a): 08 lut 2015
Posty: 132
Pomógł: 4

Niestety muszę jeszcze poprosić o pomoc. Napisałem przerwanie, które sprawdza czas trwania sygnału wysokiego oraz niskiego. Niestety przy prawie maksymalnym współczynniku wypełnienia sygnału pojawia się problem. Oba czasy trwania sygnału zarówno wysokiego jak i niskiego są takie same, a przecież czas trwania sygnału wysokiego powinien być możliwie najdłuższy, a niskiego najniższy. Kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Możliwe, że popełniłem gdzieś błąd, którego nie widzę.
Proszę o pomoc :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 kwi 2016, o 22:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
Przecież za powierzchnię nie płacisz - zamieść cały kod ( oczywiście bez Mirkowych bibliotek - jeśli takie są ) to wtedy można obejrzeć.
Być może błąd jest w tym fragmencie który podałeś, ale...
Tak zastanawiam się nad tym warunkiem "if... else" - else wykona się dla każdego innego niż to po if'ie.

Pozdr.



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

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