Skocz do zawartości

Arduino i sterownik silnika krokowego dm542


Pomocna odpowiedź

13 godzin temu, Robson_Kerman napisał:

jest coś takiego jak RTOS dla AVR i robi on cuda z takimi "problemami"

Rozumiem, że ów RTOS w magiczny sposób sprawia, że Arduino dostaje nagle drugiego rdzenia i np. pracujący na przerwaniach silnik krokowy w magiczny sposób będzie pracować dalej, gdy transfer I2C czy SPI zablokuje sobie przerwania? Muszę się tym zainteresować...

Ja wiem, że to będzie porada od czapy, bo mamy Arduino i to z niego próbujemy wycisnąć siódme poty, ale ostatnio właśnie robiłem projekt maszyny z 6 silnikami krokowymi muszącymi pracować szybko, płynnie i jednocześnie (a przynajmniej na początku nie było wiadomo jak to będzie więc trzeba było założyć najgorsze). I jako sterownika trzech silników użyłem ATmega328PB. To prawie to samo to "zwykły" m328 siedzący w Arduino, ale tu mamy naprawdę zaskakująco dużo peryferiów. Mi zależało najbardziej na 3 timerach 16-bitowych - bo to one stały się podstawą sterowania silników. Dwa takie procki spięte przez I2C z trzecim (jakimś innym) dały mi bardzo wygodny sterownik 6-osiowy. Wszystko płynnie śmiga i pewnie mógłbym to zastąpić pierwszym lepszym wielotimerowym STM32, ale klient uparł się na AVR (chciał to później samemu rozbudowywać) więc dostał. Silniki rozpędzają się po programowanych rampach (linowych przyrostach) prędkości, odliczają zadane drogi i hamują, wyjścia STEP są twardo sterowane przez sprzęt timerów (zero jitterów), a 100kHz I2C bez problemu przenosi sterowanie i raportowanie stanu w czasie rzeczywistym. Także.. gdyby babcia miała wąsy, a nie, przepraszam, gdyby ktoś był zainteresowany to może są gdzieś jakieś płytki z tym układem:

https://ww1.microchip.com/downloads/en/DeviceDoc/40001907A.pdf

Albo może warto dołączyć do Arduino jakiś scalak od Trinamic? To sterowniki silników wyposażone w generatory obwiedni z programowanymi (po SPI) parametrami rozpędzania, hamowania, i długością drogi. Wtedy w zasadzie można zrobić dowolnie dużo silników, bo chodzą "same".

A wracając do Arduino: wiele zależy od oczekiwanej prędkości liczonej w krokach na sekundę. Dopóki będzie to kilkaset w każdym silniku, to można pokusić się o zrobienie dwóch-trzech osi na jednym timerze. Trochę jak w bibliotece do obsługi serwomechanizmów. Tam generujemy przecież sygnały 50Hz na wielu wyjściach na raz z różnymi fazami i czasami trwania przewidując i kolejkując nadchodzące zdarzenia - tj. przerwania jednego timera. A w tzw. międzyczasie można obsługiwać I2C czy UART na jego przerwaniach więc jakaś komunikacja by była.

Hm, nie wiem czy to moja działka 🙂 

  • Lubię! 1

Witam,

Skoro już ktoś odświeżył wątek powiem jak "rozwiązałem" problem.

Całością steruje arduino mega i 3 x arduino nano. Mega dysponuje łącznie 4 UARTami z czego 3 idą na komunikację z nano.

Każde nano kożysta z biblioteki accelStepper. Maszyna działa przyzwoicie a jeden z krokowców (12Nm) kręci 10 obr/sek.

Co prawda aktualnie układ jest jeszcze mocno niedopracowany, nie testowałem jeszcze jak będzie się zachowywał jeżeli podczas pracy silników będę nadawał coś po UART. Na sterownik wspomnianego krokowca idzie 4000 impulsów na sekundę więc raczej nie ma szans żeby między impulsami przesłać coś po UART.

chyba już za późno na podpowiedź, bo masz gotowy układ, ale może się na coś przyda:

w TimerOne jest 

pwm(pin, duty, period)

ustawiasz to tylko na dwa piny D9 i D10 (PB1 i PB2), bo na innych nie działa,

generujesz w pętli sygnał prostokątny z duty na np 512 (50%) i okresem zadanym w period.

np. dla 

Timer1.initialize(1000);

i silniczka z 200 kroków na jeden obrót i sterownikiem z ustawionym na 1/16 kroku,

RPM to potrzebna ilość obrotów na minutę

Timer1.pwm(rpm_pin, 512, (int) 18750 / RPM);

 

  • Lubię! 1

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...