MECCANICA e DINTORNI
http://meccanicaedintorni.morpel.it/phpbb/

ELS (Electronic Lead Screw) - progetto con ARDUINO
http://meccanicaedintorni.morpel.it/phpbb/viewtopic.php?f=16&t=15729
Pagina 8 di 95

Autore:  mimoletti [ sab dic 19, 2015 16:16 ]
Oggetto del messaggio:  Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Rispetto la tua opinione, io sono stato un'autodidatta, cosa intendi per simmetricità del codice?

Autore:  McMax [ sab dic 19, 2015 18:00 ]
Oggetto del messaggio:  Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Che in qualsiasi situazione sai esattamente cosa ti capita. Che non esistono situazioni in cui può o meno capitare qualcosa in funzione del caso e, non ultimo, che l'esecuzione sia simmetrica: se ci metti più tempo a gestire una determinata situazione e la sua inversa il codice non è simmetrico.

Autore:  AF116 [ sab dic 19, 2015 18:28 ]
Oggetto del messaggio:  Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Anch'io sono autodidatta e sento molto la mancanza di una preparazione di base. Purtroppo, complice il fatto che quando andavo a scuola non esisteva neanche il VIC20, non ci hanno insegnato nulla.

Lo stepper è accoppiato, per ora in rapporto 1:1 alla vite madre, manca di stozzare la puleggia V.M. per la chiavetta, speriamo nella buona volontà di mafa!

Autore:  luk2k [ sab dic 19, 2015 18:32 ]
Oggetto del messaggio:  Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

permettetemi un'intrusione a volo

in condizione di non simmetricita', ovvero avere un output non predeterminabile a priori perchè funzione anche di variabili non dipendenti dalla nostra volonta', in caso di debug si ha anche il problema di non sapere se l'errore che riscontriamo è colpa di qualche cosa che non va o è semplicemente una condizione particolare di funzionamento del programma

bye luk

Autore:  mimoletti [ sab dic 19, 2015 21:50 ]
Oggetto del messaggio:  Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Ottima domanda, di solito divido il programmi in sottoprogrammi, destinati ad un compito specifico. Max che strategie devono essere usate per il debug?

Autore:  mafa [ sab dic 19, 2015 22:08 ]
Oggetto del messaggio:  Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Ciao Mario, sai dove sono.

Autore:  mimoletti [ dom dic 20, 2015 02:34 ]
Oggetto del messaggio:  Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Problema della simmetria risolto!
Ora ho sempre lo stesso numero d'impulsi in un senso che nell'altro.

Autore:  McMax [ dom dic 20, 2015 10:37 ]
Oggetto del messaggio:  Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Il debug ormai si fa quasi sempre via software visto che quasi tutti gli ambienti di sviluppo integrano degli strumenti di debug.
MPLAB di Microchip prevede la possibilità di inserire dei "breakpoints" ovvero dei punti in cui fermare l'esecuzione del programma in modo da poter osservare quello che succede prima o dopo una determinata azione che magari non sta eseguendo ciò che ci si aspetta. Oltre a ciò è possibile attivare dei "monitor" che fanno vedere quello che succede alle variabili mentre il programma viene eseguito. L'utilizzo dei breakpoints e dei monitor combinato permette un'analisi del codice molto puntuale ed aiuta a capire esattamente dove sta il "bug".
Una volta il debug si faceva su carta, prima ancora di far girare il programma, si compilava una tabella nota come "trace table". In pratica si faceva quello che si fa con breakpoints e monitor con la differenza che il programma non veniva eseguito realmente ma veniva scandito dal programmatore a mente: istruzione per istruzione si analizzava l'esecuzione e si compilava la trace table con i valori delle variabili, cambiandoli manualmente durante l'esecuzione.

Autore:  AF116 [ dom dic 20, 2015 17:33 ]
Oggetto del messaggio:  Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Un'altro piccolo passo avanti: la puleggia per l'encoder

Autore:  mimoletti [ dom dic 20, 2015 21:19 ]
Oggetto del messaggio:  Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Questa è la parte di codice che si occupa di dividere gli impulsi, con una piccola modifica al codice ora posso gestire le inversioni, senza errori e mantenere la sincronizzazioni degli avanzamenti anche ad elevati numero di giri (praticamente due piccioni con una fava):

if Select_Mode = 0 then
TMR0L = Div1
Max_Count = 1
else
TMR0L = 255
if In_Dir = 0 then
Count_Impulse = Count_Impulse + 1
if Count_Impulse > Div_Totale then
Count_Impulse = 1
Max_Count = 1
end if
end if
if In_Dir = 1 then
Count_Impulse = Count_Impulse - 1
if Count_Impulse < 1 then
Count_Impulse = Div_Totale
Max_Count = 1
end if
end if
end if
if Max_Count = 1 then
Max_Count = 0
Step_Out = 0
if Select_Mode = 0 then
Somma = Somma + Div2
if Somma >= 10000 then
Somma = Somma - 10000
Div_Totale = Div1 + 1
else
Div_Totale = Div1

