[[guide:junction_speed:jerk_limiting]]

Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

Prossima revisione
Revisione precedente
guide:junction_speed:jerk_limiting [01/06/2018 13:01]
Simone Persiani creata
guide:junction_speed:jerk_limiting [05/06/2018 10:34] (versione attuale)
Simone Persiani
Linea 1: Linea 1:
-==== Algoritmo "Jerk Limiting"​ ===+====== Algoritmo "Jerk Limiting"​ ======
-=== Strategia ​=== +
-Uno dei problemi di questo sistema è che le accelerazioni e le decelerazioni richiedono tempo: un tempo relativamente piccolo che, moltiplicato per i milioni di movimenti richiesti per una stampa, può aumentare anche di molto i tempi di stampa.+
  
-Si è deciso quindi di evitare il più possibile tali fasi di accelerazione introducendo dei parametri modificabili dall'​utente che qui chiameremo ​//"​max_jerk"​//. In realtà tali valori si chiamano così perché incidono sul valore del jerk ma non possono essere considerati dei veri e propri jerk. Essi infatti dimensionalmente sono rappresentati da variazioni di velocità e sono quindi misurati in mm/s.+//Autore: [[iosonopersia@gmail.com|Simone Persiani]]//
  
-=== L'​algoritmo ​=== +==== Strategia ==== 
-Riprendendo ​l'esempio ​di primaavremo ​una variazione di velocità pari a <​m>​\Delta \vec{v} = \vec{v}_k - \vec{v}_j</​m>:​ +Come spiegato nella guida sulla [[guide:​junction_speed:​start|Junction Speed]], tra uno spostamento e l'altro si rendono in generale necessarie delle fasi di accelerazione. Le accelerazioni e le decelerazioni però richiedono tempo: un tempo chepur essendo relativamente piccolo, moltiplicato per i milioni di movimenti richiesti per una stampa può incidere di molto sui tempi di realizzazione dei pezzi. 
-  * **se almeno una tra le componenti XYZ di <​m>​\Delta \vec{v}</​m>​ supera il relativo ​//"​max_jerk"// ​impostato**,​ il firmware realizzerà il passaggio da <​m>​\vec{v}_j</​m>​ a <​m>​\vec{v}_k</​m>​ tramite accelerazioni. Stabilirà il valore incognito di <​m>​\vec{v}_{junction}</​m>​ in modo tale che le variazioni di velocità lungo i tre assi non superino quelle impostate tramite ​//​max_jerk//​. In realtà l'​algoritmo è nei fatti un po' più complesso di così: deve infatti tener conto anche di altri fattori tra i quali eventuali cambi di direzione degli assi (un qualunque asse deve rallentare fino a fermarsi prima di poter invertire la direzione del proprio moto);+ 
 +Si è deciso quindi di evitare il più possibile tali fasi di accelerazione:​ è stata introdotta la possibilità di non eseguirle nel caso in cui la variazione di velocità fosse abbastanza piccola da permettere ai motori stepper di effettuare la transizione senza perdita di passi. I parametri del ''​Jerk Limiting''​ sono quindi variazioni di velocità, definite indipendentemente per ciascun asse (estrusori compresi). 
 + 
 +<WRAP center round important 100%> 
 +<wrap em>​Attenzione!</​wrap>​ È importante fare attenzione a non cadere nella facile confusione generata da un'​infelice scelta di nomi: tali valori sono stati chiamati //"​jerk"//​ solo perché rappresentano i parametri del ''​Jerk Limiting'',​ che è l'​unico algoritmo in grado di incidere sul [[guide:​junction_speed:​start#​il_jerk|jerk istantaneo]]. **Da questo momento in poi, con il termine jerk ci riferiremo solamente ai parametri dell'​algoritmo.** 
 +</​WRAP>​ 
 + 
 + 
 +==== L'​algoritmo ==== 
 +Ipotizziamo due spostamenti successivi: il blocco <​m>​j</​m> ​ a velocità <​m>​\vec{v}_j</​m>​ ed il blocco <​m>​k</​m>​ a velocità <​m>​\vec{v}_k</​m>​. Avremo quindi ​una variazione di velocità pari a <​m>​\Delta \vec{v} = \vec{v}_k - \vec{v}_j</​m>:​ 
 +  * **se almeno una tra le componenti XYZ di <​m>​\Delta \vec{v}</​m>​ supera il relativo ​jerk impostato**,​ il firmware realizzerà il passaggio da <​m>​\vec{v}_j</​m>​ a <​m>​\vec{v}_k</​m>​ tramite accelerazioni. Stabilirà il valore incognito di <​m>​\vec{v}_{junction}</​m>​ in modo tale che le variazioni di velocità lungo i tre assi non superino quelle impostate tramite ​i parametri jerk. In realtà l'​algoritmo è nei fatti un po' più complesso di così: deve infatti tener conto anche di altri fattori tra i quali eventuali cambi di direzione degli assi (un qualunque asse deve rallentare fino a fermarsi prima di poter invertire la direzione del proprio moto);
   * **altrimenti** il passaggio da una velocità all'​altra sarà istantaneo e non si perderà tempo per le accelerazioni/​decelerazioni intermedie.   * **altrimenti** il passaggio da una velocità all'​altra sarà istantaneo e non si perderà tempo per le accelerazioni/​decelerazioni intermedie.
  
-=== Configurazione dei parametri === +==== Configurazione dei parametri ​==== 
-Il //"​max_jerk"// ​è quindi **la minima variazione di velocità che richiede un'​accelerazione**:​ se <​m>​\vec{v}_j</​m>​ e <​m>​\vec{v}_k</​m>​ fossero abbastanza simili tra loro, il passaggio dall'​una all'​altra sarebbe istantaneo. Questo trucchetto permette di ridurre leggermente i tempi di stampa ma va impostato correttamente:​ più i valori di //"​max_jerk"// ​vengono aumentati, maggiori saranno gli spostamenti (statisticamente) che verranno gestiti con il cambio di velocità istantaneo (e maggiori saranno quindi le vibrazioni prodotte).+In questo algoritmo il jerk è quindi **la minima variazione di velocità che richiede un'​accelerazione**:​ se <​m>​\vec{v}_j</​m>​ e <​m>​\vec{v}_k</​m>​ fossero abbastanza simili tra loro, il passaggio dall'​una all'​altra sarebbe istantaneo. Questo trucchetto permette di ridurre leggermente i tempi di stampa ma va impostato correttamente:​ più i valori di jerk vengono aumentati, maggiori saranno gli spostamenti (statisticamente) che verranno gestiti con il cambio di velocità istantaneo (e maggiori saranno quindi le vibrazioni prodotte).
  
-Riassumendo,​ i //"​max_jerk"// ​devono essere impostati tenendo a mente che abbassando tali valori si riducono le vibrazioni e i rumori prodotti dai motori ma si allungano conseguentemente i tempi di stampa, e viceversa.+Riassumendo,​ i jerk devono essere impostati tenendo a mente che abbassando tali valori si riducono le vibrazioni e i rumori prodotti dai motori ma si allungano conseguentemente i tempi di stampa, e viceversa.
  
-Per abilitare il ''​Jerk Limiting''​ è sufficiente assicurarsi che il ''​Junction Deviation'' ​sia disabilitato. Ecco un esempio di configurazione dei suoi parametri:+Per abilitare il ''​Jerk Limiting''​ è sufficiente assicurarsi che il [[guide:​junction_speed:​junction_deviation|Junction Deviation]] sia disabilitato. Ecco un esempio di configurazione dei suoi parametri:
 <​code>​ <​code>​
-//#define JUNCTION_DEVIATION ​// per abilitare il Jerk Limiting e disabilitare il Junction Deviation+//#define JUNCTION_DEVIATION
 #define DEFAULT_XJERK 10 #define DEFAULT_XJERK 10
 #define DEFAULT_YJERK 10 #define DEFAULT_YJERK 10
Linea 23: Linea 31:
 #define DEFAULT_EJERK {5,​5,​5,​5,​5,​5} #define DEFAULT_EJERK {5,​5,​5,​5,​5,​5}
 </​code>​ </​code>​
 +
 +<WRAP center round info 100%>
 +''​DEFAULT_?​JERK''​ **è un parametro salvato in EEPROM e può essere modificato anche senza ricompilare il firmware:** basta utilizzare il comando ''​M205 X<?> Y<?> Z<?>''​. Al termine delle modifiche, se si è soddisfatti del valore impostato è possibile salvarlo permanentemente tramite comando ''​M500''​ (richiede l'​attivazione del supporto alla EEPROM).
 +</​WRAP>​
 +
 +//Autore: [[iosonopersia@gmail.com|Simone Persiani]]//​