Links

Ajustes avanzados TMC (VFA)

Klipper pone a nuestra disposición diferentes funciones para optimizar movimientos y extrusión de la máquina como puede ser Pressure Advance, Input Shaper, y otros...
En este caso vamos a atacar la configuración avanzada de nuestros drivers TMC para mejorar la calidad de sus ajustes junto con nuestros motores. En concreto, vamos a intentar eliminar o disminuir los artefactos verticales (VFA - Vertical Fine Artifacts) que suelen aparecer en nuestras impresiones.
Ejemplo de VFA a diferentes velocidades
Resultados una vez realizado el ajuste fino de nuestros TMC para nuestros motores
Klipper, en las secciones driver_xxx, dispone de ajustes avanzados para TMC que normalmente no son usados o nos los facilitan algunos fabricantes. Básicamente, estos ajustes que vamos a emplear nos permitirán alterar la forma de onda generada por nuestros drivers para la gestión de nuestros motores.
En esta guía vamos a intentar explicar como encontrar esos valores para vuestra máquina.
IMPORTANTE!!!
  • Nuestra configuración de drivers deberá de estar en SpreadCycle (modo torque/potencia).. en cualquier caso este ajuste avanzado mejora el uso de la corriente en los motores lo que permite reducir significativamente el ruído que generan
  • Estas configuraciones avanzadas NO suelen llevarse bien con StealChop (modo silencioso)
  • Estos ajustes son exclusivos para la combinación de drivers/motores para los cuales se calcule
Queremos dejar claro que el proceso de ajuste correcto para estos parámetros sería realizando una batería de tests usando un osciloscopio tal y como podéis encontrar en el siguiente PDF con el proceso. En nuestro caso y dado que no todos tenemos un osciloscopio en casa vamos a ajustar esos parámetros mediante unos cálculos en base a nuestros drivers y motores.
Para realizar el proceso descrito en esta guía vamos a necesitar dos cosas:
  • Encontrar el datasheet de nuestro motor
IMPORTANTE!!!
un fallo bastante común, sobretodo en máquinas modificadas o DIY, es que el cableado de nuestros drivers->motores no estén del todo correctos.
Algo que normalmente hacemos mal es, al intentar cambiar el giro de un motor cuando este no lo hace correctamente y por pereza de cambiar nuestro firmware, es invertir cables y lo ideal siempre es ajustar el firmware dejando nuestro cableado siguiendo las especificaciones de los fabricantes... en este caso de electrónica de control de vuestra impresora y el de los motores.
Las electrónicas en sus esquemas de pines cuentan con el orden tanto de bobinas como de polaridad inicial:
Como puedes observar en la captura anterior para esta electrónica, una SKR Octopus, tienen definidos los pines como A1 A2 B2 B1 donde:
  • A/B hacen referencia a la bobina en cada caso
  • 1/2 hacen referencia al polo de polaridad de la bobina
Ahora si nos fijamos en el esquema de un motor estándar de impresora 3D veremos que en su datasheet nos facilitan la información necesaria para identificar nuestras bobinas y polaridad inicial de pines:
En el caso anterior lo ideal es realizar el cableado de la siguiente forma:
  • A1 (Octopus) -> Bobina A/Polaridad inicial 1/+ -> pin 1 A+ BLK (negro) (motor)
  • A2 (Octopus) -> Bobina A/Polaridad inicial 2/- -> pin 2 A- GRN (verde) (motor)
  • B2 (Octopus) -> Bobina B/Poladirad inicial 2/- -> pin 4 B- BLU (azul) (motor)
  • B1 (Octopus) -> Bobina B/Polaridad inicial 1/+ -> pin 3 B+ RED (rojo) (motor)
Porqué es importante hacer esto?
Si bien tener cruzadas las polaridades iniciales o el orden de las bobinas puede hacer que nuestra impresora esté funcionando correctamente el no disponer de un orden correcto en estas puede provocar pérdida de precisión y pasos, además, que en velocidades medias/altas nuestros motores pueden generar más ruído y vibraciones que de no estar correctamente.
El primer paso será revisar en nuestro printer.cfg, o si tenemos una configuración modular en el include que los contenga, las secciones que hacen referencia a nuestros drivers y motores:
  • [stepper_x] donde encontramos la configuración del motor, en especial el valor de micropasos que se usarán
  • [tmc2209 stepper_x] donde veremos la configuración TMC para un eje/motor en concreto
