Nel mio progetto rispetto ad altre versioni che utilizzano Arduino ho fatto essenzialmente due cose:
1) Ho semplificato al massimo le operazioni matematiche, calcolando i fattori di divisione a monte con un foglio execl e inserendoli in una apposita tabella, in fase di scrittura del codice.
2) Utilizzo il Timer del micro per la lettura, la divisione e la memorizzazione della posizione angolare dell'encoder. Questa scelta ha una serie di svantaggi che vengono ampiamente ripagati dai vantaggi.
Uno dei svantaggi principali è che non è possibile duplicare o quadruplicare la risoluzione dell'encoder. Il vantaggio principale consiste nel tempo tra un'interruzione (interrupt) e quella successiva, che non dipendono esclusivamente dalla risoluzione dell'encoder e dal numero di giri, ma soprattutto dal valore di divisione. Per chiarire: Leggendo ognuno dei fronti di salita e discesa del segnale dei rispettivi canali, con un encoder da 400 impulsi a giro, assumendo cove valore di giri del mandrino di 1000 giri/min, si avrà un interrupt che sarà uguale:
1) Convertiamo i giri/minuto in giri secondo:
1000 giri/min : 60 = 16,67
2) Calcoliamo gli impulsi per secondo (senza quadratura e solo canale A):
400 impulsi/giro X 16,67 giri/sec = 6666,67 impulsi/sec
3) Con una lettura inquadratura 4X:
6666,67 impulsi/sec x 4 = 26666,67 impulsi/sec
4) Calcoliamo il periodo:
(1/26666,67) x 10 elevato al sesta = 37,5 us
Quindi qualunque sia il rapporto di divisione il tempo tra un interrupt e quello successivo sarà sempre di 37,5 us.
Invece utilizzando il Timer del micro a parità di risoluzione, il tempo di interruzione dipenderà dal valore di divisione, per esempio se il valore di divisione è di 10, il tempo tra un interruzione e quella successiva sarà di circa 375 us.
Utilizzare una risoluzione maggiore permette di spingere il micro passo fino ad 1/16, rendendo il movimento della vite madre estremamente fluido e di mantenere sincronizzato la vite madre anche durante l'avanzamento esattamente come se tra la vite madre e l'albero del mandrino ci fossero una cascata di ingranaggi. In parole povere nel mi codice sorgente, l
a routine che utilizzo per filettare è la stessa che uso per gli avanzamenti.