end if
end if
Step_Out = 1
end if
TMR0IF_bit = 0

Non ci sono i commenti ma dovrebbe essere abbastanza chiaro.
In funzione del menu in cui mi trovo, avanzamento o filettatura gestisco il timer i due modi diversi.
In rosso la parte di codice che si occupa di eseguire la divisione frazionaria.

Autore:  McMax [ lun dic 21, 2015 07:45 ]
Oggetto del messaggio:  Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Almeno le variabili peró.....
count_impulse ?
step_out?
div2 da dove arriva?

L'impulso di step come lo generi? come garantisci che stia alto per il tempo giusto senza impegnare il codice in attese?

Autore:  mimoletti [ lun dic 21, 2015 08:22 ]
Oggetto del messaggio:  Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Hai ragione Max, ma avevo sonno...., ti rispondo:

Div1 é il valore di divisione a sinistra della virgola, Div2 il valore a destra, sono contenuti in una tabella.
Count_Impulse invece l'ha utilizzo per contare gli impulsi. Lo step.... Affrontiamo un problema alla volta.
Possiamo ora stabilire che l'uso del timer non è matematicamente impossibile?

Autore:  McMax [ lun dic 21, 2015 10:29 ]
Oggetto del messaggio:  Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Scusa Massimo ma per decifrare quel codice ci vuole tempo ed in alcuni casi anche fantasia visto che non vedo nemmeno dove sta il ciclo e come gira e, soprattutto, alcune variabili vengono modificate all'esterno di questo spezzone e non posso sapere come.

La prima cosa strana che vedo é che parti con un "if Select_mode = 0" e questo if termina con il suo "else" alla fine dello spezzone di codice. Ma all'interno di questo else tu riproponi la stessa condizione che per dove é messa non potrá mai essere vera.... A meno che il select_mode non venga modificato all'interno di una routine di interrupt ma anche in quel caso non ha molto senso che venga gestito così.

Autore:  mimoletti [ lun dic 21, 2015 11:31 ]
Oggetto del messaggio:  Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Non ti devi scusare, capire il lavoro degli altri non è mai facile, soprattutto quando scritto in maniera non professionale, a scuola ho avuto un bravo insegnante di elettronica digitale, ma l'ho Z80 l'ho abbiamo appena accennato, non riesco a scriverlo come vorrei, automaticamente quando invio il post mi vengono tolti gli spazi, proviamo cosi, ora gli if e end if sono allineati correttamente:

Inizio Subroutine di interrupt

if Select_Mode = 0 then
*TMR0L = Div1
**Max_Count = 1
*else
****TMR0L = 255
*****if In_Dir = 0 then
******Count_Impulse = Count_Impulse + 1
*******if Count_Impulse > Div_Totale then
********Count_Impulse = 1
********Max_Count = 1
*******end if
*****end if
*****if In_Dir = 1 then
******Count_Impulse = Count_Impulse - 1
*******if Count_Impulse < 1 then
********Count_Impulse = Div_Totale
********Max_Count = 1
*******end if
*****end if
end if
if Max_Count = 1 then
*Max_Count = 0
**Step_Out = 0
***if Select_Mode = 1 then
****Somma = Somma + Div2
*****if Somma >= 10000 then
******Somma = Somma - 10000
*******Div_Totale = Div1 + 1
******else
*******Div_Totale = Div1
*****end if
***end if
****Step_Out = 1
end if
TMR0IF_bit = 0

Fine Subroutine di interrupt

Il valore di Select_Mode viene deciso all'interno della routine principale è può avere, valore 0 se sono in menu avanzamento e 1 se in menu filettatura, quindi quando non mi serve avere il sincronismo perfetto carico nel timer il valore di divisione a destra della virgola div1, (div2 non viene conteggiato, non serve negli avanzamenti), altrimenti carico valore 255 cosi da avere la possibilità di contare ogni singolo impulso. Quindi quando si inverte il senso di rotazione, monitorando In_Dir (uscita del Flip Flop) ho la possibilità di decrementare la mia variabile, esattamente come fai tu con gli indici. Cosa che già facevo quando devo memorizzare la posizione angolare. Quindi l'ho solo applicata al conteggio degli impulsi.

Div1 e Div2 nel rispettivi menu vengono aggiornate quando si passa da un passo ad un'altro.

Autore:  mimoletti [ lun dic 21, 2015 11:45 ]
Oggetto del messaggio:  Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Quindi riassumendo:

Se sono nel menu avanzamento carico nel Timer il valore di Div1, altrimenti carico valore 255 e conteggio ogni singolo impulso, e il valore della variabile Count_Impulse viene incrementato o decrementato a seconda del senso di rotazione del mandrino, se il valore di Count_Impulse e uguale al valore di divisione, Max_Count varrà 1 e sarà generato un'impulso di step.

Pagina 8 di 95 Tutti gli orari sono UTC +1 ora
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/