Jak realizować zliczanie obrotów przez AVR? Wiadomo, licznikiem.
Zrobiłem taki układ i nie działa
Konkretnie:
Zliczam impulsy zewnętrzne licznikiem T0 (8bit). Licznik jest ustawiony jak trzeba.
Impulsy pochodzą z kolektora fototranzystora na podczerwień (950nm). Dioda na podczerwień świeci cały czas. Jak "trafi" na otwór, to tranzystor się otwiera i jest na nim ok. 0,3V (mierzyłem, to działa). Normalnie tranzystor nie przewodzi i jest na nim prawie 5V.
No i stwierdzam, że w liczniku są jakieś przypadkowe liczby
Nawet kręciłem tarczą ręcznie (powoli), to powinien się stan licznika zmieniać o 1. A tu nie! Kolejne wartości są jakby przypadkowe, np: 59, 211, 4, 199, itp.
Gdzie może być błąd? Czy to opadające zbocze na wejściu licznika AVR musi mieć jakieś konkretne parametry? W PDF'ie do procka nic na ten temat nie pisze.
Tu jest schemat:
http://www.redchaos.republika.pl/obroty.jpg
Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięZliczanie obrotów za pomocą uC AVR - dziwne rzeczy
Moderatorzy:Jacek Bogusz, procesorowiec, r-mik, Moderatorzy
-
- -
- Posty:269
- Rejestracja:1 kwie 2003, o 20:32
- Lokalizacja:Bielsko-Biała
W pliku pomocy jest:
Config Timer0 = Counter , Edge = Rising
'Config Timer0 = Counter , Edge = falling
'unremark the line aboven to use timer0 to count on falling edge
'To get/set the value from the timer access the timer/counter register
'lets reset it to 0
Tcnt0 = 0
Do
Print Tcnt0
Loop Until Tcnt0 >= 10
'when 10 pulses are count the loop is exited
'or use the special variable TIMER0
Timer0 = 0
Używasz tej "specjalnej" zmiennej systemowej do odczytywania zawartości licznika?
Config Timer0 = Counter , Edge = Rising
'Config Timer0 = Counter , Edge = falling
'unremark the line aboven to use timer0 to count on falling edge
'To get/set the value from the timer access the timer/counter register
'lets reset it to 0
Tcnt0 = 0
Do
Print Tcnt0
Loop Until Tcnt0 >= 10
'when 10 pulses are count the loop is exited
'or use the special variable TIMER0
Timer0 = 0
Używasz tej "specjalnej" zmiennej systemowej do odczytywania zawartości licznika?
-
- -
- Posty:269
- Rejestracja:1 kwie 2003, o 20:32
- Lokalizacja:Bielsko-Biała
Ja piszę w C korzystam z kompilatora WinAVR.
Odczyt jest banalny: JakaśZmienna=TCNT0 i tyle. Ale nie w tym problem. Dla licznika T1 to działa, dla T0 w trybie Timera też.
Zresztą zrobiłem tak: Zwierałem wejście do masy i działa. Liczy poprawnie-jedno zwarcie licznik o 1 do góry.
Problem jest w fototranzystorze. Nie mam oscyloskopu, bo bym zobaczył jak wygląda przebieg na wejściu licznika. Ale wygląda na to, że jest jakiś chaotyczny pomiedzy stanami +5V a masą.
Odczyt jest banalny: JakaśZmienna=TCNT0 i tyle. Ale nie w tym problem. Dla licznika T1 to działa, dla T0 w trybie Timera też.
Zresztą zrobiłem tak: Zwierałem wejście do masy i działa. Liczy poprawnie-jedno zwarcie licznik o 1 do góry.
Problem jest w fototranzystorze. Nie mam oscyloskopu, bo bym zobaczył jak wygląda przebieg na wejściu licznika. Ale wygląda na to, że jest jakiś chaotyczny pomiedzy stanami +5V a masą.
No właśnie jeśli to nie wina programu to muszą się tam na kolektorze fototranzystora pojawiać "smieći" które licznik zlicza. Zastosuj filtr dolnoprzepustowy RC, jak radzi Gruszek, tylko dostosuj go do czestotliwosci pożądanych impulsów. I proponuje też zwiększyć wartość rezystora kolektorowego, myślę, że lepszy będzie taki z zakresu 1k - 10k.
-
- -
- Posty:269
- Rejestracja:1 kwie 2003, o 20:32
- Lokalizacja:Bielsko-Biała
Licznik
Czesc
Kontaktron i magnesy bylby lepszy, tylko nie wiem czy do 100Hz.
Pamietaj jednak, ze styki podczas zalaczania sie odbijaja i mozesz
miec nawet kilka dodatkowych impulsow. Musle, ze sugestia
z zastosowaniem triggera shmidta, byla by najlepsza.
Pozdrowienia
Kontaktron i magnesy bylby lepszy, tylko nie wiem czy do 100Hz.
Pamietaj jednak, ze styki podczas zalaczania sie odbijaja i mozesz
miec nawet kilka dodatkowych impulsow. Musle, ze sugestia
z zastosowaniem triggera shmidta, byla by najlepsza.
Pozdrowienia
Przepuść sygnał z kolektora twojego tranzystora przez dwie bramki schmidta układu CD4093 ( kolektor do zwartych pinów 12 i 13 , połacz 8,9 i 11 , sygnał pobierz z 10 , zasilanie oczywiście + na 14 GND na 7 ) .
Jak nie potrzebujesz mieć zgodnosci stanów z Twoim projektem to wystarczy jedna bramka i sygnał wyjsciowy z pinu 11.
To powinno wykluczyć problemy sprzętowe. Ja z reguły daje znacznie większy rezystor polaryzacji fototranzystora ( ok 100kOm) .Ale to zalezy od jasności oświetlenia zakłucającego .
Jak nie potrzebujesz mieć zgodnosci stanów z Twoim projektem to wystarczy jedna bramka i sygnał wyjsciowy z pinu 11.
To powinno wykluczyć problemy sprzętowe. Ja z reguły daje znacznie większy rezystor polaryzacji fototranzystora ( ok 100kOm) .Ale to zalezy od jasności oświetlenia zakłucającego .
-
- -
- Posty:269
- Rejestracja:1 kwie 2003, o 20:32
- Lokalizacja:Bielsko-Biała
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość