motores-paso-a-paso-en-silencio-con-arduino-y-los-driver-tmc2100-tmc2130-y-tmc2208

Motores paso a paso en silencio con Arduino y los driver TMC2100, TMC2130 y TMC2208

¿Qué es un TMC2100, TMC2130 o TMC2208?

Los drivers de la serie TMC2xxx son controladores de motores paso a paso ultra silenciosos fabricados por la empresa TRINAMICs.

Los TMC2xxx han sido diseñados para dispones de un esquema de patillaje compatible con los populares drivers A4988 y DRV8825. Por tanto, es posible la sustitución de unos por otro teniendo en cuenta las consideraciones que veremos en el resto de la entrada.

Los drivers TMC2xxx incorporan funciones para detectar cambios rápidos de carga en el motor. También detectan cuando el motor está parado para reducir la corriente y así reducir el consumo de energía y el calentamiento. Además, los drivers TCM2xxx incorporan funciones de seguridad y protección contra fallos, como protección contra sobretemperatura, con cortocircuitos, y bajo voltaje.

En general, los controladores TMC2xxx disponen de dos modos principales de funcionamiento:

  • El modo de alta potencia (spreadCycle) adecuado para velocidades altas o cargas grandes.
  • El modo silencioso (stealthChop) que reduce el ruido durante velocidades bajas.

La serie TMC2xxx está compuesta por un gran número de modelos de controladores, de entre los cuales son muy habituales los modelos TMC2100, TMC2130 y TMC2208. Físicamente son prácticamente indistinguibles, a no ser que leamos el modelo en la placa o las etiquetas de los pines.

arduino-tmc2100-tmc2130-tmc2208-modelos

El controlador TMC2100 es un controlador ultra silencioso que permite proporcionar controlar con hasta 1.2A (RMS) de corriente nominal y hasta 2.0A de pico. La configuración se realiza a través de pines, y su uso es similar a los A4988 y DRV8825.

El controlador TMC2130 es una versión más evolucionada que puede configurarse y controlarse por SPI. Además, incorpora funciones avanzadas como la detección medir la fuerza que realiza el motor lo que, entre otras cosas, permite evitar la necesidad de interruptores fin de carrera.

El controlador TMC2208 se controla y configura por UART e incorpora un modo silencioso mejorado (stealthChop2) que funciona mejor en aceleraciones mayores. Además, la resistencia es menor, lo que se traduce en una menor disipación de calor. Es un driver especialmente pensado para impresoras 3D, aunque prescinde de algunas funciones avanzadas al TMC2130.

Los controladores Trinamic TMC2xxx son drivers de alta tecnología, que podemos incluir en cualquier proyecto que maneje motores paso a paso. Uno de los usos destacados es actualizar los drivers de las impresoras 3D, una mejora muy recomendable que las convierte en casi totalmente silenciosas (salvo por los ventiladores).

Precio

Los drivers Trinamic son algo más caros que los habituales controladores A4988 y DRV8825, a cambio de darnos unas prestaciones muy superiores.

arduino-tmc2100-tmc2130-tmc2208-componente

Podemos encontrar el TMC2100 por unos 5.75, o en lotes de 5 por unos 28€ (5.6€ / unidad). Por su parte el TMC2130 es algo más caro, unos 7.30€ unidad, o 5 por unos 33€ (5.66€ / unidad). Por último, el TMC2208 cuesta unos 5.4€, o 5 por unos 20.50€ (4.08€ / unidad).

Por último, comentaros que al comprar uno de estos drivers normalmente nos enviarán un destornillador con la punta de plástico. Es para girar el potenciómetro de la placa de forma segura. No empleéis este destornillador para otro propósito, o lo dañaréis con facilidad.

¿Cómo funcionan los TMC2xxx?

Los drivers Trinamics TCM2xxx son mucho más que controladores, en realidad son dispositivos muy avanzados con capacidad de cálculo propia, y un gran número de componentes, opciones y configuraciones posibles.

arduino-tmc2100-tmc2130-tmc2208-funcionamiento

El comportamiento silencioso, una de las características más destacables de los TMC2xxx, se consigue mediante un algoritmo de chopper de alta precisión que consigue un funcionamiento inaudible tanto durante el movimiento como en las paradas.

Resulta imposible analizar en detalle todos los detalles de estos controladores, que además presentan diferencias entre ellos. En lo que resta de apartado nos limitaremos a ver los más destacables.

Diferencias entre modelos TMC2xxx

Comenzamos con una tabla que resumen las principales características y diferencias entre el TMC2100, TMC2130 y TMC2208.

