motorizzazione asse X con arduino per fresa

Moderatore: Junior Admin

sbinf74
TORNITORE E FRESATORE
Messaggi: 1349
Iscritto il: ven nov 21, 2008 14:34
Località: Roma

Re: motorizzazione asse X con arduino per fresa

Messaggio da sbinf74 »

Io vado avanti ho degli impuntamenti ogni tanto che devo ancora capire ma in linea di massima ci sono.

Per ora muovo contemporaneamente due motori (per il terzo devo prendere un drive da utilizzare a banco)

Ho aggiunto un demoltiplicatore per aver velocità moto ridotte , nel display è "x1" in alto a destra che scende fino ad "x.01"

gli rpm sono relativi al motore che in quel momento gira più veloce.

Il display è piccolino è dura farci stare tutto :grin:
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.
Avatar utente
Davide Resca
CAPO OFFICINA
Messaggi: 13863
Iscritto il: lun feb 29, 2016 11:29
Località: Ustica & Dintorni saltuariamente Bologna o Pesaro
Contatta:

Re: motorizzazione asse X con arduino per fresa

Messaggio da Davide Resca »

Azz ... te sei avanti anni luce :inchino:
Gli errori sono per i principianti, noi esperti puntiamo al disastro !!!
Le conoscenze acquisite, sono proporzionali al DANNO PRODOTTO !!! ( esperienza personale...)
youtube



Immagine 2°socio TIRATOSAURO CLUB ITALIAN
raunarde
SON PASSATO AI TRAPANINI
Messaggi: 114
Iscritto il: lun nov 04, 2019 12:49
Località: tra i laghi zona Varese

Re: motorizzazione asse X con arduino per fresa

Messaggio da raunarde »

ma gli spostamenti che si visualizzano sul display sono precisi se paragonati al DRO?

a questo punto mi faccio un bel impiantino con quelli e non prendo il DRO a 3 assi.
Ovviamente ricordo dai tuoi video sei passato a viti a ricircolo di sfere sul tuo RF-30 giusto?
sbinf74
TORNITORE E FRESATORE
Messaggi: 1349
Iscritto il: ven nov 21, 2008 14:34
Località: Roma

Re: motorizzazione asse X con arduino per fresa

Messaggio da sbinf74 »

Questo segna lo spostamento motore e non tiene conto dei giochi meccanici. Si potrebbero comunque compensare le letture nei cambi di direzione.....io ho le viti a ricircolo.
Avatar utente
McMax
CAPO OFFICINA
Messaggi: 9023
Iscritto il: dom gen 31, 2010 21:46
Località: Bussero (MI)

Re: motorizzazione asse X con arduino per fresa

Messaggio da McMax »

eh ragazzi vedete Sbinf si è applicato e in meno di una settimana sta già facendo girare gli stepper con i timer.... :hammer:

Non è nulla di complicato, e Sbinf ve lo confermerà, basta solo perderci un po' di tempo per capire come funzionano i timer, i relativi registri e importantissimi gli interrupt associati. Una volta fatto quello è tutta in discesa e vi si aprirà un modo nuovo :risatina:
McMax

“None of us can change the things we’ve done. But we can all change what we do next.” – Fred Johnson

fulminato in tenera età
Avatar utente
Davide Resca
CAPO OFFICINA
Messaggi: 13863
Iscritto il: lun feb 29, 2016 11:29
Località: Ustica & Dintorni saltuariamente Bologna o Pesaro
Contatta:

Re: motorizzazione asse X con arduino per fresa

Messaggio da Davide Resca »

Si ! sta fava :risatina:
Max non ho le basi ... non ce la posso fare a farcela ... sono due ore che leggo il tuo codice poi arrivo ad un if vattelapesca || vattelapesca :shock: che sono i due "pipe" accostati ? l'equivalente del OR ?
Capisciammè ... so come programmare con i flussi , dividere il programma in più parti, ma non conoscendo la sintassi del C arrivo in certi punti e perdo il filo ... Diventa un lavoro enorme decodificare il codice solo per capire e magari utilizzare certe proprièta' del linguaggio da utilizzare per i miei scopi... mi viene più facile dirti " devo fare questo... fallo !!!" :mrgreen: ma poi mi ingastrisco e mi girano le balle perchè non capisco come e cosa :muro:
Ho già fatto tutti i tutorial del kit elegoo , ma più di fare comparire una scritta o accendere un led RGB con la dissolvenza o far fare un numero di giri ad uno stepper motor non sono riuscito a fare ... ma da li a mettere insieme il tutto e fare un progetto funzionante come il tuo ce ne vuole... altro che applicarsi .
Qualcosa sono riuscito a "tradurlo" con tutti i Sw che ho utilizzato in passato (Lisp, Qbasic, PicBasic, asm ) ma nel C il flusso è totalmente diverso e faccio una gran fatica, per ora non demordo ma siccome ho in mente un progetto già ora ti comunico che tu, sbinf e tutti quelli che programmano in C ... AVETE UN PROBLEMA... IO !!! :risatina: :risatina: :risatina:
Gli errori sono per i principianti, noi esperti puntiamo al disastro !!!
Le conoscenze acquisite, sono proporzionali al DANNO PRODOTTO !!! ( esperienza personale...)
youtube



