Wpis z mikrobloga

mam nie małe wyzwanie. sytuacja jest taka, używam silnika krokowego do napędzania auta. muszę wywoływać komendę RUN która powoduje poruszenie się silnika o jeden krok, w związku z czym jeżeli chcę by to była płynna praca muszę wywoływać tą komendę jak najszybciej. z tym że też na raz muszę nasłuchiwać czy coś przychodzi z portu USB, czyli komendy. przypomnę ze na arduino mamy tylko jedno rdzeniowy procesor w związku z czym nie ma prawdziwej wielowątkowości a można użyć jedynie Protothreadów które jak się okazuje nie są dla mnie wystarczające. pytanie jak odbierać dane nie przerywając pracy silnika

#cpp #programowanie #c #arduino
  • 16
@mapache Jak już ktoś wspomniał w tym przypadku przerwania są rozwiązaniem. Nigdy nie bawiłem się krokowcami. Sterujesz silnik krokowy z wątku głównego czy z timera?
via Wykop Mobilny (Android)
  • 0
@luigi_pl: @mathmed: mam przerwanie w postaci takiej że odbieram dane tylko jak się pojawią jakieś bity na porcie. dopiero wtedy czytam. ale sam fakt że czytam powoduje opóźnienie na silniku
@mapache: jeśli masz ochotę wyjść trochę poza gotowe biblioteki to zrobisz to przy użyciu Pulse Width Modulation (Od sekcji Using the ATmega PWM registers directly). Wtedy mógłbyś kontrolować silnik bez narzutu na główną pętlę i przy okazji poznać trochę tego co leży pod spodem, a czego arduino nie pokazuje. Musiałbyś też dobrze zrozumieć jak steruje się silnikiem krokowym, bo będziesz potrzebować własnego RUN :)
@mapache: usb wymienia paczki danych co 1 ms i nie jest możliwa częstsza ich wymiana, zatem i odpalanie komendy run. Ogólnie to jest zły projekt. Z usb powinny przychodzić informacje ile królów silnik ma wykonać w ciągu następnej ms lub z jaka prędkością powinien się kręcić. Jeśli to nie jest bezpieczne to za zatrzymanie silnika po zaistnieniu sytuacji awaryjnej powinien odpowiadać albo sterujący uc albo wręcz jakiś osobny, niezawodny układ.
Mi
@Analityk: z USB nie przychodzi komenda ze ma wykonywać jeden krok tylko komenda czyli typu ruszaj ciągle, daną odległośc, hamuj, prędkośc i kierunek

struct StepperMotorMsg
{
StepperMotorCommand command;
StepperMotorDirection direction;
unsigned short int speed;
};

coś takiego konkretnie. jeśli padnie komenda RUN z strony USB to już arduino ciągle robi RUN na silnik