Obliczanie czasu pomiędzy zdarzeniami - Wersja do druku +- Arduino Polska Forum (https://forum.arduinopolska.pl) +-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino) +--- Dział: Piaskownica (https://forum.arduinopolska.pl/dzial-piaskownica) +--- Wątek: Obliczanie czasu pomiędzy zdarzeniami (/watek-obliczanie-czasu-pomi%C4%99dzy-zdarzeniami) Strony:
1
2
|
Obliczanie czasu pomiędzy zdarzeniami - gawlik7 - 24-01-2017 Witam, Jestem początkującym użytkownikiem Arduino Uno. Chciałem zbudować prosty układ, który mierzyłby czas staczającego się z równi pochyłej walca u jej podstawy. Zasada działania jest następująca: w odstępie 10mm zamontowane są dwa fototranzystory oświetlane diodami laserowymi; przejeżdżający walec przecina najpierw pierwszą wiązkę potem drugą. Na tej podstawie znając odległość pomiędzy fototranzystorami i czas na jaki wiązka została przecięta mogę policzyć prędkość (T1, T2 albo T = ?[attachment=280]). Poniżej zamieściłem przykłady program, który zwraca wartość funkcji micros(), kiedy zostanie przekroczony poziom referencyjny dla pierwszego fototranzystora (950). Czy jest możliwość wystartowania funkcji micros() od zera, kiedy zostanie przekroczona wartość referencyjna? Czy może istnieje, jakaś inna funkcja pozwalająca na obliczenie czasu? Z góry bardzo dziękuje, Michał int czujnik_1 = A1; //fototranzystor 1 int czujnik_2 = A2; //fototranzystor 2 unsigned long time; //czas microsekundy void setup() { Serial.begin(9600); //inicjalizacja monitora szeregowego Serial.println("Pomiar predkośći"); } void loop() { int war_1 = analogRead(czujnik_1); //odczytanie wartości z A1 int war_2 = analogRead(czujnik_2); //odczytanie wartości z A2 if (war_1 < 950) { time = micros(); } if (war_1 < 950) { Serial.println (time); } delayMicroseconds(1); //opóźnienie między kolejnymi odczytami } RE: Obliczanie czasu pomiędzy zdarzeniami - namok - 24-01-2017 Nie możesz wyzerować micros bo to funkcja która zwraca czas w us od momoentu startu programu. Wszystko masz w dokumentacji: https://www.arduino.cc/en/Reference/Micros(na dysku też) Zamiast Kod: Serial.println(time); Kod: Serial.println(micros()-time); RE: Obliczanie czasu pomiędzy zdarzeniami - Smaczek - 24-01-2017 Witam, Niestety, Twój program nie będzie robić tego co od niego wymagasz. Pozdrawiam. RE: Obliczanie czasu pomiędzy zdarzeniami - gawlik7 - 24-01-2017 A czy mogę prosić o jakieś sugestie, jak go zmienić, żeby działa zgodnie z intencją? RE: Obliczanie czasu pomiędzy zdarzeniami - Smaczek - 24-01-2017 Witam, W pętli loop proszę dac while, które nie robi nic z warunkiem, w którym odczytujesz pierwszy czujnik. Czyli robione jest nic dopóki wiązka nie zostanie przerwana. Następnie oczytujemy micros. Dalej znowu pętla while, która nie robi nic tylko z warunkiem dla drugiego czujnika i za pętla znowu odczytanie czasu. Wtedy wyliczona różnica będzie mogła być użyta do obliczenia prędkości. Czujniki muszą być umieszczone poza równia ukosna. Pozdrawiam. RE: Obliczanie czasu pomiędzy zdarzeniami - gawlik7 - 27-01-2017 Czy dobrze zrozumiałem, że chodzi o następującą modyfikację programu? Próbuję uruchomić w ten sposób, ale coś nadal jest nie tak. int czujnik_1 = A1; //fototranzystor 1 int czujnik_2 = A2; //fototranzystor 2 unsigned long time_1; //czas microsekundy unsigned long time_2; //czas microsekundy void setup() { Serial.begin(9600); //inicjalizacja monitora szeregowego Serial.println("Pomiar predkosci"); } void loop() { int war_1 = analogRead(czujnik_1); //odczytanie wartości z A1 int war_2 = analogRead(czujnik_2); //odczytanie wartości z A2 while(war_1 < 950) { } time_1 = micros(); while(war_2 < 950) { } time_2 = micros(); delayMicroseconds(1); //opóźnienie między kolejnymi odczytami Serial.println(time_2 - time_1); } RE: Obliczanie czasu pomiędzy zdarzeniami - Smaczek - 27-01-2017 Witam. Nie. Powinno być while (analogRead (czujnik_1)<950) {} Dla drugiego while podobnie. Reszta ok. Pozdrawiam RE: Obliczanie czasu pomiędzy zdarzeniami - Smaczek - 28-01-2017 Zapomniałem, Jako, że nie wiem jakie wartości są odczytywane przy przerwanej wiazce to być może zamiast znaku < wwarunku ma być znak > RE: Obliczanie czasu pomiędzy zdarzeniami - namok - 28-01-2017 (28-01-2017, 07:35)Smaczek napisał(a): Zapomniałem, Nie może tylko na pewno(patrząc na rysunek). Jeśli warunkiem wykrycia jest spadek pomiaru poniżej jakiejś wartości to sprawdzamy to tylko raz i zapamiętujemy czas. Czyli w tym wypadku sprawdzamy czy pomiar jest większy i blokujemy w pętli while. Za pętlą zapamiętujemy czas i to samo robimy z drugim pomiarem. Użyj symulatora( http://forum.arduinopolska.com/newreply.php?tid=1246&replyto=4984) to zobaczysz co się dzieje. RE: Obliczanie czasu pomiędzy zdarzeniami - Smaczek - 28-01-2017 Witam, @namok, nie do końca tak to działa. Pętla while bezczynnie "czeka" na sygnał rozpoczęcia pomiaru, którym faktycznie- według rysunku- jest spadek odczytywanej wartości poniżej 950. No chyba, że pisząc "blokujemy" miałeś na myśli blokadę przejścia do następnej instrukcji. Pozdrawiam. |