Goto page Previous 1, 2, 3 Next
Nifhelm
Guest
Fri Jul 07, 2017 12:03 pm
W dniu 07.07.2017 o 13:42, Pcimol pisze:
Quote:
On 2017-07-07 12:09, Michal M. Lechanski wrote:
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.
W sumie dość prosto.
Trzeba podłączyć sygnał do wejścia D2 lub D3 w Arduino, uruchomić
przerwania zewnętrzne na tym wejściu i napisać procedurę obsługi
przerwania która będzie zwiększać wartość licznika o 1 o ile od
poprzedniej zmiany minął określony czas (likwidacja drgań). I sprawa
załatwiona.
Pozdrawiam.
Zenek Kapelinder
Guest
Fri Jul 07, 2017 12:05 pm
Kup za 20 zlotych licznik do roweru. Bedzie dzialal i jeszcze bedzie mial bezcenna czesc. Bedzie mial ladna obudowe.
J.F.
Guest
Fri Jul 07, 2017 12:18 pm
Użytkownik "Pcimol" napisał w wiadomości grup
dyskusyjnych:ojns34$tgg$1@mx1.internetia.pl...
On 2017-07-07 12:09, Michal M. Lechanski wrote:
Quote:
Do zliczania impulsów najprosciej skonfigurować licznik TCNT1 by
zliczał z wejścia T1.
Ale wtedy bedzie wszystkie drgania zliczal.
I trzeba zmienic koncepcje, albo dodac na plytce uklad eliminujacy
drgania :-)
Wiec zmieniajac watek ... no nie, tu sie z Piotrem zgodze, ze to zaden
przyklad, bo o drganiach to w kazdej ksiazce pisza, wiec projektant
powinien od poczatku dobrze zaprojektowac.
P.S. te optyczne uklady chyba maja jakas histereze ... wiec zachodzi
potrzeba rozpoznania bojem czy wystarczajaca.
Aaa ... tu mamy jakis "analogowy", to histerezy nie ma, a bój sie
komplikuje :-)
Summa summarum - moze kolega dobrze zrobil, ze pod DAC podpial, tylko
teraz trzeba bedzie dobry program napisac :-)
J.
Marek
Guest
Fri Jul 07, 2017 3:22 pm
On Fri, 7 Jul 2017 13:42:16 +0200, Pcimol <a@b.com> wrote:
Quote:
nie wiem jak to dokładnie się robi w tym czymś kompilatoropodobnym.
Akurat Arduino to opakowany avr-gcc więcć trudno to nazwać
kompilatoropodobnym...
--
Marek
Guest
Fri Jul 07, 2017 10:19 pm
W dniu piątek, 7 lipca 2017 12:01:02 UTC+2 użytkownik Michal M. Lechanski napisał:
Quote:
Ja po prośbie do doświadczonych bardziej niż ja...
Otóż próbuję zliczać obroty koła.
(...)
Z góry dziękuję za jakiekolwiek sugestie.
Zacząc nalezy od tego że wykrywasz poziom zamiast zmiany stanu.
Zmien program na dwa sposoby:
po pierwsze wykrywaj zmiane stanu. Czyli jak czujnik przechodzi ze stanu 0 do 1 i odwrotnie to zliczaj te zmiany.
Po drugie zmien program tak aby szybko ustalał jaki jest stan czujnika..
Po trzecie musisz pamietac że styki mogą podskakiwać więc musisz to też oprogramować.
Moja sugestia:
Korzystaj z kontaktronu o ile tenże kontaktron pozwala na tak szybkie zmierzenie stanu.
W przypadku koła o średnicy 28 cali masz obwód 223cm.
Przy prędkości 30km/h (8m/sek) to daje około 4 obroty na sekunde. I do tego czas styku kontaktronu to pi*oko 1/100 z tej ćwiartki sekundy.
Musisz upewnic się że ten kontaktron potrafi sie otwoerać i zamykać te 5-10x na sekunde.
Warto to zmierzyć np. przepuszczając przez niego sygnał dzwiekowy i nagrac przez karte muzyczna jesli nie masz oscyloskopu.
Tak zobaczysz czy ten kontaktron po pierwsze potrafi sie tak często rozłączać i łączyć oraz jak mocno mu styki podskakują.
Program napisz tak aby procedura działała na przerwaniach zegarowych. Odczytuj status kontaktronu około 500-1000-2000x na sekunde i wynik pomiaru wkładaj do zmiennej jako pojedynczy bit i przesuwaj bity w lewo (zwiekszasz wartośc zmiennej) w sytuacji kiedy masz w zmiennej odpowiednio wysoką wartość wiesz ze styk jest trwale zwarty.
Zgodnie z tym ustawiasz sobie wartosci globalnych zmiennej w rodzaju "styk_zwarty".
Jest jeszcze pare alternatyw ale jak zrobisz powyższe to raczej będzie najprościej o ile całośc sie uda (kontaktron nadąży sie zamykać itp.).
Kolejny krok to zbudowac sobie układ z histerezą i nim wywoływać przerwanie.
slawek
Guest
Fri Jul 07, 2017 10:43 pm
Arduino jest traktowane 16 MHz, ale masz blokujący print, przez który
nie nadąża z odczytami.
slawek
Guest
Fri Jul 07, 2017 10:47 pm
On Fri, 7 Jul 2017 11:58:36 +0100, Cezar <cezar91@BEZtlen.pl.invalid>
wrote:
Quote:
skróciłeś długośc impulsów. Musisz zliczać *zbocza* a nie stany.
Niekoniecznie. Tylko trzeba to robić starannie, wiedzieć co i
dlaczego.
slawek
Guest
Fri Jul 07, 2017 10:52 pm
On Fri, 7 Jul 2017 11:44:11 +0100, Cezar <cezar91@BEZtlen.pl.invalid>
wrote:
Quote:
W powyzszym kodzie jesli impuls przyjdzie podczas gdy piszesz do
LCD,
konsoli lub CPU wykonuje cokolwiek innego to zostanie pominięty.
Właśnie tak. A że wszystko to trwa długo...
Klasyka.
slawek
Guest
Fri Jul 07, 2017 10:57 pm
On Fri, 7 Jul 2017 11:56:43 +0100, "Michal M. Lechanski"
<michal@doriath.eu> wrote:
Quote:
Panowie, dziękuję bardzo - spróbuję najpierw wyeliminować wpływ
opóźnień
związanych z obsługą LCD.
PRZERWANIA
I ew. bufor na wejściu.
slawek
Guest
Sat Jul 08, 2017 8:23 am
On Fri, 7 Jul 2017 13:19:33 -0700 (PDT), sczygiel@gmail.com wrote:
Quote:
Korzystaj z kontaktronu
Kontaktron ma mechaniczne styki, czyli ograniczoną żywotność.
Janusz
Guest
Sat Jul 08, 2017 9:28 am
W dniu 2017-07-07 o 12:56, Michal M. Lechanski pisze:
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.
Nic Ci to nie da, nadal będziesz miał przypadkowe odczyty,, pamiętaj że
if nie czeka tylko sprawdza warunek i idzie dalej.
Musisz zamiast if dać while które będzie czekać aż warunek się zmieni
np: zamiast
if (val0 > 100)
{
licznik++;
}
daj
while (val0 > 100); // czeka na impuls
licznik++;
i zastosuj 1 czujnik (1 pomiar wg twojego opisu) najwolniejszy wtedy
będzie dość czasu na wyświetlanie.
--
Pozdr
Janusz
Piotr GaĹka
Guest
Sat Jul 08, 2017 10:01 am
W dniu 2017-07-08 o 11:28, Janusz pisze:
Quote:
daj
while (val0 > 100); // czeka na impuls
licznik++;
Pętla while się kręci dopóki val0>100. Jak pojawi się val0 mniejsze od
100 to zwiększy się licznik, coś tam się zrobi i program wróci do tego
while.
A co będzie jak nadal val0 jest jeszcze mniejsze od 100?
Pętla while się nie wykona ani razu licznik się zwiększy itd.
Przy stojącym kole zliczona liczba obrotów będzie rosła.
P.G.
slawek
Guest
Sat Jul 08, 2017 7:34 pm
On Sat, 8 Jul 2017 11:28:19 +0200, Janusz <janusz_kk@o2.pl> wrote:
Quote:
Panowie, dziękuję bardzo - spróbuję najpierw wyeliminować wpływ
opóźnień
związanych z obsługą LCD.
Nic Ci to nie da, nadal będziesz miał przypadkowe
De facto są dwa zadania do realizacji: obserwacja czujnika w czasie
rzeczywistym i pokazywanie przeliczonych wyników na wyświetlaczu.
Pierwsze zadanie wymaga pełnej dyspozycyjności. CPU nie może "na
chwilę zająć się czymś innym".
Drugie jest czasochłonne (LCD jest dość powolne) i może być blokujące
(jeżeli nie wiadomo jak długo trzeba będzie np. czekać na przesłanie
tych danych gdzieś jakoś).
Jest jeden CPU, jeden rdzeń. Jedyna sensowna możliwość to obsługa
czujnika w przerwaniu. Przecież Atmega 328 ma przerwania i nikt nie
broni mieć "gorącą linię" z czujnika wprost do CPU.
Oczywiście w tym momencie program robi się "dwuwątkowy". Czyli trzeba
trochę ogarnąć np. możliwość jednoczesnego dostępu do zmiennej i
takie tam. Nic drastycznie trudnego.
Alternatywą jest najpierw tylko mierzyć, potem pokazać wynik itd.
Dobrze byłoby sprawdzić jak działa biblioteka do LCD - czy np. nie
używa sama przerwań itp.
Nigdzie nie używać delay.
Jeszcze mały drobiazg: Arduino obsługuje transmisję szeregową w
głównej pętli, tj. wywołuje na przemian loop() i coś tam jeszcze.
Czyli pomiędzy kolejnymi wejściami do loop() może upłynąć bliżej
nieokreślony czas. Można się tego pozbyć, ale przestanie np. działać
monitor na porcie szeregowym.
Janusz
Guest
Sat Jul 08, 2017 7:55 pm
W dniu 2017-07-08 o 12:01, Piotr Gałka pisze:
Quote:
W dniu 2017-07-08 o 11:28, Janusz pisze:
daj
while (val0 > 100); // czeka na impuls
licznik++;
Pętla while się kręci dopóki val0>100. Jak pojawi się val0 mniejsze od
100 to zwiększy się licznik, coś tam się zrobi i program wróci do tego
while.
Wiadomo co będzie, to jest najprostrza wersja, juz mu nie chciałem mącić
drugą pętlą. To juzż mu będzie lepiej chodzić od tego co napisał.
--
Pozdr
Janusz
Janusz
Guest
Sat Jul 08, 2017 7:59 pm
W dniu 2017-07-08 o 21:34, slawek pisze:
Quote:
On Sat, 8 Jul 2017 11:28:19 +0200, Janusz <janusz_kk@o2.pl> wrote:
Panowie, dziękuję bardzo - spróbuję najpierw wyeliminować wpływ
opóźnień
związanych z obsługą LCD.
Nic Ci to nie da, nadal będziesz miał przypadkowe
De facto są dwa zadania do realizacji: obserwacja czujnika w czasie
rzeczywistym i pokazywanie przeliczonych wyników na wyświetlaczu.
Pierwsze zadanie wymaga pełnej dyspozycyjności. CPU nie może "na chwilę
zająć się czymś innym".
Drugie jest czasochłonne (LCD jest dość powolne) i może być blokujące
(jeżeli nie wiadomo jak długo trzeba będzie np. czekać na przesłanie
tych danych gdzieś jakoś).
Jest jeden CPU, jeden rdzeń. Jedyna sensowna możliwość to obsługa
czujnika w przerwaniu. Przecież Atmega 328 ma przerwania i nikt nie
broni mieć "gorącą linię" z czujnika wprost do CPU.
Masz rację, my byśmy tak to napisali ale autor jeszcze nie wie co to są
przerwania i po co.
Co do czasochłonności to się mylisz, przy czujniku z taśmą czyli impuls
na obrót ma dość czasu na wyświetlanie do tych 40km/h
--
Pozdr
Janusz
Goto page Previous 1, 2, 3 Next