Max ha scritto:
Questo encoder dovrebbe utilizzare due diverse modalità (1000 passi e 4000 passi) ma per farla semplice facciamo finta che ne usa 1000 soltanto: il concetto non cambia.
Se questo ciclo è partito quando questo encoder stava sul passo 0, da questo schema si evince che la passata terminerà quando l'encoder è sul passo 3007; a questo punto viene riconfigurato il prescaler ed il timer genererà un interrupt ogni 1000 passi, ovvero OGNI GIRO DEL MANDRINO. Ma l'index viene preso quando il mandrino segna 3007 passi, e se è partito da 0, 3007 NON è localizzato sulla stessa posizione angolare di 0 perché, se il mandrino fa 1000 passi giro, gli index stanno SUI MULTIPLI DI 1000 (quindi: 0; 1000; 2000; 3000; 4000; 5000.... ecc.). Utilizzare multipli del passo della vite non serve a nulla perchè qui stiamo analizzando la situazione in cui il filetto deve essere ripassato e quindi DEVE RIPARTIRE DALLA STESSA IDENTICA POSIZIONE ANGOLARE DA CUI ERA PARTITA LA PASSATA PRECEDENTE!
Ecco una delle tue spiegazioni fantasiose, errate atte a dimostrare che quello che faccio non è possibile.
1) La risoluzione non cambia, ma e sempre la stessa, dove avrei scritto che ho due modalità diverse? Implicherebbe anche due tabelle diverse, con diversi valori di divisione.
Massimo ha scritto:
Se invece la risoluzione del suo motore
fosse stata di 1000, avrebbe avuto un'errore in ogni caso inferiore a 2 micron.
2) Nell'esempio fatto, il mio ciclo non parte dalla posizione 0, ma dalla posizione 3007 e RIPRENDE ESATTAMENTE DALLA POSIZIONE 3007. RIPARTENDO DALLA STESSA IDENTICA POSIZIONE ANGOLARE DA CUI ERA PARTITA LA PASSATA PRECEDENTE!
3) Volendo avendo la possibilità di configurare il Timer in modalità 16 bit, potrei evitare di usare il Prescaler.
Ripetendo: Avvio la routine della divisione degli impulsi con il pulsante ON, NESSUNA POSIZIONE ANGOLARE VIENE MEMORIZZATA, premo il pulsante
PAUSE, nel punto esatto in cui voglio che la mia filettatura debba terminare, MEMORIZZO LA POSIZIONE ANGOLARE (ad esempio 3007), terminato il ciclo di Pause (in cui arretro il carro con multipli del passo della filettatura che sto eseguendo), riprendo ESATTAMENTE DALLA POSIZIONE ANGOLARE PRECEDENTEMENTE MEMORIZZATA (3007). Cosa c'è di non chiaro in quello che ho scritto? Dove avrei scritto che il mio ciclo parte dalla posizione 0? Non è altro che una delle tue invenzioni per screditare il mio algoritmo. Mi domando cosa ti inventerai ancora? magari che ho assoldato dei folletti per motorizzare la vite madre.
Ho sempre scritto: memorizzo la posizione angolare posseduta in quel preciso istante e riprendendo esattamente dalla stessa posizione angolare. Come chiaramente rappresentato nel disegno.
Anche altri utenti hanno capito come si svolge il mio algoritmo, ma stranamente non tu!
Max ha scritto errando per l'ennesima volta:
Con gli interrupt questo (e tanti altri problemi) non si pongono in quanto vengono intercettati TUTTI i passi del mandrino compresa la DIREZIONE e senza bisogno di nussuna elettronica esterna.
Se non si ha la necessità di raddoppiare la risoluzione del encoder, non è necessaria nessuna elettronica esterna per stabilire la direzione del mandrino. Basta verificare il livello logico del canale non utilizzato per incrementare il Timer.
Max ha scritto:
A quel punto non te ne frega niente di dove termini la passata perchè tutto ciò che dovrai fare sarà ritornare con la vite nella stessa identica posizione di partenza (e basta rifare a ritroso gli stessi passi fatti con lo stepper), ed attendere che il mandrino passi per un valore divisibile per 1000 (nel caso in cui i passi/giro dell'encoder siano 1000) prima ripartire con la seconda passata.
Fai esattamente quello che faccio io.
Hai praticamente il mio stesso problema, quando il numero a giro di passi a giro che generi non è intero, la posizione angolare non sara coincidente con la posizione dell'utensile, non potendo frazionare il passo.
Memorizzo la posizione 3007 arretro esattamente dello stesso numero di passi con cui ho intenzione di avanzare, riparto nuovamente dalla posizione 3007, avanzando esattamente dello stesso numero di passi con cui ho arretrato, e cosi via.
In teoria avresti dovuto fare in questo modo, potendo intercettare tutti gli impulsi dell'encoder:
Immaginando che la risoluzione dell'encoder sia di 4000 e il valore di divisione 7, partendo dal posizione 0 dovresti arrivare alla posizione alla posizione 3997 (471 x 7), oppure 4004 (472 x 7) , terminare la tua passata, per poi retrocedere nuovamente alla posizione 0 a ritroso, NON AVENDO POSSIBILITA' DI FRAZIONARE IL PASSO.
Rispetto a quello che fai, utilizzando il Timer e non intercettando tutti gli impulsi, l'unica differenza e che sono costretto ad arretrare e avanzare con multipli di passo.
Ma sei sicuro di aver capito come funziona il tuo codice? Sei uno spasso.
Corri subito dall'oculista, non hai una trave ma un ponte.....