RTV forum PL | NewsGroups PL

Arduino - zliczanie impulsów

NOWY TEMAT

elektroda.net NewsGroups Forum Index - Elektronika Polska - Arduino - zliczanie impulsów

Goto page 1, 2, 3  Next

Michal M. Lechanski
Guest

Fri Jul 07, 2017 10:01 am   



Ja po prośbie do doświadczonych bardziej niż ja...

Otóż próbuję zliczać obroty koła.

Pomiar 1 (jeden impuls/1 obrót koła):
Czujnik IR TCRT5000 osłonięty po bokach, w odległości ok 10-15mm od
odbijającej powierzchni koła, na której przylepiona jest czarna taśma o
długości ok 10cm. Pomiar na analogowym pinie pokazuje ok 400 gdy przed
czujnikiem jest powierzchnia odbijająca i ok 27 gdy przed czujnikiem
jest taśma.

Pomiar 2 (10 impulsów na 1 obrót koła):
na kole umocowanych jest 10 silnych magnesów (10mm średnica, 5mm
wysokość, materiał N52) odległość miedzy magnesami ok 10cm. CZujnik -
miniaturowy kontaktron. Odległość od magnesu do kontaktronu 3-4mm
(sprawdzone - kontaktron zwiera się już przy odległości ok 15mm od magnesu).

Pomiar 3:
jak pomiar 2 ale zamiast kontaktronu jest czujnik Halla - odległość od
magnesu ok 4-5mm.

pomiar 4 i 5 tak jak 2 i 3, ale ilość magnesów zredukowana do 5

Płytka Arduino UNO R3 ATmega328P (CH340T), nieoryginalne, skrypty bądź z
podręcznika Arduino bądź z instrukcji do czujnika Halla.

Spostrzeżenie - przy wolnych obrotach wszystko działa jak powinno i
impulsy zliczane są poprawnie. Jednak przy nieco większej szybkości w
każdej z powyższych konfiguracji "gubione" są impulsy, czyli zliczonych
jest mniej niż powinno być.
Prędkość przy której impulsy zaczynają być gubione szacuję na 15-20km/h.

Gdyby impulsów zliczane było więcej niż powinno, to w przypadku
kontaktronu zwaliłbym to na wibrację styków... ale tu nie ma znaczenia
jaki czujnik jest zastosowany.
Ja tego nie rozumiem - przecież częstotliwość pracy Arduino jest o wiele
wyższa niż częstotliwość zliczanych impulsów. Czy możliwe jest że płytka
Arduino nie działa poprawnie? A jeśli to nie to, to w czym jest problem?

Z góry dziękuję za jakiekolwiek sugestie.

--
Michał

Cezar
Guest

Fri Jul 07, 2017 10:06 am   



On 07/07/2017 11:01, Michal M. Lechanski wrote:
Quote:

Z góry dziękuję za jakiekolwiek sugestie.


Pokaż kod. Uzywasz przerwań?

c.

Michal M. Lechanski
Guest

Fri Jul 07, 2017 10:09 am   



W dniu 07/07/2017 o 11:05, Zenek Kapelinder pisze:
Quote:
Kup za 20 zlotych licznik do roweru. Bedzie dzialal i jeszcze bedzie mial bezcenna czesc. Bedzie mial ladna obudowe.

Już kupiłem.

Nadal jednak próbuję to zrozumieć.

--
Michał

Michal M. Lechanski
Guest

Fri Jul 07, 2017 10:24 am   



W dniu 07/07/2017 o 11:06, Cezar pisze:
Quote:
On 07/07/2017 11:01, Michal M. Lechanski wrote:

Z góry dziękuję za jakiekolwiek sugestie.


Pokaż kod. Uzywasz przerwań?

Żadnych przerwań. "Kod" dla czujnika IR jak poniżej. Dla innych
czujników poziom "skomplikowania" taki sam.

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int val0;
int irPin0 = 1;
int licznik;

void setup()
{
lcd.begin(16, 2);
licznik=0;
val0=0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("val0 = ");
lcd.setCursor(0, 1);
lcd.print("licznik = ");
}

void loop()
{
val0 = analogRead(irPin0);
if (val0 > 100)
{
licznik++;
}
lcd.setCursor(8, 0);
lcd.print(val0);
lcd.setCursor(10, 1);
lcd.print(licznik);
}

P.S. Przepraszam - w pierwszym poście powinno być:
"Pomiar na analogowym pinie pokazuje ok 27 gdy przed
czujnikiem jest powierzchnia odbijająca i ok 400 gdy przed czujnikiem
jest taśma."

--
Michał

Nifhelm
Guest

Fri Jul 07, 2017 10:40 am   



W dniu 07.07.2017 o 12:24, Michal M. Lechanski pisze:
Quote:
W dniu 07/07/2017 o 11:06, Cezar pisze:
On 07/07/2017 11:01, Michal M. Lechanski wrote:

Z góry dziękuję za jakiekolwiek sugestie.


Pokaż kod. Uzywasz przerwań?

Żadnych przerwań. "Kod" dla czujnika IR jak poniżej. Dla innych
czujników poziom "skomplikowania" taki sam.

