Salve, Illustro la configurazione del progetto:
Motore Nema 34 - 400 step/giro pilotato con drive settato a 1/2 (800step/giro);
Encoder 800 imp/giro;
Arduino Uno con caricato uno Sketch con libreria Accelstepper 1giroenc=1giro motore;
Tutto bene fino ad una certa velocità, oltre non va!
Ho letto dal link della libreria che il limite sarebbe +/- 4000 imp. dettato dalla frequenza di clock dell'Arduino Uno, per cui chiedo:
Se sostituisco l'Arduino Uno con Arduino Due o una scheda Teensy compatibile, risolvo? Riesco a raddoppiare quel limite?
Ipotizzando di usare lo Sketch sotto riportato, e creando una sorta di accelerazione dividendo gli impulsi dell'encoder nel tempo, sarebbe possibile? (mi spiego, ipotiziamo di avere un tot di impulsi, li divido nel tempo di 10 secondi, tipo: dal 1° al 2° imp x 0; dal 2° al 3° imp/9; dal 3° al 4° imp/8; dal 4° al 5° imp/7 ecc. fino al 9° al 10° imp/1) sicuramente non sarà un movimento fluido ma potrebbe anche andare!
Confido in un vostro riscontro, magari alternative valide, e saluto cordialmente!
int MOTOA = 12; // Dir motore pin digitale 12
int MOTOB = 13; // Pul motore pin digitale 13
int ENCODERA = 7; // pin di input canale A encoder
int ENCODERB = 8; // pin di input canale B encoder
int val = 0; // si userà val per conservare lo stato del pin di input
void setup() {
pinMode(MOTOA, OUTPUT); // imposta il pin digitale come output
pinMode(MOTOB, OUTPUT); // imposta il pin digitale come output
pinMode(ENCODERA, INPUT); // imposta il pin digitale come input
pinMode(ENCODERB, INPUT); // imposta il pin digitale come input
}
void loop() {
val = digitalRead(ENCODERA); // legge il valore dell'input e lo conserva
digitalWrite(MOTOA, val); // ecc.+ MOTORE A
val = digitalRead(ENCODERB); // legge il valore dell'input e lo conserva
digitalWrite(MOTOB, val); // ecc.+ MOTORE B
}
#define MOTOA 12 // Dir motore pin digitale 12
#define MOTOB 13 // Pul motore pin digitale 13
#define ENCODERA 7 // pin di input canale A encoder
#define ENCODERB 8 // pin di input canale B encoder
void setup() {
pinMode(MOTOA, OUTPUT); // imposta il pin digitale come output
pinMode(MOTOB, OUTPUT); // imposta il pin digitale come output
pinMode(ENCODERA, INPUT); // imposta il pin digitale come input
pinMode(ENCODERB, INPUT); // imposta il pin digitale come input
}
void loop() {
digitalWrite(MOTOA, digitalRead(ENCODERA)); // ecc.+ MOTORE A
digitalWrite(MOTOB, digitalRead(ENCODERB)); // ecc.+ MOTORE B
}
L'uso di define accelera leggermente le operazioni, come misurato da Astro alcuni anni fa
Leggere il piedino nella digitalwrite riduce i tempi e lo spazio in memoria, dato che non passa per variabili, dovrebbe fare tutto nello stack...
Meno di così serve di passare alla port manipolation, che non conosco e non voglio imparare
Oppure attaccare dirette le uscite dell'encoder agli ingressi del driver
C'è anche questa libreria che fa uso di interrupt che è ottima.
L'autore dice che su ATMega328 arriva fino a 25000 step/s e quindi nel tuo caso sarebbero 31.25 giri al secondo.
Sai, vero, che anche gli stepper hanno un loro limite fisico di numero di impulsi per secondo, dopo il quale diventano instabili, o alla peggio si fermano ? ... hai controllato i dati del tuo ?
Dipende molto dal tipo di motore, e da quanta corrente si fa passare nelle bobine ... il problema e' l'inerzia meccanica del rotore, se la commutazione diventa piu veloce di quanto inerzia e corrente consentano di muoverlo ... per le alte velocita' (fino ad un certo limite ovviamente) ci sono produttori che hanno realizzato motori passo-passo con magneti a disco, tipo la Escap (ora Portescap), ma costano parecchio ...
val = digitalRead(ENCODERA);
digitalWrite(MOTOA, val);
val = digitalRead(ENCODERB);
digitalWrite(MOTOB, val);
}
Se devi solo ricopiare gli ingressi sulle uscite, il controllo diretto delle porte aumenta la velocità di quaranta volte, ma a quel punto perché non collegare direttamente l'encoder al driver togliendo completamente di mezzo Arduino?
Beh, questo implica i necessari rallentamenti per i necessari conteggi
Poi, hai valutato che imporre una rampa di accelerazione implica la presenza di un 'errore di inseguimento' ?
Per definizione ineliminabile
Oltre alla possibilità di overshoot
Soprattutto, mi sa che serviranno motori "grossi" ... nel senso di "con molta piu potenza del necessario", per fare in modo che le varie inerzie meccaniche, inclusa quella del motore stesso, a quelle velocita' non ti sballino il posizionamento ... piccoli motori stepper e alta velocita' non e' che vadano sempre molto daccordo, se e' necessario anche un posizionamento molto accurato ...
In genere e' per quello che si preferiscono i brushless controreazionati con encoder e demoltipliche, in molti casi a livello industriale ... certo non sono economici come gli stepper, specie in certe configurazioni ...
Ma a te alla fine cosa serve "in pratica" ? ... che massa sposta il motore, ed a quale velocita' deve farlo per forza ?