Enkoder na silniku - 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: Enkoder na silniku (/watek-enkoder-na-silniku) Strony:
1
2
|
Enkoder na silniku - Janek_gl - 11-03-2018 Witam, mam problem ze zliczaniem impulsów z enkodera w celu określenia liczby obrotów walu silnika. Do zliczania impulsów używam przerwania RISING. Enkoder ma rozdzielczość 16 impulsów na obrót. Niestety moje Arduino uno nie nadąża z liczeniem impulsów. Dla różnych prędkości jest różna liczba impulsów na obrót. Ktos wie jak sobie z tym poradzić czy jest to nie do pokonania I wynika np. z maksymalnej częstotliwości sygnału zegarowego? Dzięki za pomoc RE: Enkoder na silniku - kaczakat - 11-03-2018 Witam. Pokaż szkic. A tak w skrócie, dla różnych prędkości ma być różna liczba impulsów. RE: Enkoder na silniku - Janek_gl - 11-03-2018 Kod: int impulsy=0; RE: Enkoder na silniku - kaczakat - 11-03-2018 Źle zrozumiałem, przepraszam. Dla każdego obrotu ma być taka sama liczba impulsów, różna jest w sensie na sekundę. Zapewne procek się nie wyrabia. W przerwaniu powinno być tylko zliczanie impulsów, a w szczególności nie może być tam Serial.println(obroty); Kod: volatile int impulsy=0; RE: Enkoder na silniku - Janek_gl - 11-03-2018 Zrobilem jak powiedziales, w przerwaniu jest tylko dodawanie impulsow. Wszystko dziala poprawie dla pelnego zakresu predkosci, jest tylko jeden mankament. Uklad dziala poprawnie jesli na obrot przypisze nie 1920 ale 1920/2 impulsow RE: Enkoder na silniku - Smaczek - 12-03-2018 Witam, A jaki jest zakres prędkości obrotowych tego silnika? Pozdrawiam, Tomek. RE: Enkoder na silniku - kaczakat - 13-03-2018 Niestety sam nic tak nie liczyłem mikroprockiem, dla mnie też zagadka. Może powinieneś odpalić jakiś oscyloskop i popatrzeć jak jest generowany sygnał z tego enkodera, może ta rozdzielczość 16 oznacza zliczanie impulsów dla sygnału narastającego i opadającego? Jeśli tak to trzeba dzielić przez 2, bo narastających ma być 8. RE: Enkoder na silniku - krn78 - 13-03-2018 Może się mylę, ale może mikrokontroler pracuje zbyt szybko i zbiera impulsy wielokrotnie, bo po prostu zdąży Spróbuj dopisać do funkcji Odleglosc() blokadę, która zatrzymuje działanie programu tak długo, jak wartość z enkodera się nie zmienia. Możesz to zrobić za pomocą while: Kod: while(digitalRead(1)==HIGH){} Kod: void Odleglosc () RE: Enkoder na silniku - kaczakat - 13-03-2018 Raczej nie o to chodzi, przy rising jest dokładnie jeden punkt na wykresie napięcie/czas wyzwalający przerwanie. Inne opcje to: " LOW to trigger the interrupt whenever the pin is low, CHANGE to trigger the interrupt whenever the pin changes value RISING to trigger when the pin goes from low to high, FALLING for when the pin goes from high to low. The Due, Zero and MKR1000 boards allows also: HIGH to trigger the interrupt whenever the pin is high. ". Inna sprawa, że impuls może mieć drgania jak styki klawiszy, by to ocenić potrzebny jest właśnie oscyloskop. Ja wyobrażam sobie enkoder jako okrągłą tarcze, na której są wycięte prostokąty o takiej samej szerokości jak pełne przestrzenie, światło przechodzi przez puste pola (od LED do PHOTOLED), a przez pełne nie, przy tej samej prędkości stan wysoki trwa tyle samo co niski, można łapać zmiany na stan niski i zmiany na stan wysoki, 16 na obrót w sumie. A drgania cechowałaby pewna losowość. Można by je wyeliminować jakimś filtrem, ale taki powinien być już w enkoderze. RE: Enkoder na silniku - Smaczek - 14-03-2018 Witam, Dyskusja już chyba toczy się bez udziału założyciela wątku :-) Jeśli występowałby drgania (czyli coś niestabilnego i losowego) to wątpię, żeby ilość impulsów była dokładnie dwa razy większa od spodziewanej. Można przetestować jakie ilości otrzyma się dla innych "zdarzeń" wywołujących przerwania (podanych powyżej przez kolegę @kaczakata) i w ten sposób spróbować zdjagnozować przyczynę. Kompletnie nie wiadomo jaki enkoder został zastosowany i czy posiada on komparator. Poza tym, przy nie rozumie dlaczego enkoder ma rozdzielczość 16, a w programie obrót zwiększa się przy stanie licznika 1920? @krn78- najprawdopodobniej dawanie pętli while() w funkcji obsługującej przerwanie nie jest dobrym rozwiązaniem. Pozdrawiam, Tomek. |