Licznik rowerowy


Witam

Chciałbym się zapytać jak można mierzyć prędkość na avr.
Chciałem zrobić licznik rowerowy na attiny2313 i lcd 2x8 mam akurat kontrakton od starego licznika i dla ułatwienia mógłbym go umieścić w tym miejscu w którym kółko robi 1m, tylko jak napisać program, chciałem zrobić że kiedy flaga 1s jest równa 1 wtedy zwiększ zmienna i prędkosc = zmienna x3.6 ale to kiepski pomysł i mam pytanie czy ktoś mógłby napisać kawałek kodu odpowiedzialny za pomiar i konwersje predkości do km/h czujnik dla ulatwienia bedzie ustawiony na wysokości kiedy 1impuls=1metr.

Z góry bardzo dziękuję




mirley's picture

Re: Licznik

Można mierzyc impulsy w okeślonym czasie lub czas między impulsami, z czego pomiar czasu między impulsami wydaje mi się lepszym rozwiązaniem. To gdzie umieścisz czujnik na kole nie ma najmniejszego znaczenia, lepiej umieścić go mozliwie blisko osi żeby prędkość liniowa magnesu nie była duża (ułatwi to odczyt, reakcje kontaktronu).

Ważny jest dokładny pomiar obwodu koła wraz z oponą, przeważnie jest to około 2,14m, jeśli zarejestrujesz jeden impuls to znaczy że rower przebył dokładnie drogę obwodu koła. jeśli zliczysz impulsy w czasie kilku sekund to podzielisz 2,14m*impulsy przez czas i otrzymasz prędkość w m/s potem *3,6 i jest km/h.

Lepszym pomysłem wydaje mi się pomiar czasu między impulsami... wtedy dzielisz 2,14m przez ten czas w sekundach i masz prędkość roweru, z tym że dokładność pomiaru czasu jest znacznie większa, bo np dla 70km/h będzie to czas 100ms co nie jest problemem do pomiaru, za to jeśli w czasie sekundy zrobi ci się raz 5 impulsów a raz 6 jadąc z prędkością dającą taki niepewny odczyt to prędkośc uzyskasz zmieniającą się 38 do 46 km/h

----

W wolnej chwili napiszę ci parę linijek kodu... ale narazie sam pokombinuj.... Nie wiem jak będzie wyglądała sprawa ze zużyciem energii i drganiami podczas pracy więc jaki masz dokładnie cel robiąc swój własny licznik a nie kupując gotowego?

mordacz222's picture

Czyli mam zrozumieć że do

Czyli mam zrozumieć że do wykrycia impulsu mam użyć licznika w trybie counter a drugi w trybie timer i preskaler dac tak aby mierzyl czas rzedu kilka us ale jak dokladnie

zrobic to

Quote:
2,14m*impulsy przez czas i otrzymasz prędkość w m/s potem *3,6 i jest km/h

napisz tylko jakis kawaleczek zebym mogl bardziej kombinowac.

A licznik robię na lekcje mieliśmy zadanie i pomyślałem że zrobię taki prędkościomierz razem z termometrem ds1820 i dam go siostrzeńcowi który mówił żeby zrobić mu licznik w jakieś fajnenj obudowie, zasilanie będzie z baterii 9v a kiedy licznik nie wykryje impulsu przez np 30 sekund to przejdzie do powerdown czy powersave nie pamiętam dokładnie.

mirley's picture

Re: Licznik

Nie trzeba używać liczników w trybie counter... ja bym wykorzystał przerwanie zewnętrzne i timer skonfigurowany na przerwania co 1ms... Timer zwiększa zmienną co 1ms, jeśli wykryje impuls to na podstawie tej wartości oblicz prędkość, czas w ms to ilość impulsów z timera, potem zeruje zmienną. Taka prosta metoda daje dokładność do 1ms i to wystarczy

Mówię tutaj o pomiarze czasu między impulsami a nie o pomiarze impulsów, program poniżej dla attiny 2313, wejściem kontaktronu jest PD.2 (wejście INT0), piny do LCD musisz sobie sam pozamieniać

'************* Konfiguracja uC *****************
'***********************************************
$regfile = "attiny2313.dat"
$crystal = 16000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111011 : Portd = &B11111111
 
 
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2       'avt 2313 test boart
Config Lcd = 16 * 2
Cls
Cursor Off Noblink
 
On Int0 Przzew0 Nosave
Config Int0 = Falling
Enable Int0
 
 
Config Timer0 = Timer , Prescale = 64
Enable Timer0 : On Timer0 Prztimer0
 
 
Enable Interrupts
'********** Konfiguracja uC Koniec  ************
 
'******************  Zmienne *******************
'***********************************************
 Dim Licznik As Word
 Dim V As Single
