Skocz do zawartości

Dlaczego silnik krokowy inaczej zachowuje się, gdy jest sterowany bezprzewodowo?


mefiu

Pomocna odpowiedź

Witam,
udało mi się połączyć bezprzewodowo(HC 05) dwa mikrokontrolery(Arduino Mega z Micro). Jednak zastanawia mnie fakt, dlaczego silnik stracił na "kulturze" pracy. Wg mnie, gdy silnik krokowy sterowany jest bezprzewodowo traci na stabilności i prędkości oraz wydaje inne dźwięki z siebie. Czy może tylko mi się to wydaje?

Tutaj filmy:

sterowanie przez guziki przewodowo:

sterowanie bezprzewodowe:

Do tego programy:

przewodowo:

bezprzewodowo:

master:

slave:

Może należy zmienić coś w programie? Dodam również, że wcześniej robiłem sterowanie bezprzewodowe na modułach radiowych 433MHz, ale silnik w tym przypadku chodził tak strasznie(szarpał, był spowolniony), że z nich zrezygnowałem. Również, gdy steruje bezprzewodowo z joysticka, to rezultaty nie są najlepsze(guziki w porównaniu do sterowania analogowego joysticka wypadają lepiej - w przypadku łączności bezprzewodowej).

Link do komentarza
Share on other sites

Tego typu sterowanie jest bardzo prymitywne, bo w jednej pętli masz jednocześnie obsługę komunikacji jak i bezpośrednie sterowanie taktem silnika. Prawdopodobnie komunikacja zajmuje odpowiednio więcej czasu niż prosty odczyt stanu wejść i dlatego pętla działa wolniej.

Poza tym widzę takie rzeczy że możliwe jest kręcenie silnikiem jednocześnie w obu kierunkach: między if prawo-lewo nie ma else, więc jeżeli oba warunki będą spełnione to silnik będzie szarpał w obie strony. Zdecydowanie źle będzie to wpływało na "kulturę" jego pracy.

W pierwszej kolejności do generowania sygnału "step" użył bym timera a w pętli głównej jedynie uaktualniał bym rejestry sterujące timerem i kierunkiem pracy. Po takiej zmianie, sterowanie nie powinno już wpływać na pracę silnika, bo będzie ona zależała wyłącznie od stabilności pracy timera a to można osiągnąć odpowiednio wysokim priorytetem przerwań. Zresztą każde przerwanie, nawet niskopriorytetowe będzie o niebo stabilniejsze od takiej pętli.

Link do komentarza
Share on other sites

Okej, z tymi przyciskami, to wiem, że można dwa na raz nacisnąć, to był szybki program do demonstracji w filmach. A jeżeli chodzi o samą ideę, to na pewno masz racje i żeby to rozwiązać, to trzeba zrobić dodatkowe funkcje obsługujące każdy silnik.

Nie jestem zaawansowany w programowaniu, ale trzeba zrobić coś według tych screenów, które pochodzą z jednego filmu na internecie?:

oraz program podobny do tego, czyli dodatkowa funkcja poza pętlą główną loop. Timery są w stanie coś takiego zrobić i chodziło by tu o to, aby wywoływać dany timer(i program za nim stojący) po przez np. analog(joystick) lub zwykłe przyciski? A sam timer miałby powtarzać instrukcje co 1ms w przypadku silników krokowych(step)? I drugie pytanie czy może spróbować zrobić, to na zwykłych przerwaniach(mam na nich zrobione dwa czujniki krańcowe).

jakiś program z tego filmiku(widoczna funkcja loop oraz dodatkowa od timera):

Link do komentarza
Share on other sites

Nie jestem zaawansowany w programowaniu, ale trzeba zrobić coś według tych screenów, które pochodzą z jednego filmu na internecie?

Ja znów nie znam tego języka (arduino?), ale rysunek dobrze oddaje to co trzeba zrobić czyli uniezależnić generowanie impulsów od sterowania generowaniem.

Timery są w stanie coś takiego zrobić i chodziło by tu o to, aby wywoływać dany timer(i program za nim stojący) po przez np. analog(joystick) lub zwykłe przyciski? A sam timer miałby powtarzać instrukcje co 1ms w przypadku silników krokowych(step)? I drugie pytanie czy może spróbować zrobić, to na zwykłych przerwaniach(mam na nich zrobione dwa czujniki krańcowe).

Timer to jest licznik sprzętowy, który odlicza do zadanej przez użytkownika wartości i generuje przerwanie. Czujniki krańcowe masz podpięte pewnie pod wejścia INT0, INT1 i to jest zupełnie inne przerwanie. Ogólnie przerwań jest wiele, są od timerów, UART-ów, PWM, SPI, ADC itd. Nie pamiętam ile jest tego w ATMedze, ale pewnie kilkanaście rodzai z czego pewnie kilka od samych timerów (zwykle od przepełnienia licznika, compare od generowania okresów czasu i capture od pomiaru długości impulsów).

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Tak, to język z Arduino.

Nie za bardzo wiem jak przerwanie od timerów miało by pomóc w tym konkretnym przypadku. W sensie, trzeba stworzyć funkcje wykonujące się w pętli poza pętlą główną. Prawdopodobnie, to zadziała i chciałem podziękować za pomysł, bo to może być to. 🙂

A myślę nad tym, żeby te funkcje dodatkowe, nie były koniecznie na przerwaniach(chociaż można jakieś wykorzystać[iNT0,INT1,...], bo jest ich aż 6 w Arduino Mega). Po prostu jak przyjdzie wiadomość z nadajnika, to sprawi ona, że program wyjdzie z pętli głównej i odwoła się do jakiejś innej, sterującej silnikiem, a zawierającej tylko, krótki kod sekwencji sterowania(STEP) i jego kierunkiem(DIR).

Link do komentarza
Share on other sites

Może w spróbuj w Masterze dopisać warunek wysyłający 0 kiedy żaden z przycisków nie jest naciśnięty, a w Slavie wyrzucić przypisanie state = 0.

Mówisz o czymś takim mniej więcej:

a co do mastera, to jak jest typ danych, to: int state=0; to jest już przypisane.

Na jakiej zasadzie, miało by pomóc? Pytam poważnie, bez żadnych pretensji. Po prostu nie wiem. Ale spróbuję również tego użyć.

Link do komentarza
Share on other sites

Odnosiłem się do programów z pierwszego posta. Jak działa program z przyciskami podłączonymi przewodami? Podczas wciśnięcia przycisku mniej więcej co 1 ms wykonuje się sekwencja zapisana w warunki if. Przycisk nie wciśnięty nic się nie zmienia na pinach mikrokontrolera.

Jak działa program z komunikacją bezprzewodową? Nie wiadomo. Pitlab, pisał o czasie komunikacji. Nie wiadomo ile czasu trwa zapełnienie bufora odbiorczego. W związku z tym nie za każdym przejściem pętli głównej odczytamy wartość zmiennej state. Dlatego w zmiennej state trzeba pamiętać poprzednią odebraną wartość, żeby warunki wykonywały się za każdym razem przejścia pętli głównej aż do do nowego wczytania zmiennej state.

To wszystko co napisałem to tylko domysły na podstawie pokazanych programów z pierwszego posta. Nie mam dużego doświadczenia z Arduino. Nigdy nie sterowałem silnikiem krokowym i nie wiem czy Twój sposób jest dobry czy nie.

EDIT:

Może być też tak, że obsługa bufora odbiorczego w znaczący sposób spowalnia pętlę główną. Wtedy pewnie zupełnie inaczej trzeba napisać program.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.