NombreTMC2100TMC2130TMC2208
Interface (Step/Dir)PinsPins o SPIPins o UART
ConfiguracionPinsPins o SPIPins o UART
MicroSteps nativos1…161…2561…256
MicroSteps interp1…2561…2561…256
Phase Current, RMS1.2A1.2A1.2A
Phase Current, Pico2.5A2.5A2A
Tensión motor (Vm)4,75…46V5.5…46V5.5…36V
Vm necesario siempreNoSiSi
Regulador internoNoSiSi
Voltaje lógico5V3-5V3-5V
RDSon> 0.5 Ohm> 0.5 Ohm< 0.3 Ohm
StealthChop™v1v1v2
SpreadCycle™XXX
MicroPlyer™XXX
StallGuard™v1v2v2
short detectionX
CoolStep™X
passive brakingX

Funciones de los TMC2xxx

Aquí tenéis la explicación de algunos de los términos que figuran en la tabla anterior y que son necesarios para entender el funcionamiento y configuración de los TMC2xxx.

  • stealthChop™, modo de funcionamiento silencioso de alta precisión.
  • stealthChop2™, evolución del anterior que mejora el funcionamiento a altas velocidades y con el motor parado, y mejora el par.
  • spreadCycle™, modo de funcionamiento de alta potencia (no tan silencioso).
  • stallGuard, reduce la corriente cuando el motor está parado, reduciendo el consumo y el calentamiento.
  • stallGuard2™, versión mejorada del anterior, que permite detectar cuando el motor realiza un esfuerzo. Permite eliminar los fin de carrera.
  • microPlyer™, interpolador de micropasos a 256 que mejora la suavidad de los micropasos normales.
  • coolStep™, control de corriente adaptativo que reduce el consumo de energía.
  • dcStep, control de velocidad dependiente de la carga. El motor se mueve a la mayor velocidad posible sin perder pasos.
  • Modo híbrido, o es un modo de funcionamiento del TMC2xxx, si no del microprocesador que lo controla. Consiste en usar stealthChop para los movimientos lentos/medios, y cambiar a spreadCycle en movimientos rápidos.

Modos de uso de los TMC2xxx

Los TMC2xxx tienen tres modos de uso y configuración. Es fundamental entender las diferencias para poder usarlas en nuestros proyectos.

Modo 1 (Legacy):

El modo “herencia” es el modo más sencillo de uso. Básicamente se prescinde de la comunicación entre microprocesador y driver, lo que permite usarlo como sustituto directo de los A4988 y DRV8825.

Dado que el TMC2100 no tiene comunicación, es el único modo que tiene disponible. Sin embargo, tanto en el TMC2130 (SPI) como el TMC2208 (UART) pueden configurarse como Legacy con unos pequeños puntos soldados ubicados en la placa.

Modo 2 (OTP):

Otra opción es configurar los drivers (TMC2130 y TMC2208) mediante un conversor serial TTL y sobrescribir la configuración que deseamos en unos registros de configuración en una memoria OTP (one time programmable).

El punto negativo es que únicamente puede hacerse una vez (mejor dicho, los bits solo pueden cambiarse a 1, no pueden volver a ponerse a 0) por lo que el driver quedará permanentemente configurado.

Por tanto, no es una opción que resulte interesante ya que elimina la ventaja de la comunicación con el microprocesador. Únicamente tiene sentido en aplicaciones realmente stand-alone, donde queramos dejar fija la configuración.

Modo 3 (SPI o UART):

La mejor opción es emplear la comunicación disponible, SPI en el caso del TMC2130 (SPI) y UART en el TMC2208, para configurar y controlar el driver dinámicamente desde un microprocesador. Esto nos permite obtener el estado y detalles de configuración de los drivers y cambiar su configuración “al vuelo”.

La desventaja es que, lógicamente, tendemos que disponer obligatoriamente de un microprocesador y añadir el cableado necesario para la comunicación con el driver (en el caso del TMC2130 SPI pueden ser hasta 5 cables). Además, si estamos sustituyendo drivers A4988 o DRV82825 en un montaje existente (por ejemplo, tu impresora con RAMPS) puede ser un problema disponer de las conexiones necesarias.

Conexión y montaje de los TMC2xxx

Los módulos con TMC2xxx se montan con el chip boca abajo. Los chips tienen un thermal pad soldado a la PCB, de forma que la resistencia térmica es mejor que colocar el disipador directamente sobre el chip. En general, necesitaremos en todo caso un disipador y, en función de la intensidad que manejemos un ventilador (que, en cualquier caso, es muy recomendable).