'*************  Zmienne Koniec  ****************
 
 
'**************  Petla glowna ******************
'***********************************************
Do
 
Loop
End
'************ Petla glowna Koniec **************
 
 
'********** Przerwanie Zewnetrzne **************
'***********************************************
Przzew0:
  V = 2.14 / Licznik
  V = V * 3.6
  Licznik = 0
  Locate 1 , 1
  Lcd V ; "    "
Return
'****** Przerwanie zewnetrzne koniec  **********
 
 
'************ Przerwanie timer 0 ***************
'***********************************************
Prztimer0:
  Incr Licznik
Return
'******** Przerwanie timer 0 Koniec ************

mordacz222's picture

Bardzo dziekuje za ten

Bardzo dziekuje za ten kawalek rzeczywiście bardzo proste czyli 2,14 mam sobie dostosować do własnych potrzeb tak jaki mam obwód koła, a wyświetlanie na lcd mogę sobie przenieść gdzie indziej do programu, i ostatnie pytanie gdzie najlepiej umieścić kontrakton przy osi czy przy oponie?

grizz's picture

Quote:gdzie najlepiej

Quote:
gdzie najlepiej umieścić kontrakton przy osi czy przy oponie?

Tam gdzie pasuje. Niby im wyżej (bliżej opony), tym lepiej, ale zazwyczaj odległość od widelca jest tam większa, wiec może być zakłócony odbiór.

drowning_man's picture

odległość

Mirley juz o tym pisął! Najlepiej umieścić kontaktron blisko osi obrotu, że względu na mniejszą prędkość liniowa magnesu nie była za duża. A czym mniejsza prędkość liniowa tym 'pewniejszy' bedzie odczyt.

grizz's picture

Quote:Najlepiej umieścić

Quote:
Najlepiej umieścić kontaktron blisko osi obrotu, że względu na mniejszą prędkość liniowa magnesu nie była za duża
.

Hmm ciekawe, ale z tego co pamiętam, w instrukcjach liczników zawsze było napisane, żeby umieszczać jak najbliżej opony...

drowning_man's picture

kontaktron

Ze względów fizycznych stabilniej będą pracowały bliżej osi. Jednak długość 'przelatywania' magnesu przy kontaktronie też może mieć wpływ. Im bliżej osi obrotu to odczyt jest stabilniejszy ale dłuższy, a czym dalej to traci się na stabilności, a zyskuje na szybkości impulsu... Z tego wszystkiego można wywnioskować, ze najlepiej całośc bedzia działała pomiędzy, czyli w połowie odległości od ośki do opony:-).

mordacz222's picture

Zrobiłem ten licznik dodałem

Zrobiłem ten licznik dodałem pomiar temperatury i działa kontrakton dałem mniejwięcej w połowie i działa dobrze a i siostrzeniec zadowolony, dzięki mirley za pomoc.

mordacz222's picture

Aha mam jeszcze jedno pytanie

Aha mam jeszcze jedno pytanie nie związane z licznikiem, chciałbym wykonać sobie zasilacz beztransformatorowy i pytanie po co w tych zasilaczach kondensator przed mostkiem skoro i tak nie robi ochrony galwanicznej układu i jakiej mocy musiała by być zenerka żeby pobrać 5A.

grizz's picture

Quote:Zrobiłem ten licznik

Quote:
Zrobiłem ten licznik dodałem pomiar temperatury i działa kontrakton dałem mniejwięcej w połowie i działa dobrze a i siostrzeniec zadowolony, dzięki mirley za pomoc.

Z ciekawości - możesz pokazać zdjęcia?

Quote:
Aha mam jeszcze jedno pytanie nie związane z licznikiem, chciałbym wykonać sobie zasilacz beztransformatorowy i pytanie po co w tych zasilaczach kondensator przed mostkiem skoro i tak nie robi ochrony galwanicznej układu i jakiej mocy musiała by być zenerka żeby pobrać 5A.

Sio na forum ( http://mirley.firlej.org/forum ) z tym pytaniem

mordacz222's picture

Zdjecia narazie nie dam bo

Zdjecia narazie nie dam bo dosc popsulem obudowe ale jak to poprawie to napewno dam

Post new comment

  • You can use BBCode tags in the text. URLs will automatically be converted to links.
  • Use the special tag [adsense:format:slot] or [adsense:format:[group]:[channel][:slot]] or [adsense:block:location] to display Google AdSense ads.
  • You can enable syntax highlighting of source code with the following tags: [code], [blockcode], [c], [cpp], [java], [javascript], [php], [python], [qb].
  • Image links with 'rel="lightbox"' in the <a> tag will appear in a Lightbox when clicked on.

More information about formatting options