Immagine 2°socio TIRATOSAURO CLUB ITALIAN
Avatar utente
McMax
CAPO OFFICINA
Messaggi: 9023
Iscritto il: dom gen 31, 2010 21:46
Località: Bussero (MI)

Re: motorizzazione asse X con arduino per fresa

Messaggio da McMax »

Davide, tu inizia a fare le domande giuste che vedrai che le risposte arrivano :risatina:

Il C é molto più semplice (e leggibile) di tutti gli altri linguaggi che hai citato. Credimi !
McMax

“None of us can change the things we’ve done. But we can all change what we do next.” – Fred Johnson

fulminato in tenera età
umbez
TORNITORE E FRESATORE
Messaggi: 1895
Iscritto il: lun set 29, 2008 23:19
Località: Cologno Monzese

Re: motorizzazione asse X con arduino per fresa

Messaggio da umbez »

Davide guarda che se tanto ti piace arduino lo puoi programmare anche in asm, alla fine il processore è un atmega, non è che ha firmato un contratto con il C eh...
Ù.
umbez
TORNITORE E FRESATORE
Messaggi: 1895
Iscritto il: lun set 29, 2008 23:19
Località: Cologno Monzese

Re: motorizzazione asse X con arduino per fresa

Messaggio da umbez »

Per il tuo problema sbif, ti do una dritta ovvia, ma magari uno mentre progetta programma, preso da quello che fa non ci pensa, utilizzare due processori, uno per l'unità di controllo e un nano per l'unità dro non è peccato mortale eh...dal nano basta leggere step e dir, lascerei fare all'unità di controllo ciò che deve fare, ovvero controllare motori e rampe
Ù.
Avatar utente
Davide Resca
CAPO OFFICINA
Messaggi: 13863
Iscritto il: lun feb 29, 2016 11:29
Località: Ustica & Dintorni saltuariamente Bologna o Pesaro
Contatta:

Re: motorizzazione asse X con arduino per fresa

Messaggio da Davide Resca »

Si umbez, hai ragione ma ... avevo abbandonato l'asm perchè ci diventavo pazzo ... mi è comunque servito perchè oggi almeno quando si parla di configurazioni di bit sui vari registri almeno so di cosa si sta parlando :mrgreen: ( comunque non sono un esperto e per programmare in asm o lo fai tutti i giorni o, se lo fai di rado, non ti passa più ...)
Cercavo comunque di apprendere un codice (il C ) perchè dal 1970 non è cambiato di una virgola ( a parte il C++ ) ma è un bagno di sangue :risatina: probabilmente anche perchè mi sono "imprintato" con altri codici e adesso è durissimo fare il cambio mentale ...
Gli errori sono per i principianti, noi esperti puntiamo al disastro !!!
Le conoscenze acquisite, sono proporzionali al DANNO PRODOTTO !!! ( esperienza personale...)
youtube



Immagine 2°socio TIRATOSAURO CLUB ITALIAN
raunarde
SON PASSATO AI TRAPANINI
Messaggi: 114
Iscritto il: lun nov 04, 2019 12:49
Località: tra i laghi zona Varese

Re: motorizzazione asse X con arduino per fresa

Messaggio da raunarde »

McMax, leggendo il tuo codice ho capito più o meno il funzionamento dei void start, stop, isr e clear pwm ma non ho capito questo:

Codice: Seleziona tutto