Cuando sustituyamos drivers A4988 y DRV8825 revisar que la orientación del TMC2xxx es correcta. La posición del potenciómetro en algunas placas puede estar en otra posición y llevarnos a error. Fijaros únicamente en las etiquetas de los pines y no os fiéis de cualquier otra referencia.

No obstante, si vamos a montar los TMC2xxx en un montaje existente, es posible que las conexiones en los pines del TMC2xxx interfieran (por ejemplo, al montarlo en una placa como la RAMPS). Por eso, es frecuente tener que montar algunos de los terminales “hacia arriba”.

Sin-t%C3%ADtulo-1

Máxima corriente en los TMC2xxx

De forma similar a los drivers A4988 y DRV8825, los TCM2xxx disponen de un potenciómetro que permite ajustar la potencia máxima entregada al motor. Para ajustar la corriente máxima mediremos la tensión entre el pin Vref y GND (0 a 2.5V) y ajustaremos el potenciómetro.

arduino-tmc2100-tmc2130-tmc2208-potenciometro

También al igual que los A4988 y DRV8825, la intensidad entregada al motor puede ser calculada como una expresión entre la tensión de referencia (Vref) y GND, que incluye la resistencia RSense que figura en la placa.

La RSense en muchas placas es de 0.11, en cuyo caso la expresión anterior queda reducida a, simplemente:

No obstante, en algunos modelos la RSense de 0.22 o 0.1. Por tanto, verificar el valor de vuestra resistencia RSense antes de realizar el cálculo.

Por otro lado, en al hablar sobre los driver TCM2xxx normalmente se hace referencia a corriente RMS, en lugar de tensión de pico como ocurre en los A4988 y DRV8825. En caso de hablar de Irms, la expresión quedaría:

Recordar, que la Ipico = IRmx * 1.414 o, equivalentemente, IRms = IPico * 0.707.

Aquí tenéis una tabla con algunas de las relaciones para que el cálculo sea más sencillo:

VrefIrmsIpico
1,40,9911,4
1,30,9201,3
1,20,8501,2
1,10,7791,1
10,7081,0
0,90,6370,9
0,80,5660,8
0,70,4960,7
0,60,4250,6
0,70,4960,7

El máximo es de 1.25A rms, que equivalen a 1.77A pico. Para un motor NEMA 17 (como los empleados normalmente en impresoras 3D) el rango de intensidad nominal habitual está en el intervalo de 0.5A-0.8A RMS, lo que da se traduce en una tensión Vref de 0.7V a 1.1V.

Al regular la intensidad no conviene ajustar la intensidad máxima al máximo del motor. Comenzar empezar por valores bajos (0.5A, Vref=0.7V) y si vemos que pierde paso, aumentar la corriente en pasos de 0.1A hasta que funcione correctamente.

Los driver Trinamic incorporan protección contra sobre temperatura si el chip supera los 150ºC. No obstante, es conveniente disponer de una buena refrigeración (disipador) y para Vref por encima de 0.55V es necesario añadir ventilador.

Cómo apagar los TMC2xxx

Los sensores A4988 y DRV8825 ya eran muy sensibles, sobre todo a desconectar el motor cuando el driver tenía corriente. Los sensores Trinamic son aún más sensibles a las corrientes inducidas (EM) por el motor. Para evitar dañar los drivers o incluso el microprocesador, es indispensable tener una serie de consideraciones a la hora de apagar el montaje.

La primera norma es, de forma similar, no desconectar el motor mientras que el driver está alimentado. Otra regla de oro con los drivers TMC2xxx es no apagar el montaje mientras uno motor se está moviendo.

No obstante, puede realizarse una ‘parda de emergencia’ poniendo el pin EN en HIGH, lo que esencialmente desconecta la electrónica del driver del motor.

Apagado de drivers con alimentación variable 3-5V

Los drivers con alimentación lógica de entre 3-5V (TMC2130 y TMC2208) tienen consideraciones adicionales. Estos drivers incorporan un regulador de voltaje interno, que alimenta la lógica del driver desde la tensión aplicada al motor Vm.

La existencia de este regulador interno, además de suponer unas pérdidas de potencia adicionales que tienen que ser disipadas por el driver, condiciona la secuencia de encendido y apagado.

En los drivers con alimentación 3-5V la corriente Vm tiene que estar siempre presente, es decir, conectar Vm antes de encender la electrónica del driver, y desconectar Vm después de que la electrónica del driver. De lo contrario, la EM puede dañar el driver.

