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



Teraz jest 26 kwi 2026, o 02:03


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 5 sie 2015, o 09:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 582
Pomógł: 17

Witam,
Przymierzam się do zrobienia wyświetlacza widmowego.
Póki co mam prototyp, który działa, ale nie bardzo dobrze.
Wydaje mi się, że wiem w czym tkwi problem, ale nie wiem do końca jak go rozwiązać..

Założyłem sobie, że wyświetlacz będzie podzielony na 20 części, czyli mogę wyświetlić obraz co 18stopni(360/20).

Czytając informacje znalezione w Internecie zasada takiego wyświetlacza powinna być następująca.

1.Odpalamy Timer0(jako licznik), który zlicza czas potrzeby do zrobienia jednego okrążenia wiatraka
2.Konfigurujemy Timer2 tak, aby przerwanie było 20 razy(bo taką założyłem rozdzielczość) częściej niż obrót pełnego obrotu wentylatora.

W przerwaniu Timera2 wystawiamy na port, do którego podpięte są diody nasz obraz.

Czy taka zasada jest poprawna?
#############################################
Bo w rzeczywistości nie działa to najlepiej..
Tzn.
Mój wentylator potrzebuje ok 25ms na wykonanie obrotu (2400 obr/min)
Mam uC napędzany kwarcem 8Mhz.
Konfiguruję prescaler licznika(timera0) na podział przez 1024, co daje mi jeden 'impuls' co 128us.
Więc maksymalną wartość do jakiej może doliczyć licznik (aby się nie przekręcić to ) 128us*255= 32640us=32,6ms.
Czyli wszystko OK.

Teraz ustawiam timer2 jako CTC i wpisuję do niego wartość 20 razy mniejszą niż tą do której doliczył Timer0.

I wszystko niby działa, ale na końcu obrotu widać, że obraz się przesuwa/drga/jest niewyraźny.
Dzieje się to z pewnością dlatego, że te przerwania nie są DOKŁADNIE wykonywane 20 razy w ciągu pełnego obrotu wentylatora.

No bo załóżmy, że licznik(timer0) doliczył do 176 (czyli wentylator obraca się co 176*128us=22,5ms)
i teraz dzielimy 176/20=8.8 niestety nie można wpisać wartości ułamkowej do TIMERA2, aby wyzwolić przerwania więc zostanie ta wpisana wartość 8, i tym samym przerwania nie będą wykonywane 20 razy w ciągu obrotu wentylatora a OKOŁO 20 razy (pewnie coś koło 19 albo)...

Chciałbym się dowiedzieć, czy coś źle robię, czy ta koncepcja jest zła...
Albo jak to rozwiązać?? Mogę użyć timera 16bit, ale mało prockow ma 2 timery 16 bit..
Jak inne osoby to rozwiązaly?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2015, o 10:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1988
Lokalizacja: Lipsko
Pomógł: 125

A masz coś co pozwoli Ci się zsynchronizować z wiatrakiem - taki punkt "0", od którego zawsze zaczyna się wyświetlanie pierwszej lini obrazu ? Bez tego raczej nie będzie to poprawnie działać.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2015, o 10:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 582
Pomógł: 17

Tak. mam Fototranzystor. kóry jest podpięty do wejścia INT1.
Po wystąpieniu przerwania od INTa odczytuje wartość rejestru TCNT0 mnoże razy 128us i mam wynik ile trwa pełny obrót wiatraka

Wszystko działa poprawnie, tylko po prstu nie wiem jak podzielić DOKŁADNIE czas obrotu wentylatora na 20 części.

Tak sobie myślę, może do liczenia czasu trwania obrotu wentylatora będę korystał z timera 8bit, a do podzielenia go na 20 części z timera16 bit...


Spójrzcie.
Jeśli licznik policzy do 176us, to pełnu obrót trwa 176*128us=22528us

Teraz jesli do timera pracującego w trybie CTC wpiszę 176/20=~8
to przerwanie wykonuje się co 1250us,
a 1250*20=25000us
a 25000us != 22528us

------------------------ [ Dodano po: 47 minutach ]

Widzę, problem jest w tym, że licznik2, który miał działac 20 razy cześciej niż licznik0, miał ten sa prescaler, i po prostu do ORC2 wpisywałem wartość TCNT0/20..
To powodowało błędy w dokładności na poziomie nawet 10%

A muszę zmienić prescaler, i wpisać odpowiednią wyliczoną warotść (wtey błędy zmaleją do 0.5%)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2015, o 11:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1988
Lokalizacja: Lipsko
Pomógł: 125

To może po prostu podziel nie na 20 tylko inną wartość

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2015, o 16:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 582
Pomógł: 17

COś mi to nie działa tak jak ma ;/
Mam taki kod:
Pełny obrót trwa ok 26ms..
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

A to test jak to wygląda..
Widać, że skacze...


------------------------ [ Dodano po: 19 minutach ]

Dlaczego ten obraz tak skacze?
Kod jest strasznie prosty.. W czym może tkwić problem?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2015, o 04:45 
Offline
Użytkownik

Dołączył(a): 01 sty 2014
Posty: 116
Pomógł: 14

Ja bym sprobowal w przerwaniu od int1 wyzerowac jeszcze timer 2,i wyswietlic pierwszy obrazek. Trzeba to wszhstko jakos zsynchronizowac. Druga sprawa to mozna usrednic czasy z kilku poprzednich obrotow i otrzymac stabilniejszy obraz;)

------------------------ [ Dodano po: kilkunastu sekundach ]

Albo mozna jeszcze uzyc 16bitowego timera do czasu obrotu



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 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