Progetto con motore stepper

Ciao a tutti,
sono nuovo dei motori stepper ma ho pensato e sto valutando se uno stepper può fare al caso mio.
Vorrei agganciare un disco di diametro 10 cm e spessore 1mm con 4 fori praticati perpendicolarmente tra loro (90° ciascuno) all'albero di uno stepper.
Lo stepper dovrà avere una velocità max di 4000 rpm circa (so che è difficile raggiungere tali velocità), ma la cosa più complicata sarà quella di mettere in fase la rotazione del disco con quella di un altro motore su cui monterò un encoder.
Ad ogni giro del motore 1 con encoder dovrà corrispondere 1/4 di giro dello stepper e in base alla posizione dell'encoder far partire la rotazione dello stepper per avere uno dei 4 fori del disco nella posizione voluta,; ovvero far si che ad esempio tra 100 e 200° di posizione dell'albero del motore 1 corrisponda il movimento di 1/4 di giro dello stepper.

Tutto questo deve avvenire alla velocità max di 16000 rpm del motore 1 da cui lo stepper dovrà avere velocità di 4000 rpm.

E' fattibile? Se non con lo stepper con quale altro motore da pilotare a 12v si può tentare?

quelle velocità le raggiungi con i brushless tipo quelli da modellismo per aerei. I valori vengono dati in Kv, ovvero rpm/v, e di solito si aggirano dai 700 ai 1300rmp/v, e i voltaggi vanno a multipli di ~3.6v

Essendo pilotati con 3 fasi, SE ti costruisci tu l'ESC (quello che genera le 3 fasi) allora dovresti avere controllo completo sulla velocità di rotazione e ricavarti la posione del rotore. Ci sono progetti di ESC openhardware/opensource, l'afroesc è il più famoso.

edit: però è una cosa parecchio complessa, ti avviso

Grazie della risposta.
Mi consigli un buon sito di brushless trifase a 12v?
Vorrei trovarne uno di dimensioni non superiori a 50mm di lunghezza.

gurda su http://www.jonathan.it/ :grin:

Scusa ma non riesco a capire la relazione tra ciò che mi dici e quello che devo fare.
Si trova un esc già fatto da pilotare (in posizione e velocità) con Arduino?
I motori BL DC che ho visto nn mi sembrano a 3 fasi.

devi guardare i brushless non gli spazzole. Di esc con ritornodi posizione ci saranno sicuramente ma costano, mentre un esc normale costa 10/15€ e supporta solo input (segnale PPM come per gli esc), però esempio gli afroesc che sono opensource e openhardware, con supporto i2c e seriale, quindi un ottimo punto di partenza per estrarre la posizione, sia perchè probabilmente è già fatto, sia perchè senon è fatto puoi metterci le mani.

kiss

Ma io stavo guardando i bless...
Posso orientarsi invece su un DC brushed e controllarlo con PID e ponte h per accelerarlo e frenarlo per inseguire la posizione?

non seguirai mai la sua posizione senza avere un encoder esterno.

ps. tutti i dc-brushless da modellismo sono a 3 cavi

Certo lo so ma io vorrei mettere un encoder sul motore 1 e uno sul DC da controllare magari col pid

ekjk:
Ma io stavo guardando i bless...
Posso orientarsi invece su un DC brushed e controllarlo con PID e ponte h per accelerarlo e frenarlo per inseguire la posizione?

Molto difficile. Devi regolare sia la posizione che la fase.
Ciao Uwe

Potresti spiegarti meglio?

Ho deciso di buttarmi sul DC con spazzole...vedo cosa ne ricavo con o senza PID.
Dato che sto costruendo due encoder ottici che dovrò leggere tramite atmega328 vorrei sapere se una gestione tramite interrupt come spiegata in questo link può andar bene: http://www.geertlangereis.nl/Electronics/Pin_Change_Interrupts/PinChange_en.html

Vorrei usare 4 ingressi analogici ognuno dei quali mi chiama la stessa isr dove all'intero tengo conto della posizione del motore e se ha passato lo zero. Il mio dubbio è: se entro nella isr per uno dei quattro ingressi che si è alzato per esempio e nello stesso istante si alza anche un altro ingresso, all'interno della isr facendo un controllo sul valore dell'ingresso me ne accorgo o perdo un colpo?

solo una volta viene sollevato un flag. se anche il flag è sollevato perdi un colpo

attchInterrupt funziona solo su 2 pin nell'atmega328, e comunque funziona solo su valori digitali (ma i pin sono TUTTI digitali, alcuni sono ANCHE analogici)

se ti interessa ho del codice per usare TUTTI i pin come interrupt.

Il codice del link non si riferisce ad attachinterrupt ma a un altra gestione..dai un occhio per favore. Grazie

ah, sì, ho guardato solo la prima parte, allora è lo stesso codice che ti proponevo, può essere usato su tutti i pin

Grazie...riguardo il fatto di perdere dei colpi può sussistere o no?

dipende da quanto sono lente le tue ISR. Più sono leggere e meno probabilità ci sono.

tutto dipendeanche dalla velocità di rotazione, e dalla precisione necessaria (quindi quanti interrupt al secondo prevedi)

Ok. Ce ne saranno una infinità di interrupt...un motore gira al max a 8000 rpm e l'altro a max 16000 e ho un interrupt su ogni cambio di stato ogni 15 gradi di rotazione. A me interessa solo la transizione da 0 a 1.
Prevedo un casino pazzesco :frowning:
Forse dovrei buttarmi su Arduino due per avere piu aVelocità di calcolo. Che dici?

ma stai scerzando? facciamo quattro conti assieme...

16000 RPM = 267 interrupt al secondo, ovvero 265Hz, ovvero mezzo al MILLIsecondo, * 15 (numero sensori) 3975 Hz, circa unoogni 200microsecondi

frequenza di funzionamento dell'atmega328: 16MHz, ovvero 16.000.000 Hz, infatti l'arduino pensa in MICROsecondi (1000 microsecondo = 1 millisecondo), in particolare pensa di 4 microsecodi in 4 microsecondi

Come puoi vedere hai potenza di calcolo più che a sufficienza, consideramdo che all'interno della ISR non devi fare altro che inrementare o diminuire una variabile in base ai pin che hanno cambiato di stato, direi che al massimo usi 10/20microsecondi.

Rifaccio il calcolo:
ho due motori

motore master: 16000 rpm: 266Hz, ma l'encoder che gli monto è dotato di 48 transizioni luce passa- luce non passa, quindi 24 fronti di salita, ovvero uno ogni 15°. a 16000 RPM t=15/(360*266)=156us -> ogni 156us ho un fronte di salita. La ISR viene chiamata ad ogni "pin change" quindi anche sul fronte di discesa, allora ogni 156/2=78us.
Su tale encoder c'è anche un "dente" più lungo e che da la posizione di 0°, che a 16000 RPM è una volta ogni 3.75ms.

motore slave: 8000 RPM: 133Hz -> ogni 15° t=15/(360*133)=313us -> la ISR viene chiamata ogni 313/2=156us.
Su tale encoder c'è anche un "dente" più lungo e che da la posizione di 0°, che a 8000 RPM è una volta ogni 7.5ms.

Quindi ho 4 pin change con queste tempistiche. Oltre a incrementare due variabili che mi tengono conto della posizione vorrei ricavare la velocità dei due motori usando

freq=1000000/(micros()-micros_precedente);

per ogni motore. Questa è meglio farla poi nel loop e nella ISR mi salvo solo il micros ad ogni fronte di salita?