Por otro lado, no podemos mover “a mano” los motores rápidamente, o podremos dañar el driver (en cualquier caso, mover a mano el motor es algo que deberíais evitar siempre).

Para evitar esta circunstancia podemos añadir una base de protección a los TMC2130 y TMC2208, que incorpora diodos Schottky de flyback que protegen al driver de las EM.

arduino-tmc2100-tmc2130-tmc2208-protector

Si usáis drivers TMC2130 o TMC2208 en una impresora 3D, y conectáis el USB, aseguraros de tener la impresora encendida o dañaréis los drivers.

Esquema de montaje

TMC2100

El driver TMC2100 no dispone de comunicación SPI o UART, de forma que el único modo disponible es al Legacy. Por tanto, la conexión es similar a la de un A4988 o DRV8825.

La configuración del TMC2100 se realiza mediante la conexión de los pines de configuración correspondientes. Los pines pueden conectarse a cualquiera de los 3 estados, LOW (GND), HIGH (VIO) o Open (sin conectar)

| CFG1 | CFG2 | Pasos | Interpolacion | Modo | --- | | GND | GND | 1 (full step) | none | spreadCycle | | VCC | GND | 2 (half-step) | none | spreadCycle | | open | GND | 2 (half-step) | 256 µ-Schritte | spreadCycle | | GND | VCC | 4 (quarter-step) | none | spreadCycle | | VCC | VCC | 16 µ-steps | none | spreadCycle | | open | VCC | 4 (quarter-step) | 256 µ-steps | spreadCycle | | GND | open | 16 µ-steps | 256 µ-steps | spreadCycle | | VCC | open | 4 (quarter-step) | 256 µ-steps | stealthChop | | open | open | 16 µ-steps | 256 µ-steps | stealthChop |

Alternativamente, también podemos soldar unos pequeños jumpers ubicados en la placa.

arduino-tmc2100-tmc2130-tmc2208-config

Por tanto, la conexión del TMC2100 sería la siguiente:

arduino-tmc2100-esquema

Mientras que la conexión, vista desde el procesador, quedaría.

arduino-tmc2100-conexion

TMC2130

Por defecto, el TMC2130 viene configurado para ser usado en modo Legacy, sirviendo como reemplazo casi directo para los drivers A4988 y DRV8825. Por tanto, el esquema y conexión serían similar al TMC2100,y la configuración se realizará mediante los pines de configuración.

Sin embargo, si queremos activar el máximo partido del TMC2130 querremos activar la comunicación SPI para el control y configuración del driver. Para ello deberemos soldar los jumpers del TMC2130 como muestra la siguiente imagen.

FYSETC_tmc2130

Con la comunicación SPI activada deberemos conectar los pines del bus SPI, por lo que conexión del TMC2130 sería la siguiente:

MicroprocesadorDriver
SCKSCK
MOSISDI
MISOSDO
CSCS

arduino-tmc2130esquema

Mientras que la conexión, vista desde el procesador, quedaría.

arduino-tmc2130-conexion

TMC2208

Por defecto, el TMC2208 viene configurado para ser usado en modo Legacy, sirviendo como reemplazo casi directo para los drivers A4988 y DRV8825. Por tanto, el esquema y conexión serían similar al TMC2100, y la configuración se realizará mediante los pines de configuración.

Sin embargo, si queremos activar el máximo partido del TMC2208 querremos activar la comunicación UART para el control y configuración del driver. Para ello deberemos soldar un jumper de la TMC2208 como muestra la siguiente imagen.

2018-10-02-21_18_28-15139513442142

MicroprocesadorDriver
RXPD_UART
TX (1kohm)PD_UART

Con la comunicación UART activada deberemos conectar los pines correspondientes. El TMC2208 usa un protocolo de UART especial que permite emplear un único pin (PDN) para transmitir y recibir. Para que funcione, deberemos interponer una resistencia de 1kOhm entre el pin TX y el pin PDN. Por tanto, la que conexión del TMC2208 sería la siguiente:

arduino-tmc2208-esquema

Mientras que la conexión, vista desde el procesador, quedaría.

arduino-tmc2208-conexion

Ejemplos de código

El código es independiente del driver, y el mismo que vimos en la entrada del A4988 y DRV8825. Por tanto, usaremos como base el mismo código, que copiamos a continuación. No obstante, también veremos casos comunes para cada uno de los drivers TMC2100, TMC2130 y TMC2208.