Tal como indica la propia documentación de Klipper algunos de las propiedades de estas secciones es aconsejables eliminarlas en cualquier caso:
  • interpolate: True, aunque es una función interesante que el propio driver permita seleccionar dinámica mente el valor de micropasos dependiendo de las necesidades en la práctica esto puede repercutir en pérdida de precisión de ahí que sea aconsejable cambiarlo a interpolate: False
  • hold_current, otra función que se aconseja deshabilitar/borrar es la de definir un valor de corriente cuando los motores están en modo descanso. Estos cambios de corrientes pueden provocar imprecisiones en su posicionamiento en determinados casos
Si tenías actualmente en tu configuración habilitada la opción de interpolate, el driver dinámicamente según las necesidades ajustaba los micropasos desde el valor establecido hasta 256, para realizar el ajuste fino usaremos un valor de micropasos medio en este caso de 64.
Cambiando esta configuración tal cual explicada directamente veremos que la máquina es sensiblemente más ruidosa que usando interpolate... el procedimiento de ajuste nos va a permitir solventar esto aprovechando el modo SpreadCycle con sus mejoras, torque/velocidad, y con un nivel de ruído similar al no tenerlo.
El uso de Stealthchop en los motores Z suele ser aconsejable dado que reduciremos el ruido y al no ser un eje de movimientos particularmente rápido no tendremos problemas. Así que es aconsejable que nuestros motores usados en el eje Z operen en modo Stealthchop.
Podemos hacer que siempre funcionen en este modo ajustando la propiedad de la siguiente forma stealthchop_threshold: 999 en la sección TMC de nuestro eje Z.
Además y para este eje Z no realizaremos los ajustes/optimizaciones que sugeriremos mas adelante.
El motor de extrusión va a ser un caso especial, el cual se tratará de una forma específica más adelante dado que disponer de más micropasos no funcionan especialmente bien por lo que se recomienda dejarlos en 16 micropasos al igual que no tener activo el modo Stealthchop con stealthchop_threshold: 0.
Dependiendo del tipo de máquina, motores, etc... podemos obtener mejores o peores resultados dependiendo de los micropasos. Es aconsejable comenzar en 64 y comparar resultados usando 32 y 16.
Las propiedades de nuestra sección TMC que nos vamos a centrar serán las siguientes:
  • driver_TBL: Blanking Time
  • driver_TOFF: Time to Slow Decay
  • driver_HSTRT: Hysteresis start
  • driver_HEND: Hysteresis end
Básicamente lo que haremos ajustando estos valores será ajustar los tiempos y configuraciones de histéresis de las señales de nuestros drivers.
Si queréis información más detallada de estas opciones os aconsejamos leeros la sección SpreadCycle Settings de, por ejemplo, el datasheet de los TMC2209
Como siguiente paso vamos a centrarnos en los cálculos de la hoja de excel comentadas en puntos anteriores, en concreto en la segunda hoja donde encontraremos Chopper Parameters donde ajustaremos los valores de las celdas en color amarillo:
  • fCLK, normalmente 12Mhz que suele ser el valor por defecto para unos TMC2209 (no hace referencia al reloj de nuestra electrónica!!!)
  • VM[V], indicaremos el voltaje de nuestra fuente o en su defecto al que alimentemos nuestra electrónica o motores si estos disponen de una fuente dedicada a otro voltaje diferente
  • TBL, normalmente lo dejaremos en 1 ya que es un valor que suele ir bien en todos los motores
  • L[H], la inductancia de nuestro motor que encontraremos en su datasheet en mH normalmente. Por ejemplo si nuestro datasheet nos indica 1.6mH pondremos 0.0016 como valor en la celda de a hoja
  • Rcoil[Ohm], este valor también lo obtendremos del datasheet de nuestro motor aunque también lo podremos obtener midiendo con un multímetro las bobinas de nuestro motor
  • Icoil(peak)[A], la corriente de pico de nuestros motores y que debería indicar nuestro datasheet, este valor no es el mismo que usamos en current en nuestro cfg de Klipper
  • toff, es un valor reactivo, lo dejaremos a 3 inicialmente
  • CS, este valor lo ajusta el driver basado en la corriente (y su resistencia) y lo usaremos para simular más adelante
Ejemplo TMC5160
En el caso que pongamos valores que esten en límites la hoja de cálculo nos mostrará avisos.
Una vez ajustado todo los valores que nos van a interesar son los que aparecen en la sección de color azul Register values for CHOPCONF register bits, no las dos celdas bajo Desired value.
Lo siguiente será ajustar manualmente los valores de CS hasta que RSENSE using VSENSE=1 al final de la hoja sea igual a nuestro sense resistor, normalmente 0.110 Ohms en motores de impresora 3D. Nos interesa mantener el valor CS bastante alto para que nuestros micropasos funcionen correctamente, la propia hoja de cálculo nos avisará si usamos un valor demasiado bajo.
Cuando encontremos nuestro valor CS óptimo:
  • usaremos los valores en la sección azul antes comentada y los ajustaremos en nuestra configuración de Klipper en driver_HSTRT y driver_HEND
  • también ajustaremos driver_TBL y driver_TOFF con los valores indicados en la parte de arriba de nuestra hoja... normalmente 1 y 3 respectivamente
  • ajustaremos nuestro valor run_current usando Icoil (RMS)[A]