void SetPWM()    //imposta il PWM e avvia il Timer1
{
  ICR1 = 65535;                        //(65535) TOP impostato al valore massimo in modo da avviare il motore con la minima frequenza
  OCR1A = 3;                           // OCR1A impostato a 3 in modo che il "CLEAR" del pin OC1A venga effettuato dopo 6 cicli del timer1.[color=#FF0040]<--non ho capito cosa faccia[/color]
                                               // ovvero 24us con prescaler clk/64
  TCCR1A = _BV(COM1A1) | _BV(WGM11);   //OC1A (pin 9) set for PWM with SET at BOTTOM and CLEAR at MATCH (non-inverted mode)
  TCCR1B = _BV(WGM13) | _BV(WGM12);    //WGM set for Fast PWM with ICR1 used as TOP value [color=#FF0040]<--e questo?[/color]
altra cosa che non ho capito è come setti la velocità quindi cambiando presumo il valore del prescaler


nel mio caso banalissimo dove voglio far partire il motore, a questo punto con accelerazione, devo variare la frequenza del PWM mappandola con il valore letto dall'ingresso analogico dove ho il potenziometro. Ma non trovo la chiave per gestire il timer... oddio ho guardato video dove descrivono i funzionamenti dei timer ma da quello ad adattarlo al mio ne devo ancora guardare di documentazione.
Avatar utente
McMax
CAPO OFFICINA
Messaggi: 9023
Iscritto il: dom gen 31, 2010 21:46
Località: Bussero (MI)

Re: motorizzazione asse X con arduino per fresa

Messaggio da McMax »

umbez: " utilizzare due processori, uno per l'unità di controllo e un nano per l'unità dro"
lo trovo uno spreco di risorse inutile. I timer chiamano interrupt specifici che devi comunque usare per aggiornare la frequenza del PWM e nei quali puoi anche tenere traccia della posizione, non ha senso usare un altro micro esterno per fare una cosa così banale.

Davide:"per programmare in asm o lo fai tutti i giorni o, se lo fai di rado, non ti passa più ..."
Diciamo piuttosto che al massimo lo potevi fare tutti i giorni negli anni 80, e forse qualcuno pure nei 90, ma oggi credo che i programmatori di ASM siano tutti in pensione o peggio, passati a miglior vita :risatina:
Programmare un microcontrollore (o qualsiasi altra cosa) in ASM al giorno d'oggi con la complessità che abbiamo è un'impresa titanica...

raunarde, la SetPWM() serve a impostare il timer e la relativa uscita come fast PWM mode. Quel pin (e il timer associato) lo puoi usare in diversi modi, nel firmware del ELS lo uso essenzialmente in due modi diversi:
FastPWM: per gli avanzamenti, quando mi serve portare il motore a una certa velocità conmtrollata, tenendo traccia della posizione ma senza vincolare in modo preciso il motore stepper all'encoder
SingleShot: per le filettature, ovvero quando mi serve avere un controllo preciso e puntuale del passo da dare alla vite. Nella modalità SingleShot il PWM genera un impulso di step solo e poi si ferma. La uso per non impegnare il micro con delay quando devo eseguire un passo. In pratica l'operazione che tu eseguivi nel tuo codice alzando il pin, aspettando e poi abbassandolo di nuovo. La differenza sostanziale è che io do un'istruzione ( FireStep(), nello specifico ) e pensa lui a dare un impulso della durata corretta senza che questo sia bloccante per il codice. Per usare questa modalità lancio prima la funzione di configurazione SetOneShot() in alternativa a SetPWM(). Se ti scarichi il mio codice del ELS e ti studi la pirma parte (quella nella scheda principale) capisci meglio il tutto.

Tornando alla modalita Fast PWM, che è quella che più ti interessa, per variare la frequenza vario il valore della variabile TOP. Questa varibile viene caricata nel registro di comparazione del Timer ad ogni interrupt, dando la possibilità di variare la frequenza ad ogni ciclo. Se non varia verrà caricato lo stesso valore e la frequenza resterà costante. Questa variabile è un intero senza segno a 16 bit, quindi con valore compreso tra 0 e 65535. Se il valore è basso la frequenza è alta, se il valore è alto la frequenza è bassa. Quindi la minima frequenza la avrai con TOP = 65535, la massima con TOP = 0 (non proprio a 0 perchè altrimenti non va visto che non ha il tempo di dare nemmeno il singolo impulso). In pratica TOP è il valore di partenza del Timer con conterà alla rovescia dal valore che imposti a 0. Il pin di uscita cambierà di stato quando il valore del Timer incrocia quella del resistro OCR1A che io ho impostato a 3 quindi cambierà di stato nuovamente quando il Timer arriva a 0. Il valore di OCR1A ti da quindi la durata dell'impulso di step.
Un po' di matematica per fare chiarezza: con prescaler impostato a clk/64 la frequenza del singolo impulso sarà appunto quella del clock (16Mhz) / 64 = 250Khz. Quindi il tuo timer farà 250000 "scatti" al secondo. Essendo che il Timer conta fino a 65535, avrai quindi 3,81 cicli di Timer completi in un secondo. Se imposti quindi TOP = 65535 avrai 3,81 step del motore al secondo. Partendo da qui ti puoi calcolare gli step al secondo per ognuno dei valori di TOP, sapendo che comunque la velocità minima sarà quella qui sopra calcolata, ovvero 3,81step/secondo....
McMax

“None of us can change the things we’ve done. But we can all change what we do next.” – Fred Johnson

fulminato in tenera età
Avatar utente
Davide Resca
CAPO OFFICINA
Messaggi: 13863
Iscritto il: lun feb 29, 2016 11:29
Località: Ustica & Dintorni saltuariamente Bologna o Pesaro
Contatta:

Re: motorizzazione asse X con arduino per fresa

Messaggio da Davide Resca »

:shock: :shock: :shock:
vi odio tutti :risatina:
Gli errori sono per i principianti, noi esperti puntiamo al disastro !!!
Le conoscenze acquisite, sono proporzionali al DANNO PRODOTTO !!! ( esperienza personale...)
youtube



Immagine 2°socio TIRATOSAURO CLUB ITALIAN
raunarde
SON PASSATO AI TRAPANINI
Messaggi: 114
Iscritto il: lun nov 04, 2019 12:49
Località: tra i laghi zona Varese

Re: motorizzazione asse X con arduino per fresa

Messaggio da raunarde »

Grazie mille McMax, un pelo più chiaro lo è ora mi guardo il tuo prog. poi ti dirò cosa ho capito (poco) e cosa non avrò capito (tutto) :risatina:
Avatar utente
McMax
CAPO OFFICINA
Messaggi: 9023
Iscritto il: dom gen 31, 2010 21:46
Località: Bussero (MI)

Re: motorizzazione asse X con arduino per fresa

Messaggio da McMax »

edit: scusate ho detto una cagata, il Timer non conta alla rovescia ma a salire. cerco di spiegarlo meglio:
Il timer, una volta avviato, conterà alla frequenza di clock/prescaler (nel caso in esame 16Mhz/64), e nello specifico quindi conterà un impulso ogni 4us (microsecondi).
Il valore di partenza del timer è detto BOTTOM e nel nostro caso è 0
Il valore di arrivo è detto TOP (per questo ho chiamato così la variabile) e deve essere contenuto nel registro ICR1. Questo valore viene caricato dalla variabile TOP al resistro ICR1 ad ogni interrupt del Timer,
L'interrupt del Timer, se attivo (e in questo caso lo è), si genera automaticamente quando il Timer arriva al valore di ICR1.
Il pin associato al Timer (OC1A), che è associato al registro OCR1A (sta per: Output Compare Register 1A) viene attivato con una modalità chiamata "set at BOTTOM, clear at MATCH" ed in particolare si muoverà alto quando il timer vale 0 (quindi quando inizia a contare) e tornerà basso quando il valore del timer combacia (match) con quello del registro OCR1A.
Nel mio codice OCR1A vale 3, quindi il pin (che da l'impulso di step) si muoverà alto appena il Timer inizia a contare un nuovo ciclo (set at BOTTOM) e tornerà basso quando il Timer vale 3, quindi dopo 4x3 (12) microsecondi. Ovvero l'impulso di step che diamo al driver sarà sempre fisso a 12us.
Tornato basso il pin il timer continuerà a contare fino a raggiungere il valore del registro ICR1 (quindi quello della variabile TOP), quindi genererà l'interrupt e tornerà a zero facendo ripartire il conteggio e muovendo il pin OCR1A come nel ciclo precedente.
Se il valore della variabile TOP viene modificato, questo verrà caricato nel registro ICR1 durante l'interrupt e la frequenza dell'intero ciclo di timer (quindi del passo generato) cambierà.
McMax

“None of us can change the things we’ve done. But we can all change what we do next.” – Fred Johnson

fulminato in tenera età
Rispondi

Torna a “Elettronica ed elettrotecnica”