Hay que destacar que en los drivers TCM2xxx el pin de dirección está invertido, es decir, se activa cuando pasa a estar en LOW. Por tanto, el sentido de giro será contrario a los que tendremos con un driver A4988 o DRV8825.

const int dirPin = 8;
const int stepPin = 9;

const int steps = 200;
int stepDelay;

void setup() {
  // Marcar los pines como salida
  pinMode(dirPin, OUTPUT);
  pinMode(stepPin, OUTPUT);
}

void loop() {
  //Activar una direccion y fijar la velocidad con stepDelay
  digitalWrite(dirPin, HIGH);
  stepDelay = 250;
  // Giramos 200 pulsos para hacer una vuelta completa
  for (int x = 0; x < 200; x++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(stepDelay);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(stepDelay);
  }
  delay(1000);

  //Cambiamos la direccion y aumentamos la velocidad
  digitalWrite(dirPin, LOW);
  stepDelay = 150;
  // Giramos 400 pulsos para hacer dos vueltas completas
  for (int x = 0; x < 400; x++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(stepDelay);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(stepDelay);
  }
  delay(1000);
}

TMC2100

El TMC2100 únicamente tiene modo Legacy, por lo que el código es el hemos visto en el caso anterior.

TMC2130

El TMC2130 tiene modo Legacy, para el cual usaremos el ejemplo anterior. Pero si queremos sacar el máximo partido usaremos la comunicación SPI para controlar y configurar el TMC2130. Para ello usaremos la librería disponible en https://github.com/teemuatlut/TMC2130Stepper.

La librería incorpora ejemplos y una extensa documentación sobre su uso. No obstante, aquí tenéis el código de ejemplo de esta entrada adaptado para mostrar el uso del TMC2130 por SPI.

const int enPin = 16;
const int dirPin = 19;
const int stepPin = 18;
const int csPin = 17;

const int steps = 200;
int stepDelay;

#include <TMC2130Stepper.h>
TMC2130Stepper TMC2130 = TMC2130Stepper(enPin, dirPin, stepPin, csPin);

void setup() {
  Serial.begin(9600);

  pinMode(stepPin, OUTPUT);
  
  TMC2130.begin(); // Inicializar TMC2130
  TMC2130.SilentStepStick2130(600); // Fijar corriente a 600mA
  TMC2130.stealthChop(1); // Activar modo silencioso
}

void loop() {
  //Activar una direccion y fijar la velocidad con stepDelay
  driver.shaft(true);
  stepDelay = 250;
  // Giramos 200 pulsos para hacer una vuelta completa
  for (int x = 0; x < steps; x++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(stepDelay);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(stepDelay);
  }
  delay(1000);

  driver.shaft(false);
  stepDelay = 150;
  // Giramos 400 pulsos para hacer dos vueltas completas
  for (int x = 0; x < steps * 2; x++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(stepDelay);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(stepDelay);
  }
  delay(1000);
}

TMC2208

El TMC2208 tiene modo Legacy, para el cual usaremos el ejemplo anterior. Pero si queremos sacar el máximo partido usaremos la comunicación UART para controlar y configurar el TCM2208. Para ello usaremos la librería disponible en https://github.com/teemuatlut/TMC2208Stepper.

La librería incorpora ejemplos y una extensa documentación sobre su uso. No obstante, aquí tenéis el código de ejemplo de esta entrada adaptado para mostrar el uso del TMC2208 por UART.

const int stepPin = 9;

const int steps = 200;
int stepDelay;

#include <TMC2208Stepper.h>
TMC2208Stepper driver = TMC2208Stepper(&Serial);

void setup() {
  Serial.begin(9600);
  while(!Serial);

  pinMode(dirPin, OUTPUT);
  pinMode(stepPin, OUTPUT);
  
  driver.pdn_disable(1);  // Use PDN/UART pin for communication
  driver.I_scale_analog(0);
  driver.rms_current(500); // Fijar corriente a 500mA
  driver.toff(0x2); // Encender friver
}

void loop() {
  //Activar una direccion y fijar la velocidad con stepDelay
  driver.shaft(true);
  stepDelay = 250;
  // Giramos 200 pulsos para hacer una vuelta completa
  for (int x = 0; x < steps; x++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(stepDelay);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(stepDelay);
  }
  delay(1000);

  driver.shaft(false);
  stepDelay = 150;
  // Giramos 400 pulsos para hacer dos vueltas completas
  for (int x = 0; x < steps * 2; x++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(stepDelay);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(stepDelay);
  }
  delay(1000);
}

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github. github-full