encoder e stepper, un paio di domande

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

esempio di come e' costruito

mimmocap:

void loop() { 

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?

Etemenanki:
., ci sono produttori che hanno realizzato motori passo-passo con magneti a disco, tipo la Escap (ora Portescap), ma costano parecchio ...

https://www.portescap.com/-/media/project/automation-specialty/portescap/portescap/products/why-a-disc-magnet-motor/discmagnet_chart_720x450_1_0.jpg

esempio di come e' costruito

E' vero! Nel mio tornio c'erano 2 di questi motori, facevano 6000rpm il nema17 e 3000rpm il nema34 con ho sostituito con 2 motori servoDC

http://www.dmxpassion.altervista.org/dm3000.pdf

http://www.dmxpassion.altervista.org/pg026.html

Il problema è che collegando l'encoder direttamente al drive raggiunge tranquillamente la velocità voluta, ma a me serve una rampa di accelerazione!

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 ?