#include <LiquidCrystal.h

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int val0;
int irPin0 = 1;
int licznik;

void setup()
{
lcd.begin(16, 2);
licznik=0;
val0=0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("val0 = ");
lcd.setCursor(0, 1);
lcd.print("licznik = ");
}

void loop()
{
val0 = analogRead(irPin0);
if (val0 > 100)
{
licznik++;
}
lcd.setCursor(8, 0);
lcd.print(val0);
lcd.setCursor(10, 1);
lcd.print(licznik);
}

P.S. Przepraszam - w pierwszym poście powinno być:
"Pomiar na analogowym pinie pokazuje ok 27 gdy przed
czujnikiem jest powierzchnia odbijająca i ok 400 gdy przed czujnikiem
jest taśma."

Witam.

Czas konwersji wartości analogowej na cyfrową w Atmedze 328 może sięgać
260us Do tego dochodzi komunikacja z wyświetlaczem. Może po prostu
pomiar trafia przed i za czarną taśmą i stąd gubienie impulsów. Swoją
drogą dziwię się, że przy wolnych obrotach nie zlicza po dwa, trzy i
więcej impulsów na obrót.

Pozdrawiam.

Cezar
Guest

Fri Jul 07, 2017 10:44 am   



On 07/07/2017 11:24, Michal M. Lechanski wrote:
Quote:
W dniu 07/07/2017 o 11:06, Cezar pisze:
On 07/07/2017 11:01, Michal M. Lechanski wrote:

Z góry dziękuję za jakiekolwiek sugestie.


Pokaż kod. Uzywasz przerwań?

Żadnych przerwań. "Kod" dla czujnika IR jak poniżej. Dla innych
czujników poziom "skomplikowania" taki sam.

#include <LiquidCrystal.h

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int val0;
int irPin0 = 1;
int licznik;

void setup()
{
lcd.begin(16, 2);
licznik=0;
val0=0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("val0 = ");
lcd.setCursor(0, 1);
lcd.print("licznik = ");
}

void loop()
{
val0 = analogRead(irPin0);
if (val0 > 100)
{
licznik++;
}
lcd.setCursor(8, 0);
lcd.print(val0);
lcd.setCursor(10, 1);
lcd.print(licznik);
}

P.S. Przepraszam - w pierwszym poście powinno być:
"Pomiar na analogowym pinie pokazuje ok 27 gdy przed
czujnikiem jest powierzchnia odbijająca i ok 400 gdy przed czujnikiem
jest taśma."



W powyzszym kodzie jesli impuls przyjdzie podczas gdy piszesz do LCD,
konsoli lub CPU wykonuje cokolwiek innego to zostanie pominięty.


c.

Piotr Gałka
Guest

Fri Jul 07, 2017 10:45 am   



W dniu 2017-07-07 o 12:24, Michal M. Lechanski pisze:
Quote:
void loop()
{
val0 = analogRead(irPin0);
if (val0 > 100)
{
licznik++;
}
lcd.setCursor(8, 0);
lcd.print(val0);
lcd.setCursor(10, 1);
lcd.print(licznik);
}


Nigdy nic nie pisałem na mikrokontroler.
Nie rozumiem tego programu.
Jeśli to loop() jest jakoś wołane w pętli to przy zatrzymanym kole w
pozycji gdy odczyt analogowy daje >100 licznik będzie ciągle wzrastał.

A zakładając, że to jednak jakoś działa to przypuszczam, że obsługa lcd
zabiera dużo czasu.

Spróbuj wypisywać co 10-ty wynik i zobacz czy prędkość graniczna nie
wzrośnie 10 razy.
P.G.

Michal M. Lechanski
Guest

Fri Jul 07, 2017 10:53 am   



W dniu 07/07/2017 o 11:40, Nifhelm pisze:

Quote:
Swoją
drogą dziwię się, że przy wolnych obrotach nie zlicza po dwa, trzy i
więcej impulsów na obrót.

Taki efekt zaobserwowałem z magnesami i kontaktronem - zliczane były
impulsy gdy kontaktron "najeżdzał" nad magnes i gdy się od magnesu
oddalał. Czyli licznik zliczał dwa razy więcej impulsów niż było
magnesów. Zmniejszenie odległości kontaktronu od magnesu usunęło ten efekt.

--
Michał

Cezar
Guest

Fri Jul 07, 2017 10:54 am   



wyguglaj "arduino analog comparator interrupt count pulses"
Kilka pierwszych stron da Ci gotowce.

c.

Michal M. Lechanski
Guest

Fri Jul 07, 2017 10:56 am   



W dniu 07/07/2017 o 11:01, Michal M. Lechanski pisze:

Quote:
Ja po prośbie do doświadczonych bardziej niż ja...

Panowie, dziękuję bardzo - spróbuję najpierw wyeliminować wpływ opóźnień
związanych z obsługą LCD.

Pozdrawiam

--
Michał

Cezar
Guest

Fri Jul 07, 2017 10:58 am   



