Pomiar częstotliwości wejściem DC - 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: Pomiar częstotliwości wejściem DC (/watek-pomiar-cz%C4%99stotliwo%C5%9Bci-wej%C5%9Bciem-dc) Strony:
1
2
|
Pomiar częstotliwości wejściem DC - PierwszyWolnyLogin - 31-08-2020 BRY Napisałem sobie prosty kod - pomiar częstotliwości PWM na wejściu cyfrowym Mierzę czas stanu LOW, HIGH, dodaje i obliczam częstotliwość. Działa, ale co jakiś czas otrzymuję wynik z d..y Jako źródła zastosowałem sygnał 1kHz z oscyloskopu. Wykres w kreślarce wygląda tak: https://photos.app.goo.gl/WgpsWkbwcpmHir3J9 Finalnie będę mierzył częstotliwości gdzieś do 100Hz max. Możecie zerknąć na kod (brudnopis jakby co)? Mam gdzieś błąd? Czy też to kwestia zbyt wysokiej już częstotliwości??? Z góry dzięki... Kod: int RPM_pin = 44; boolean RPM_state=false; boolean RPM_state_=false; float RPM_low_time=0; float RPM_high_time=0; RE: Pomiar częstotliwości wejściem DC - Jarewa0606 - 31-08-2020 Zrób to na przerwaniu z timerem a najlepiej użyj ICP.. Użycie mils i lop nigdy nie będzie poprawnie... Widze AVR Mega wiec ma 4 ICP porty.. RE: Pomiar częstotliwości wejściem DC - PierwszyWolnyLogin - 01-09-2020 Zapomniałem napisać, że na razie nie chcę na przerwaniach. Raz, że nie umiem ale to nie problem - kiedyś i tak muszę się nauczyć dwa, że co to znaczy, że "mils i lop nigdy nie będzie poprawnie" - możesz rozjaśnić? Ps. No i ważniejsze - mam sporo nietypowych płytek Mega z dostępnymi tylko niektórymi pinami, a docelowo program ma pracować na 328 więc liczę programowo, żeby nie być zależnym od procesora... Jakub RE: Pomiar częstotliwości wejściem DC - Jarewa0606 - 01-09-2020 Bo w lopie trafić zmianę pinu to już będą opóźnienia wiec bez sensu odczytywać czas. A po drugi jak rozbudujesz program to trafić w czas w mills to też będzie z dużym opóźnieniem nawet dla 10ms mogą być pomyłki 50%... A chyba nie chcesz miernika częstotliwości z pomyłka 50% prawda?? RE: Pomiar częstotliwości wejściem DC - PierwszyWolnyLogin - 01-09-2020 To wiem - trafić w zbocze może się nie udać ale to nie jest powodem TAKICH błędów. Chyba Sprawdzałem - digitalRead() realizuje się około 100.000x na sekundę. Mierzyć będę <> 100Hz więc... Zerknij na wykres - tam pojawiają się pojedyncze strzały zamiast 1000Hz dostaje 2x lub kilka razy więcej... To raczej nie jest spowodowane opóźnieniem wprowadzonym przez resztę kodu. Chyba, że coś blokuje pętle na kilka tysięcznych sekundy... J. RE: Pomiar częstotliwości wejściem DC - Jarewa0606 - 01-09-2020 Szkoda ze nie obliczyłeś ile czasu trwa operacja na float.. Więcej się nie dało?? RE: Pomiar częstotliwości wejściem DC - PierwszyWolnyLogin - 01-09-2020 Obliczę wieczorem RE: Pomiar częstotliwości wejściem DC - PierwszyWolnyLogin - 01-09-2020 Zrobiłem coś takiego: Kod: // int IN_pin=2; // pin wejsciowy Sygnał PWM mierzy stabilnie - pokazuje 492Hz równiutko, bez względu na to jak często wysyłam coś na serial czy nawet jak wstawię delaya() w loop(). Nie wiem, czy te brakujące 8Hz gdzieś gubi się w liczeniu, czy po prostu procesor nie daje 500Hz jak niby powinien. Muszę zrobić jakieś stabilne źródło częstotliwości do około 200Hz żeby dalej pisać... Ps. Jeśli można zaufać tone() to działa spokojnie do kilkudziesięciu kHz Dzięki narazie RE: Pomiar częstotliwości wejściem DC - Jarewa0606 - 01-09-2020 Sam program nie ma błędów, sprawdzałem na 328p 16Mhz i działa, na 1Khz sygnał 50%PWM rozrzut mam na 10% bez tych "dziwadeł" błędem będzie u ciebie coś z generatorem albo z połączeniem. O widzisz na przerywaniu już lepiej RE: Pomiar częstotliwości wejściem DC - PierwszyWolnyLogin - 02-11-2020 Inna wersja. Robię obrotomierz do skuterka Układ analogowy podający stan wysoki na pin wejściowy gdy świeci iskra już mam. Na przerwaniu zawieszę funkcję zliczającą iskry. Liczba iskier/czas pracy daje obroty, tyle że niestety średnie z całego czasu pracy Mogę zamiast liczyć iskry mierzyć czas między iskrami - niestety w przypadku wyłączenia silnika pomiar się nie zaktualizuje (jeśli będzie czekał na RISING). Chciałbym, żeby to była średnia z powiedzmy ostatniej 1/10 sekundy, żeby przy okazji odfiltrowały się ew. zakłócenia pomiaru. Zapamiętywać przy każdej iskrze czas jej wystąpienia, żeby wiedzieć ile zliczać to chyba słaby pomysł - obroty mogą być spore, powiedzmy 9000rpm co oznaczałoby zapamiętanie dodatkowo 15 zmiennych... Mogę prosić o podpowiedź jak się do tego sensownie zabrać? Jakub |