EJEMPLO:
Vamos a usar como referencia un motor OMC 17HM19-2004S1 de 48mm y 0.9º donde encontramos en su datasheet 1.45 ohm como resistance y 4 mH como inductancia además de usar 1 A como corriente RMS.
Dejaremos TBL a 1 y TOFF a 3. Ajustando CS para obtener un valor de 0.110 en VSENSE=1 que obtubimos con un CS de 31 y una corriente ICoil(Peak)[A] a 1.38A.
Usaremos el valor de Icoil (RMS)[A], de 0.976 A como el valor de run_current.
Por último los valores de la sección azul CHOPCONF register bits que deberían ser 0 para HSTRT y 3 para HEND.
[tmc2209 stepper_x]
uart_pin: PE7
interpolate: False
stealthchop_threshold: 0
sense_resistor: 0.110
run_current: 0.976
driver_TBL: 1
driver_TOFF: 3
driver_HSTRT: 0
driver_HEND: 3
Una vez realizado los cálculos para el eje Y, recordemos que tal como os comentamos para el eje Z no haremos estos cálculos, vamos a realizar el. proceso en nuestro extrusor.
Vamos a realizar en este caso el proceso directamente con un ejemplo usando el popular LDO 36mm NEMA14. Este motor usa una resistencia de 10 Ohms y una inductancia de 6mH.
Sabemos que este motor necesita alrededor de 300mA de corriente (run_current: 0.3) algo que tendremos como referencia para el valor CS.
Tal como hicimos antes y ajustando los valores anteriores en este caso intentaremos ajustar el valor CS bastante bajo, será la propia hoja que nos avisará que los valores por debajo de 16 no son aconsejables y por eso no aconsejábamos usar en el extrusor muchos micropasos.
Generalmente nos interesa mantener la frecuencia (chopper) sobre 40Khz ya que normalmente funcionará al 50% de esta frecuencia teniendo en cuenta que 20Khz es el limite del oído humano.
Además os aconsejamos realizar pruebas con los valores TBL y TOFF para ver como varia el resultado en nuestra máquina.
En nuestro caso quedaría nuestra configuración de la siguiente forma:
run_current: 0.336 # results in CS 10
driver_TBL: 1
driver_TOFF: 3 # 41.7Khz max chopper frequency
driver_HSTRT: 0
driver_HEND: 3
Tal como decíamos anteriormente el valor run_current para este motor es alrededor de 0.3 A.
En nuestro ejemplo hemos usado el valor CS = 10, dado que nos dará un valor de RSENSE=1 de 0.11, y un peak current de 0.475A dejando 0.336 RMS que es el valor que usaremos en nuestra configuración run_current.
Porqué no usamos CS 9 o 11?
  • en el caso de CS 9 obtenemos un pico de 0.434A y 0.307 RMS que es lo más aproximado... pero un valor bajo de CS
  • por otro lado un valor de CS 11 nos daría un valor de pico de 0.52A y 0.368A RMS lo cual es ya un poco alto para este motor
Os aconsejamos mucho tener vuestra propia base de datos o documentar estos cálculos de drivers/motores diferentes. El uso de configuración modular mediante includes puede ayudarnos.
Es importante añadir comentarios en nuestra configuración donde guardemos información de nuestro tipo, modelo y características del motor:
#LDO 48mm 1.8 42STH48-2004AC - 1.4Ohm 3mH
[tmc2209 stepper_z]
uart_pin: PD10
uart_address: 0
interpolate: False
run_current: 0.764
sense_resistor: 0.110
stealthchop_threshold: 0
driver_TBL: 1
driver_TOFF: 3
driver_HSTRT: 1
driver_HEND: 3
#LDO 48mm 1.8 42STH48-2004AC - 1.4Ohm 3mH
[tmc2209 stepper_z]
uart_pin: PD10
uart_address: 0
interpolate: False
run_current: 0.764
sense_resistor: 0.110
stealthchop_threshold: 0
driver_TBL: 1
driver_TOFF: 3
driver_HSTRT: 1
driver_HEND: 3
Os aconsejamos este vídeo donde podréis ver el proceso:
Créditos y agradecimientos a MakerBogans