Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Licznik impulsów, najchętniej na uC

wlw_wl 05 Maj 2009 23:20 3532 23
  • #1 05 Maj 2009 23:20
    wlw_wl
    Poziom 38  

    Witam,

    zwracam się do szerokiego grona z takim pytaniem:

    Chcę zbudować obrotomierz. Ma wyświetlać obroty w postaci linijki LED. Wyświatlanie nie jest tutaj kwestią dyskusji.
    Proszę tylko nie dawać mi linków do gotowych zestawów, gdyż:

    Ma być oparty na procesorze Atmega8. Wejście z czujnika w postaci impulsów 1/obrót.

    Waham się pomiędzy dwoma rozwiązaniami:
    1) Zliczanie ile impulsów wystąpiło w jednostce czasu
    2) Liczenie odstępu czasowego pomiędzy kolejnymi impulsami.

    Zakres odczytu to 0-8000RPM. Oznacza to, że przy 8tyś RPM sygnał wejściowy będzie miał maks. częst. 133,34 Hz.

    W metodzie 1) zastanawiam się jak optymalnie dobrać czas próbkowania żeby mieć dokładność ok. 100RPM oraz dobry czas odświeżania wyświetlacza.

    Metoda 2) jawi mi się jako wykorzystanie przerwania procesora INT0 i liczenia czasu od przerwania do przerwania. (sygnał z czujnika powodujący wywołanie przerwania)

    Co do rozdzielczości czasowej, nie ma problemu żeby zastosować np. generator 16MHz co powinno dać wystarczające taktowanie do zliczania w obu przypadkach.

    Czy koledzy mogą się wypowiedzieć na temat wad i zalet każdej z dwóch metod?

    0 23
  • Arrow Multisolution Day
  • Pomocny post
    #2 06 Maj 2009 09:00
    Luklukowaty
    Poziom 18  

    Moim zdaniem najlepszym rozwiązaniem będzie - "podpiąć impulsy" pod wejście licznikowe i niech zajmuje się liczeniem wewnętrzny licznik. Nie obciążamy wtedy procesora. Drugi licznik (np. cztery razy na sekundę) wylicza obroty i resetuje ten pierwszy licznik.
    Wadą jest problem z liczeniem powolnych impulsów.
    Zalety - prosty, szybki, zużywający mało zasobów procka, dokładny z uśrednianiem i częstotliwość odświeżania zależy od tego drugiego licznika.


    Wadą liczenia odstępu pomiędzy kolejnymi impulsami jest to, że nie mamy uśrednionego wyniku, pomiar może się wahać i zużywamy sporo mocy procka na pierdoły i jest bardziej skomplikowany. Natomiast łatwo jest zrealizować liczenie powolnych impulsów.

    Ja bym wybrał pierwsze. Co do pierwszego - policz sobie ile trwa 100rpm i dobierz czasy.

    0
  • Pomocny post
    #3 06 Maj 2009 13:19
    Ravender
    Poziom 18  

    robilem cos takiego i tez poszedlem drogą licznika i timera. Timer odmierzał kwanty czasu, a licznik przerwania INT0.
    Dodatkowo wykorzystałem sobie jakieś przełączniki DIP do zmiany szerokości okienka czasowego w których liczone są impulsy.

    0
  • #4 06 Maj 2009 18:14
    wlw_wl
    Poziom 38  

    Dziękuję za odpowiedzi!

    Obiążenie procesora nie jest problemem, ponieważ poza wyświetlaniem obrotów nic innego nie robi.

    Przy 100RPM sygnał będzie miał częstotliwość 1,67Hz. Oznacza to, że trzeba by próbkować dwie sekundy, żeby "odróżnić" 0RPM od 100RPM.
    Za długo, więc zmienię dokładność na 500RPM. To daje 8,34Hz więc wystarczy próbkować licznik 9 (10 dla zaokrąglenia) razy na sekundę.
    Jak pisałem wcześniej, przy 8000RPM sygnał będzie miał częst 133.34Hz, czyli przy próbkowaniu 10x/s to będzie 13-14...

    Tak więc liczenie impulsów - licznik przerwania INT0.

    Ravender Twój pomysł ze zmianą próbkowania bardzo mi się podoba, ale nie wiem jak to zrealizować :cry:

    Pokombinuję z napisaniem programu i dam znać co z tego wyszło :)

    ed:
    Jeszcze taka spraweczka maciupcia:
    Impuls na INT0 będzie przychodził z czujnika hallotronowego, który daje 12V w stanie wysokim.
    W nocie Atmegi na stronie Atmela czytam, że napięcie dla stanu wysokiego na pinach musi być z zakresu od 0.6*Vcc do 0.5V+Vcc, ale nie wiem jaki prąd tam maks. może płynąć (obciążenie pinów może być maksymalnie 40mA, ale nie wiem czy "w drugą stronę" jest tyle samo).
    Pytanie: czy opornik 350 Ohm będzie odpowiedni?

    0
  • #5 07 Maj 2009 08:24
    Luklukowaty
    Poziom 18  

    Nie możesz podpiąć 12V do wejścia ATmegi jak sam zauważyłeś.

    Obciążenie prądowe jest dla WYJŚCIA. Pobór prądu przez wejścia ATmegi są znikome i uzależnione jest to od ich rezystancji.

    Co do tego rezystora - pojedynczy rezystor ograniczy Ci jedynie prąd, a nie napięcie - musisz zastosować dzielnik napięciowy - tu masz link jak sobie to wyliczyć - http://pl.wikipedia.org/wiki/Dzielnik_napi%C4%99cia

    I pamiętaj, że masa układu 5V i 12V musi być wspólna.

    0
  • Pomocny post
    #6 07 Maj 2009 09:06
    Ravender
    Poziom 18  

    W kwestii timerów i przerwań, to mozesz przeczytać o tym na mojej stronie:

    Timery: http://wkretak.pl/readarticle.php?article_id=3

    Co do tych dipów to miałem ich trzy czyli mogłem sobie wymyślić 8 różnych zakresów. Powiedzmy ze przełączniki te podepniesz pod PB0, PB1 i PB2.
    I potem robiłem coś w stylu:

    zakres = (PINB.0) + (PINB.1 * 2) + (PINB.2 * 4);
    Jest to oczywiście pseudokod bo w C nie można zrobić zapisu PINB.0.

    Mając zakres bedacy liczba od 0 do 7 mozesz sobie w petli WHILE zrobic jakas petle SWITCH i tam po prostu wpisywac
    jesli zakres 0 to OCR1A = 500; (Jaki rejestr odpowiada za wartosc timera musisz sprawdzic w swoim datasheetcie).

    A co do tych 5 i 12 V to zrob po prostu optoizolacje na transoptorach. Ja tak robię bo steruję wejściami i wyjściami na poziomie 24V przy pomocy procka 5V.

    O optoizolacji przeczytasz tutaj:
    http://wkretak.pl/readarticle.php?article_id=17

    0
  • #7 07 Maj 2009 12:51
    wlw_wl
    Poziom 38  

    Luklukowaty napisał:
    Nie możesz podpiąć 12V do wejścia ATmegi jak sam zauważyłeś.

    Obciążenie prądowe jest dla WYJŚCIA. Pobór prądu przez wejścia ATmegi są znikome i uzależnione jest to od ich rezystancji.

    Co do tego rezystora - pojedynczy rezystor ograniczy Ci jedynie prąd, a nie napięcie - musisz zastosować dzielnik napięciowy - tu masz link jak sobie to wyliczyć - http://pl.wikipedia.org/wiki/Dzielnik_napi%C4%99cia

    I pamiętaj, że masa układu 5V i 12V musi być wspólna.


    Dzięki wielkie, moja wiedza z tego zakresu ogranicza się głównie do prawa Ohma i próbowałem to jakoś podciągnąć :D Zrobię dzielnik i będzie ślicznie.

    Tak, masa jest wspólna.

    Ravender:
    Z transoptorem będzie tak to wyglądało jakoś?
    Schemat.pdf

    0
  • #8 09 Maj 2009 12:14
    Ravender
    Poziom 18  

    Z tym tranzystorem to lepiej jak to zrobisz tak jak na rysunku A.

    Ja np robię tak jak na rysunku B.. i mam wyjście otwarty kolektor..
    http://img9.imageshack.us/img9/9580/aaaafxd.jpg

    dop:
    sie zapędziłem.. ty chcesz mieć wejście na transoptorze, to po prostu zamień sobie napisy 5V i 12V i masa5V i masa12V miejscami :) no i wartości rezystoró tez bedzie trzeba pewnie zmienic

    0
  • Arrow Multisolution Day
  • #9 09 Maj 2009 12:31
    Luklukowaty
    Poziom 18  

    1) Faktycznie rozwiązanie z transoptorem jest lepsze niż dzielnik napięciowy bo dodatkowo separuje Ci wejście.
    2) Całkowicie nie rozumiem toku rozumowania kolegi Ravander'a - układ A wg. mnie nie będzie działać (poczytajcie na: http://pl.wikipedia.org/wiki/Wsp%C3%B3lny_emiter oraz http://pl.wikipedia.org/wiki/Wsp%C3%B3lny_kolektor ), układ B jest zbytnio skomplikowany.

    Zrób tak - R34 daj 10k, nie potrzebujesz 1k, szkoda prądu. Emiter daj do masy a to INT0 podłącz do kolektora. W ten sposób będziesz mieć wyjście zanegowane, ale nie ma to najmniejszego znaczenia dla uPC i zbędne jest stosowanie inwertera (przecież to mikrokontroler !!).

    Te 540R rozumiem, że wyliczyłeś z prawa Ohma na podstawie napięcia przewodzenia wybranego transoptora i prądu diody?

    Dodaj też szybką diodę zabezpieczającą (np. 1N4148) w odwrotnym kierunku niż dioda transoptora - niestety są mało odporne na napięcia wsteczne, a to skutecznie zabezpieczy na jakieś drobne przepięcia.

    Dodałbym również kondensator 100nF przy nóżkach diody, również w celach zredukowania zakłóceń... (chociaż nie wiem jaka ma być częstotliwość sygnału wejściowego).

    0
  • #10 09 Maj 2009 12:52
    wlw_wl
    Poziom 38  

    Emiter do masy a INT0 do kolektora... czyli sygnał na wejściu będzie podpinał INT0 do masy, więc przerwanie będzie generowane przez low level? Wtedy samo INT0 musi mieć stan wysoki, bo jak będzie miało 0 i podłączę 0 to nie będzie sygnału wcale...

    540R wyliczyłem z prawa Ohma na podstawie transoptora takiego jak umieściłem na schemacie, czyli PC817, prąd 20mA, napięcie 1.2V (1.4 max).

    Sygnał będzie miał max. częstotliwość ok 140Hz, więcej mnie nie interesuje (do 8000rpm). Przy takiej częstotliwości znaczących zakłóceń nie powinno być, chociaż kto wie co pełza po instalacji samochodowej...

    Czy możesz mi wyjaśnić podłączenie INT0, które zaproponowałeś?

    Gdyby to był inny port, tzn. port użyty jako zwykły port I/O, to mogę go ustawić na stan wysoki i sygnałem będzie dla mnie (dla procka) umasienie pinu. Nie wiem, czy mogę tak zrobić z pinem ustawionym na INT0...

    0
  • Pomocny post
    #11 09 Maj 2009 13:07
    Luklukowaty
    Poziom 18  

    Jeżeli pin ustawiony masz na wejście to on sprawdza co na nim jest. Nie myl wejścia z wyjściem i nie ma tu znaczenia, czy to będzie zwykły port I/O czy z funkcją przerwania INT - wejście jest wejściem. Fakt, że masz możliwość włączenia rezystorów pull-up lub pull-down, jednakże w tym przypadku jest to zbędne bo R34 będzie działać jako pull-up (i to mocniejszy, bo w AVR pull-up są koło 100k).

    Tak - przerwanie powinno być generowane przy wykryciu zbocza opadającego na INT0.

    Co do zakłóceń - zakłócenia zawsze są i niestety trzeba się przed tym zabezpieczać :(

    Co do wyjaśnienia podłączenia INT0 - zapytaj się o coś konkretnego, bo wszystko co napisałem zdaje mi się jasne.

    0
  • #12 09 Maj 2009 13:17
    wlw_wl
    Poziom 38  

    Chodziło mi o zasadę działania, czy dobrze ją zrozumiałem.

    Uwzględniając wszystkie zmiany, jeśli się nie mylę, powinno to wyglądać tak:
    Schemat.pdf

    0
  • #13 09 Maj 2009 13:21
    Luklukowaty
    Poziom 18  

    No prawie dobrze - kolektor do INT0 oraz poprzez R34 do 5V, natomiast emiter do masy.

    0
  • #14 09 Maj 2009 13:40
    wlw_wl
    Poziom 38  

    Czyli jednak się nie zrozumieliśmy co do podłączenia INT0.

    Ja zrozumiałem to tak, że INT0 jest łączone przez tranzystor z masą, ale nie jest do niego podłączone +5V. Teraz to wygląda następująco:
    Schemat.pdf

    0
  • #15 09 Maj 2009 13:44
    Luklukowaty
    Poziom 18  

    Tak - teraz jest OK, tylko teraz zamieniły Ci się nóżki 1 i 2 transoptora. Anodę dajesz do masy, a zasilanie podajesz na katodę, czyli na odwrót.

    Zamień 1 z 2 i powinno być wszystko OK.

    0
  • #16 09 Maj 2009 13:50
    wlw_wl
    Poziom 38  

    Poprawione, linka już nie przeklejam, ten sam co wyżej.
    Jak już tu rozmawiamy, mógłbyś rzucić okiem czy zasilanie tych LEDów prosto z linii +12 przez oporniki jest ok? Wcześniej miałem je też za stabilizatorem ale +5V na 4 ledach szeregowo... to -3V :) Mało przemyślane rozwiązanie. Wszystkie LEDy liczyłem na 2V i 20mA, stąd te wartości oporników.

    0
  • #17 09 Maj 2009 13:56
    Luklukowaty
    Poziom 18  

    Jeszcze dioda D1 na odwrót, bo w ten sposób robi Ci zwarcie.

    Co do LEDów, właśnie zauważyłem, że dałeś z linii 12V, jednakże zastanawiam się jak jest z kwestią stabilności napięcia w samochodzie. Chodzi mi o to, że przeważnie jest chyba napięcie coś koło 14,4V i zmienia się podczas jazdy, postoju, etc. i się zastanawiam, czy nie lepiej dać jakiś stabilizator na tą linię, np. o napięciu 10V na wyjściu... ale w tym nie mam doświadczenia, a nie chcę strzelać w ciemno.

    Chyba, że te 12V to faktycznie będzie zawsze 12V to OK :)

    0
  • #18 09 Maj 2009 14:08
    wlw_wl
    Poziom 38  

    Obróciłem całą grupę i zapomniałem przełożyć diodę :oops:

    Te 12V to raczej tak umownie... Tylko że stabilizator, np. 7810 nie będzie działał, jeśli napięcie spadnie poniżej 12V, bo musi mieć MIN Vin = Vout+2V (7810 ma nawet napisane, że co najmnie 12,5V).

    Na postoju to może nie świecić, bo raczej obrotów wyłączony silnik nie ma :) Ale dzięki za zwrócenie uwagi, może lepiej będzie policzyć oporności dla ok 14-15V, najwyżej przy 12 trochę słabiej będą świecić.

    0
  • #19 09 Maj 2009 22:08
    Ravender
    Poziom 18  

    Luklukowaty -> a co ma nie działać w układzie A ?
    To zwykły klucz nieodwracający! Tylko go źle podpisałem (zamiast 12V powinno być 5V).

    0
  • #20 09 Maj 2009 23:06
    Luklukowaty
    Poziom 18  

    Ravender - może inaczej. Pokaż mi kto stosuje wzmacniacz prądowy do transoptora... (oprócz Ciebie i informacji zawartych na stronie, którą promujesz)

    Jakiś PDF transoptora, jakiś może schemat układu elektronicznego z gazety, a może i profesjonalnego układu z masowej produkcji...

    Pomogę Ci w tą drugą stronę:
    Strona 6 - http://www.datasheetcatalog.org/datasheet/toshiba/2212.pdf
    Strona 6 i 11 - http://www.fairchildsemi.com/ds/6N/6N138.pdf
    Strona 2 - http://sklep.avt.pl/photo/_pdf/AVT842.pdf?sess_id=89aecd2406202f5ce1d829553f028639
    Strona 2 - http://www.simandl.cz/stranky/elektro/fastsci/soubory/pc900v.pdf
    Strona 4 - http://www.r2d2.faith.pl/zdjecia/pc827.pdf
    więcej mi się nie chce szukać.


    Nie twierdzę, że kategorycznie nie będzie działać bo wejścia AVR mają bardzo dużą rezystancję, ale pewnych rzeczy moim zdaniem się nie robi.

    A tutaj masz o tranzystorach:
    http://www.elportal.pl/pdf/k01/40_03.pdf oraz http://www.elportal.pl/pdf/k01/38_04.pdf

    Możliwe, że się mylę... bo tylko głupcy się nie mylą :)

    0
  • #21 10 Maj 2009 09:09
    Ravender
    Poziom 18  

    Luklukowaty -> dzięki za informacje! I tak jak napisałeś, tylko głupcy się nie mylą!

    Wg. plików które wysłałeś, po prostu lepiej "brać" wyjście odwrócone z kolektora.

    A co powiesz na układ B z mojego wczesniejszego rysunku? Wykorzystuję go jako połączenie uK 5V z wejściej sterownika s7 24V?

    0
  • #22 10 Maj 2009 12:26
    Luklukowaty
    Poziom 18  

    Układ B wg. mnie jest w porządku. Odradzałem jego stosowanie tylko wyłącznie ze względu niepotrzebnego mnożenia elementów, bo przecież w uPC możemy reagować na zbocza opadające lub rosnące, czyli jest to w sumie obojętne i nie trzeba stosować inwertera tylko po to, żeby nam na kartce wszystko ładnie i prosto logicznie wyglądało.

    Natomiast tam gdzie musimy mieć niezbędnie wyjście nieodwracające, to tak - jak najbardziej można taki układ zastosować ;)


    P.S.
    Co do tego rezystora 10k do kolektora transoptora. Możliwe, że przesadziłem i chyba faktycznie lepiej jest dać rezystor 1k...

    0
  • #23 11 Maj 2009 16:20
    wlw_wl
    Poziom 38  

    Luklukowaty napisał:
    Co do tego rezystora 10k do kolektora transoptora. Możliwe, że przesadziłem i chyba faktycznie lepiej jest dać rezystor 1k...

    Proszę o rozwinięcie wątpliwości zanim znów zmienię schematy ;)

    0
  • #24 12 Maj 2009 08:25
    Luklukowaty
    Poziom 18  

    Ponieważ na większości schematów widzę rezystory w okolicy 1k. Nie wiem z czego to się bierze, podejrzewam, że chodzi o jakość transoptorów, stromość zbocza, etc... dlatego mam wątpliwości :)

    0