(09-10-2024, 21:04)fusilis napisał(a): Witam
Zrobilem mechanicznie urzadzenie, ktore ma od 0,2 do 2,25 obrotu na minute, na kole jest 10 magnesow, a impulsy odczytuje czujnikiem Halla. Impulsy przy tych obrotach trwaja dlugo, potrzebuje pomocy aby np jest sygnal 1 i czekamy na sygnal 0 i zliczmy np te 1, aby moc wyliczyc obroty na minute.
Są dwie metody cyfrowego mierzenia częśtotliwości (bo to w sumie tego typu problem):
1. W ustalonym czasie liczy się impulsy.
2. Mierzy się czas pomiędzy dwoma kolejnymi impulsami (czyli w sumie mierzy się okres sygnału).
Metoda 1 jest dokładniejsza dla dużych częstotliwości i prostsza w realizacji - przy odpowiednim dobraniu czasu otrzymuje się od razu wynik w Hz/kHz itp.
Metoda 2 jest dokładniejsza dla małych częstotliwości, jednak wynik trzeba przeliczyć (odwrotność) - co może być problemem, gdy przyrząd jest zbudowany na logice dyskretnej (bramki, przerzutniki itp) ale gdy i tak mamy komputer to bez znaczenia.
W obu przypadkach dokładność można zwiększyć zwiększając czas pomiaru, porównanie dotyczy pomiaru w tym samym czasie.
Jeśli masz bardzo małą częstotliwość to zostaje tylko metoda 2. Przy podanych wartościach, czas pomiaru i tak wyjdzie duży - najwolniej kręci się raz na 5 minut, te 10 magnesów oczywiście poprawia sytuacje, bo jest jakby mnożnikiem częstotliwości i czas spada do 30 sekund, ale to i tak dużo.
Czujniki Halla są elementem "analogowym" i sygnał z nich będzie powoli rósł w momencie zbliżania magnesu i wszystko zależy od tej części analogowej - komparatora, stabilności elementów i napięc. Może warto będzie zastosować bardziej cyfrowy czujnik - np. optyczny (np. tarcza z dziurkami i transoptor szczelinowy). Można by wtedy znacznie zwiększyć mnożnik częstotliwości - realne byłoby uzyskanie np. 100 (pomiar co 3 sekundy).
Jak już wspomniał kolega w poprzednim poście najlepiej byłoby użyć mechanizmu ICP (input capture), który polega na zapamiętaniu w rejestrze stanu timera w momencie wystąpienia impulsu - ale potrzebny byłby bardzo wolno pracujący timer, może prościej byłoby monitorować wejście programowo i użyć millis(), tylko trzeba zapewnić, że program nigdzie nie zatrzyma się na dłużej.
Jeszcze widzę możliwość wykorzystania tej "analogowatości" - może wręcz analogowo (ADC) mierzyć napięcie z wyjścia czujnika Halla i analizować tempo narastania/opadania sygnału? Taki szybkościomierz.