Milisekundomierz do badania czasu trwania impulsów i przerw. - Wersja do druku +- Arduino Polska Forum (https://forum.arduinopolska.pl) +-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino) +--- Dział: Programowanie w Arduino (https://forum.arduinopolska.pl/dzial-programowanie-w-arduino) +--- Wątek: Milisekundomierz do badania czasu trwania impulsów i przerw. (/watek-milisekundomierz-do-badania-czasu-trwania-impuls%C3%B3w-i-przerw) Strony:
1
2
|
Milisekundomierz do badania czasu trwania impulsów i przerw. - Dzimi21 - 12-06-2017 Witam, od jakiegoś czasu walczę z programem dla arduino uno. Postanowiłem zaryzykować i zamiast zdawać egzaminu na studiach zrobić milisekundomierz do badania spz na laboratorium. Jako iż wcześniej programowałem tylko plc, arduino było dla mnie dość nowe (ld czy fb a c to jednak różnica). Zadanie zaczęło mnie trochę przerastać gdyż doświadczenia z arduino miałem mało. Ogólne założenia programu: - jeden impuls wejściowy (stan wysoki gdy spz wykrywa zwarcie), co prawda ma ona wewnętrznie przełączalne styki ale jest to "zabudowane" w logice i raczej nie mam do tego dostępu więc zostaje tylko ten jeden. - program ma mierzyć czas trwania każdego z impulsów (maksymalnie 3) i czas trwania przerw między impulsami (dwie), zprzypisywać każdy czas do osobnej zmiennej, jeśli spz był np jednokrotny i po jednym impulsie w stanie wysokim, czas przerwy jest dłuższy niż 7 sekund, ma wyświetlać komunikat "spz jednokrotny" - wszystko zrobione jest na czterosegmentowym wyświetlaczu, program ma wyświetlać czasy trwania impulsów, a po wciśnięciu przycisku czasy trwania przerw. Program zrobiłem, korzystając funkcji millis(), tylko mam z nim kilka problemów z którymi nie mogę sobie poradzić. Udało mi się ustawić to tak że mierzy czas od zera dla każdego z impulsów, jednak gdy np zmierzy czas pierwszego impulsu i zostanie on utrwalony (na wyświetlaczu) to podczas trwania drugiego, ten pierwszy przyjmuje jego wartość itd. Gdy zmienia się czas jakiegokolwiek czasu, cała reszta zmienia wartości, przy czym warunek to żeby każdy czas został zapamiętany. Kod: int sygnal_pin = 13; Ewentualnie może znajdzie się ktoś chętny aby pomóc przy tym kodzie, poprawić go, rozumiem że nikt nie chce tracić czasu więc mogę zaoferować jakąś opłatę za pomoc. Oczywiście układ fizycznie już mam. Dzięki. RE: Milisekundomierz do badania czasu trwania impulsów i przerw. - Smaczek - 12-06-2017 Witam, Jeśli ma to być dokładne to użyj funkcji micros() lub przerwań do wykrywania impulsu. Pozdrawiam. RE: Milisekundomierz do badania czasu trwania impulsów i przerw. - Robson Kerman - 12-06-2017 Po co się tak męczyć? Poczytaj o funkcji pulseIn. Jak będziesz miał z nią problem, to Ci pomogę, ale w tej chwili leżę chory, więc ni mogę o tym myśleć. RE: Milisekundomierz do badania czasu trwania impulsów i przerw. - Smaczek - 12-06-2017 Tylko czy funkcja pulseIn pozwoli na bezstratny pomiar czasu wszystkich pięciu następujących po sobie zmian stanu? RE: Milisekundomierz do badania czasu trwania impulsów i przerw. - Dzimi21 - 12-06-2017 Poczytam, priorytetem jak iż ma to służyć na stanowisku laboratoryjnym jest dokładność. Aczkolwiek będę porównywał wynik z arduino z milisekundomierzem laboratoryjnym i programowo mogę wprowadzić jakieś korekty ewentualnego laga. O funkcji pulseIn z pewnością poczytam jutro z rana. RE: Milisekundomierz do badania czasu trwania impulsów i przerw. - Dzimi21 - 13-06-2017 Próbowałem funkcji pulseIn ale nie wiem dlaczego przy prostym kodzie: Kod: #include <LiquidCrystal.h> Dzięki za poprzednie podpowiedzi. RE: Milisekundomierz do badania czasu trwania impulsów i przerw. - Robson Kerman - 13-06-2017 Ano dla tego, że program wywoła funkcję pulseIn dopiero po spełnieniu warunku if(digitalRead(13) == HIGH) Funkcja pulseIn czeka na stan pinu określony w parametrach i mierzy czas trwania tego stanu, więc sama sobie poczeka na ten warunek. Wystarczy więc napisać: Kod: void loop() RE: Milisekundomierz do badania czasu trwania impulsów i przerw. - Smaczek - 13-06-2017 Witam, Coś w deseń (bez uwzględniania 7 s kontroli): void loop() { long time1, time2, time3....... while(!digitalRead(13)) {}; time1 = millis(); while(digitalRead(13)) {}; time2 = millis(); while(!digitalRead(13)) {}; time3 = millis(); ... long imp1high = time2 - time1; long imp1low = time3 - time2; ... } RE: Milisekundomierz do badania czasu trwania impulsów i przerw. - Robson Kerman - 13-06-2017 A ja bym to zrobił miej więcej tak. Trzeba tylko wywalić wyświetlanie wyników do tych ifów, bo one zabierają cykle zegara. Później to zmienię. Kod PHP: void pomiar(){ Funkcja pulseIn liczy z dokładnością do 3μS. Jeśli chcesz większej dokładności, to przesiądź się na inną platformę. Ja mam na przykład płytkę Nucleo F091 napędzaną generatorem 48Mhz i dokładność wzrasta do 1μS, ale STM'y F411 śmigają na 100Mhz i podejrzewam, że błąd pomiarowy będzie mniejszy niż w urządzeniach laboratoryjnych. RE: Milisekundomierz do badania czasu trwania impulsów i przerw. - Smaczek - 13-06-2017 Robsonie, czy Twoja propozycja nie będzie określać parametrów co któregoś impulsu? Jeśli funkcja mierzy długość stanu high to kończy mierzyć gdy nastąpi stan Low. Kolejne wywołanie funkcji, tym razem dla stanu niskiego będzie czekać aż taki się zacznie, czyli w tzw. międzyczasie nie będą zmierzone stan niski i stan wysoki. Czy moje rozumowanie jest poprawne? |