On 07/07/2017 11:53, Michal M. Lechanski wrote:
Quote:
W dniu 07/07/2017 o 11:40, Nifhelm pisze:

Swoją
drogą dziwię się, że przy wolnych obrotach nie zlicza po dwa, trzy i
więcej impulsów na obrót.

Taki efekt zaobserwowałem z magnesami i kontaktronem - zliczane były
impulsy gdy kontaktron "najeżdzał" nad magnes i gdy się od magnesu
oddalał. Czyli licznik zliczał dwa razy więcej impulsów niż było
magnesów. Zmniejszenie odległości kontaktronu od magnesu usunęło ten efekt.


Ale w dalszym ciągu możesz dostać złe dane. Przez odsunięcie magnesów
skróciłeś długośc impulsów. Musisz zliczać *zbocza* a nie stany.

c.

Cezar
Guest

Fri Jul 07, 2017 11:00 am   



On 07/07/2017 11:56, Michal M. Lechanski wrote:
Quote:
W dniu 07/07/2017 o 11:01, Michal M. Lechanski pisze:

Ja po prośbie do doświadczonych bardziej niż ja...

Panowie, dziękuję bardzo - spróbuję najpierw wyeliminować wpływ opóźnień
związanych z obsługą LCD.

Pozdrawiam


to jest (nie) rozwiązanie problemu od dupy strony :-)

c.

Nifhelm
Guest

Fri Jul 07, 2017 11:04 am   



W dniu 07.07.2017 o 12:53, Michal M. Lechanski pisze:
Quote:
W dniu 07/07/2017 o 11:40, Nifhelm pisze:

Swoją
drogą dziwię się, że przy wolnych obrotach nie zlicza po dwa, trzy i
więcej impulsów na obrót.

Taki efekt zaobserwowałem z magnesami i kontaktronem - zliczane były
impulsy gdy kontaktron "najeżdzał" nad magnes i gdy się od magnesu
oddalał. Czyli licznik zliczał dwa razy więcej impulsów niż było
magnesów. Zmniejszenie odległości kontaktronu od magnesu usunęło ten efekt.

Funkcja loop() wykonuje się ciągle od nowa. Za każdym przejściem

dokonywane jest sprawdzenie wartości na pinie analogowym i za każdym
razem gdy wykrywana jest taśma stan jest zwiększany. Przy każdym
przejściu zapisywane są też dane d wyświetlacza LCD. Efektem jest długi
czas przejścia pętli oraz to, że jeśli nastąpi dwukrotne sprawdzenie
wejścia analogowego za jednym przejściem taśmy przed czujnikiem, to
zliczone zostaną dwa impulsy.
Po pierwsze zrezygnuj z pomiaru analogowego, bo jest zbyt wolny. Dodaj
komparator i wynik na wejście cyfrowe.
Po drugie zrezygnuj z zapisu LCD jeśli nie zmienia się wartość licznika.
Po trzecie zastosuj wykrywanie przejścia z koła na taśmę, a nie
wykrywanie taśmy (zmiana sygnału a nie jego stan).
A najlepiej zastosuj przerwania.
Pozdrawiam.

Pcimol
Guest

Fri Jul 07, 2017 11:42 am   



On 2017-07-07 12:09, Michal M. Lechanski wrote:
Quote:
W dniu 07/07/2017 o 11:05, Zenek Kapelinder pisze:
Kup za 20 zlotych licznik do roweru. Bedzie dzialal i jeszcze bedzie mial bezcenna czesc. Bedzie mial ladna obudowe.

Już kupiłem.
Nadal jednak próbuję to zrozumieć.

Do zliczania impulsów najprosciej skonfigurować licznik TCNT1 by zliczał
z wejścia T1.

Osobiście jednak trzymam się z dala od kompilatorów typu Arduino, więc
nie wiem jak to dokładnie się robi w tym czymś kompilatoropodobnym.
Natomiast w dowolnym C robi się to bez problemu.

J.F.
Guest

Fri Jul 07, 2017 11:45 am   



Użytkownik "Michal M. Lechanski" napisał w wiadomości grup
dyskusyjnych:ojnp7k$c2c$1$michal_at_news.chmurka.net...
W dniu 07/07/2017 o 11:40, Nifhelm pisze:
Quote:
Swoją
drogą dziwię się, że przy wolnych obrotach nie zlicza po dwa, trzy
i
więcej impulsów na obrót.

Taki efekt zaobserwowałem z magnesami i kontaktronem - zliczane były
impulsy gdy kontaktron "najeżdzał" nad magnes i gdy się od magnesu
oddalał. Czyli licznik zliczał dwa razy więcej impulsów niż było
magnesów. Zmniejszenie odległości kontaktronu od magnesu usunęło ten
efekt.

Tu nam moze program to filtrowac.
Wylapujemy pierwsze zwarcie, wyswietlamy cos na ekranie, czas mija,
odczytujemy pin ponownie ... i z powodu minietego czasu drgan juz nie
ma ..

J.

Goto page 1, 2, 3  Next

elektroda.net NewsGroups Forum Index - Elektronika Polska - Arduino - zliczanie impulsów

NOWY TEMAT

RTV map News map