pulseIn przez cały czas zwraca wartość 0 - 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: pulseIn przez cały czas zwraca wartość 0 (/watek-pulsein-przez-ca%C5%82y-czas-zwraca-warto%C5%9B%C4%87-0) |
pulseIn przez cały czas zwraca wartość 0 - adixpogo - 12-01-2018 Przyznam szczerze, że siedzę nad kodem już dobrych parę dni, a nadal nie mogę znaleźć przyczyny błędnego działania. Na wstępie wspomnę w jakim celu ma służyć dany kod. Potrzebuję mierzyć czas wysokiego stanu sygnału. Przeglądając multum stron internetowych w poszukiwaniu rozwiązania, natknąłem się na funkcję pulseIn, która rzekomo powinna rozwiązać mój problem. Użyłem osobnego Arduino w celu symulowania sygnału - najprostszy możliwy schemat, oparty na funkcjach delay oraz digitalWrite - zapala i gasi diodę co sekundę. pulseIn powinien zwracać wartość 1000 ms za każdym razem, niestety tak nie jest. Poniżej załączam uproszczony kod, rejestrujący czas wysokiego stanu. Czego już próbowałem? 1. Wyczytałem, że funkcja pulseIn ma wbudowany tzw. "timeout", standardowo ustawiony na wartość 1000 ms. Jeżeli w ciągu jednej sekundy nie zarejestruje sekwencji stanów: low>high>low, zwraca wartość 0. Oczywiście wartość timeout'u można zmienić przykładowo na dwie sekundy wpisując: pulseIn(pin,HIGH,2000); 2. Zmieniałem wartość przerw pomiędzy stanem niskim i wysokim w symulowanym sygnale (korzystałem z różnych: 10ms, 100ms). 3. Symulowałem sygnał przy pomocy innych funkcji. Przykładowo standardowy PWM, "analogWrite" oraz "tone" - w tym przypadku pulseIn odczytuje jakieś wartości. W przypadku digitalWrite zwraca za każdym razem 0. Kod: float Th; // czas trwania stanu wysokiego (w tym czasie samochód spala 0,006 l) RE: pulseIn przez cały czas zwraca wartość 0 - Smaczek - 12-01-2018 Witam, Czy zmienna Th ma na pewno być typu float? Bo mam poważne wątpliwości. Alternatywa to pomiar za pomocą przerwan. Pozdrawiam, Tomek. RE: pulseIn przez cały czas zwraca wartość 0 - adixpogo - 12-01-2018 Witam, Uważam, że zmienna Th wręcz powinna być typu float. Zależy mi na wartościach dziesiętnych. Udało mi się uzyskać odczyt sygnału. Mój błąd - nie doczytałem dość istotnej informacji, że timeout jest liczony w mikrosekundach, nie milisekundach. Przyznam szczerze, że funkcja pulseIn w miarę precyzyjnie wychwytuje sygnały o wyższej częstotliwości. Gdy przychodzi do pomiaru niskich częstotliwości (poniżej 1Hz), dane mają niewiele wspólnego z rzeczywistymi wartościami. Chyba pozostaje wspomniane przez Ciebie alternatywne rozwiązanie z wykorzystaniem przerwań. RE: pulseIn przez cały czas zwraca wartość 0 - Smaczek - 14-01-2018 Witam, To, że chciałbyś żeby Th była float, a to jakiego typu zwracana jest wartość przez funkcję pulseIn trzeba ze sobą pogodzić! Pozdrawiam, Tomek RE: pulseIn przez cały czas zwraca wartość 0 - przoch - 16-02-2024 (12-01-2018, 20:14)adixpogo napisał(a): Witam, witam, post bardzo stary, ale może ktoś tak jak ja przegląda stare archiwa w poszukiwaniu rozwiązania. Funkcja pulseln() zwraca wartość w mikrosekundach typu unsigned long. Kod: int pin = 7; a tu przykład oparty na przerwaniach: Kod: /* RE: pulseIn przez cały czas zwraca wartość 0 - kaczakat - 16-02-2024 Nie widzę w tym przykładzie żadnych przerwań. Ale użycie micros jest jak najbardziej OK, impulsy muszą być jedynie dłuższe znacząco niż pojedynczy czas trwania LOOP. RE: pulseIn przez cały czas zwraca wartość 0 - Robson Kerman - 17-02-2024 Kod: #include <avr/interrupt.h> Nie wiem czy dobrze napisałem, bo dawno nie robiłem nic na AVR'ach. Problem polega na tym, że bez normalnej obsługi przerwań, funkcja Serial.print zajmuje czas procesora, kiedy powinien wykrywać zbocza. Dla tego framework Arduino jest kiepski dal bardziej wymagających projektów. RE: pulseIn przez cały czas zwraca wartość 0 - Jarewa0606 - 17-02-2024 Nie uwzględniłeś przepełnienie licznika "ISR(TIMER1_COMPA_vect)" ICR1 będzie zwracał 1-65 536 cykli, nie sprawdzam jak ustawiłeś taktowanie zegara. Ale jak ustawiłeś zegar na 1ms to będzie można tylko zmierzyć sygnały 1-65 536 ms jak przekroczą te zakresy to będzie pokazywać bzdury. RE: pulseIn przez cały czas zwraca wartość 0 - oscarX - 18-02-2024 (12-01-2018, 20:14)adixpogo napisał(a): Witam, pulseInLong Niepotrzebne szukałeś multum stron - najlepiej zacząć od dokumentacji. |