← Índice del curso

Robótica y Automatización · Tema 14

Motores paso a paso

Un motor paso a paso convierte una secuencia de excitación en posiciones sucesivas. Vamos a calcular sus pulsos, entender qué aporta el microstepping y distinguir la posición ordenada de la posición que el eje realmente alcanzó.

01 · Punto de partida

Del PWM al movimiento por pasos

En el tema anterior usamos PWM para ajustar una orden de marcha de un motor DC. En un paso a paso, el driver organiza las corrientes de sus fases para desplazar una referencia magnética. El rotor intenta seguirla.

El controlador puede ordenar un número de incrementos y estimar posición sin encoder. Esa simplicidad tiene una condición: el motor debe poder seguir la secuencia bajo la carga y velocidad previstas. Contar órdenes no demuestra que se hayan cumplido.

Trabajaremos con un motor bipolar de dos fases, un driver con interfaz STEP/DIR y movimientos rotativos sencillos. Los valores son ejemplos, no la especificación de cualquier motor llamado «NEMA 17»: esa denominación describe un formato de montaje, no un torque universal.

02 · Cómo produce movimiento

Rotor, fases y secuencia

Las bobinas del estator generan un campo al circular corriente. El rotor tiende a alinearse con ese campo. Cambiando las corrientes de fase se desplaza la referencia de equilibrio y el eje puede avanzar a otra posición.

En un bipolar de dos fases, el driver debe poder invertir corriente en cada bobinado. Por eso contiene etapas equivalentes a dos puentes H, además de regulación y lógica de secuencia.

Secuencia conceptual de paso completo con dos fases excitadas; + y − indican sentido de corriente.
EstadoFase AFase B
1++
2−+
3−−
4+−

Recorrer los estados al revés cambia el sentido. Esta tabla es conceptual: un ciclo eléctrico no equivale necesariamente a una vuelta mecánica del rotor. La geometría del motor determina su cantidad de pasos por vuelta.

Para un motor de cuatro cables, identificá los pares de cada bobina con documentación o continuidad, sin alimentación. No deduzcas pares por el color. Motores unipolares de cinco cables y sus placas habituales no se conectan sin más como un bipolar de cuatro cables.

03 · Unidades de posición

Pasos, pulsos y posición

Si el ángulo de paso completo es 1,8°, el motor tiene 360 / 1,8 = 200 pasos completos por vuelta. Si el driver divide cada paso en M microsteps y hay una reducción G:

pulsos_por_vuelta_motor = pasos_completos · M
pulsos_por_vuelta_salida = pasos_completos · M · G
ángulo_nominal_por_pulso = 360° / pulsos_por_vuelta_salida

Con 200 pasos y M = 8, hay 1600 pulsos por vuelta de motor. Sin reducción, cada pulso representa 0,225° nominales. Para 90° necesitamos 90 × 1600 / 360 = 400 pulsos.

Si el objetivo no corresponde a un número entero de pulsos, hay que redondear y registrar el objetivo representable. Por ejemplo, 1° requiere 4,444… pulsos en ese modo; redondear a 4 ordena 0,9°.

04 · Posiciones intermedias

Qué cambia el microstepping

El microstepping ajusta las corrientes relativas de las fases para generar referencias intermedias entre pasos completos. Una aproximación conceptual usa componentes sinusoidales:

IA ≈ Imáxima · cos(φ)
IB ≈ Imáxima · sen(φ)

φ es un ángulo eléctrico de la secuencia, no directamente el ángulo mecánico del eje. El driver regula esas corrientes y avanza su referencia con cada pulso STEP.

Puede mejorar suavidad, vibración y resolución nominal de la orden. Pero dividir un paso en dieciséis no garantiza dieciséis posiciones físicas igualmente exactas bajo cualquier carga. Fricción, tolerancias y error de corriente afectan los incrementos reales.

Analog Devices distingue resolución, exactitud y torque incremental al explicar microstepping. El esfuerzo restaurador de un incremento muy pequeño puede no vencer la fricción: el eje puede responder después de varias órdenes acumuladas.

Eso tampoco significa que el torque total de retención se divida simplemente por M. El torque incremental y la capacidad global de retención son conceptos distintos. Evaluá la curva y el comportamiento del conjunto.

05 · Pulsos por segundo

Frecuencia de pasos y aceleración

La frecuencia STEP determina la velocidad nominal que ordenamos, si el rotor sigue los pulsos:

fSTEP = RPMsalida · pulsos_por_vuelta_salida / 60
TSTEP = 1 / fSTEP

Con 1600 pulsos por vuelta y 60 RPM, hacen falta 1600 pulsos/s. A 200 pulsos/s se ordenan 7,5 RPM. Duplicar M con la misma frecuencia reduce a la mitad la velocidad nominal.

El ancho alto del pulso STEP solo debe cumplir la temporización del driver; no es una orden de torque equivalente al ciclo de trabajo del motor DC. La regulación de las bobinas puede usar su propio PWM interno, independiente de la frecuencia STEP.

La carga tiene inercia. Arrancar de golpe con una frecuencia elevada puede hacer perder sincronismo aunque el motor pudiera sostener esa velocidad después de acelerar. Usá perfiles de aceleración y desaceleración adecuados.

El torque disponible durante giro depende de velocidad, corriente, tensión, driver y motor. El torque de retención en reposo no es una garantía de torque de marcha. Los perfiles de movimiento se desarrollan con más detalle en el bloque de control de movimiento.

06 · Alimentar bobinas

Driver y corriente por fase

Un driver de corriente aplica tensión y conmuta para intentar mantener la corriente de fase dentro del ajuste elegido. Esto permite usar una alimentación mayor que la tensión resistiva nominal de la bobina cuando el conjunto está diseñado y configurado para ello; no autoriza a conectar esa tensión directamente a la bobina.

Revisá corriente por fase del motor, límites térmicos del módulo, tensión admitida y procedimiento de ajuste. La corriente que toma la fuente puede ser distinta de la de las bobinas: no uses una lectura de alimentación como sustituto automático de la corriente de fase.

El A4988 de Allegro ofrece regulación y modos desde paso completo hasta 1/16. Su relación de ajuste es Imax = Vref / (8 · Rsense). Hay que conocer la resistencia real de sensado del módulo.

Si un módulo concreto tiene Rsense = 0,068 Ω y se desea un límite de 1 A compatible con todo el conjunto, resulta Vref = 8 × 0,068 × 1 = 0,544 V. No copies ese valor en una placa con otras resistencias ni lo interpretes como una recomendación de 1 A para cualquier motor.

07 · Interfaz del controlador

STEP, DIR y habilitación

Con una interfaz STEP/DIR, el programa genera eventos de posición y el driver organiza las fases. Para el A4988:

Funciones básicas del ejemplo; los nombres y polaridades no son universales.
SeñalFunciónQué comprobar
STEPEl flanco ascendente avanza la secuenciaAncho alto y bajo mínimos
DIRSelecciona sentido de la secuenciaEstabilidad antes y después de STEP
ENABLELOW habilita las salidasEstado al arrancar y pérdida de retención al deshabilitar
RESET / SLEEPReinicio de secuencia y reposoNiveles definidos y tiempo de despertar
MS1, MS2, MS3Seleccionan el modo de pasoQue el cálculo de pulsos coincida con el modo físico

Para este integrado, los modos MS1/MS2/MS3 son 000 completo, 100 medio, 010 cuarto, 110 octavo y 111 dieciseisavo. No traslades la tabla a otro driver por tener un conector parecido.

La ficha indica pulsos STEP altos y bajos de al menos 1 µs. El ejemplo reservará 5 µs en alto y mucho más tiempo en bajo. También hay requisitos de preparación y mantenimiento de DIR: no lo cambies pegado al flanco ni durante una inversión mecánica sin planificar.

Mantené el modo de paso fijo durante la maniobra inicial. Cambiarlo requiere coordinar estado eléctrico y escala de posición. El programa no puede descubrir el modo de jumpers solo por conocer la variable M.

08 · Intención frente a resultado

Posición en lazo abierto

El programa acumula pulsos y estima posición. Si hubo 400 pulsos positivos en el ejemplo de 1600 por vuelta, calcula +90°. Esa cuenta representa movimiento nominal ordenado.

Un atasco, una aceleración excesiva, falta de corriente o resonancia pueden impedir que el rotor siga. La pérdida de sincronismo puede involucrar varios incrementos y dejar un error que no se corrige solo al seguir contando.

Si el sistema pierde 9° durante un avance de +90°, el programa puede indicar 90° mientras el eje está en 81°. Ordenar después −90° sin nuevos errores lleva la cuenta a cero, pero el eje queda en −9°.

Con encoder se puede observar discrepancia o construir un lazo cerrado, según el diseño. En lazo abierto, la confianza depende de haber validado carga, velocidad, aceleración y condiciones de alimentación.

09 · Código para la placa

Prueba con A4988 y Arduino

Usaremos UNO R3, motor bipolar de 200 pasos/vuelta y la placa A4988 de Pololu. Su documentación describe alimentación, ajuste de corriente y prevención de picos LC. Requiere alimentación de lógica y de motor separadas según sus rangos, con referencia común.

  • STEP a D2, DIR a D3 y ENABLE a D8; añadí referencias externas apropiadas para evitar entradas flotantes, por ejemplo pull-down de 10 kΩ en STEP/DIR y pull-up de 10 kΩ en ENABLE hacia VDD.
  • VDD a 5 V y masa común. RESET y SLEEP en HIGH de lógica. MS1 y MS2 a HIGH y MS3 a LOW para 1/8.
  • Cada bobina a su par de salidas del módulo. VMOT a una fuente compatible con driver y motor regulado, con desacoplo local según el fabricante.

Ajustá corriente según el módulo real. Pololu recomienda capacitancia electrolítica de al menos 47 µF cerca de VMOT/GND para mitigar picos, con tensión y polaridad adecuadas. No conectes ni desconectes el motor mientras el driver tenga alimentación.

Probá en una disposición horizontal, sin carga suspendida y con recorrido libre. C rearma; A o V emiten 400 pulsos a 200 pulsos/s, nominalmente 90° en un sentido u otro. S aborta. Al terminar o abortar, deshabilita las fases y exige rearme.

const byte STEP_PIN = 2, DIR_PIN = 3, EN_PIN = 8;
const unsigned long INTERVALO_US = 5000;
const unsigned int PULSOS_OBJETIVO = 400; // 200 pasos × 8 × 90/360
bool activo = false, inhibido = true, asentando = false;
unsigned int emitidos = 0;
unsigned long ultimoPulso = 0;
unsigned long inicioAsentamiento = 0;

void detener() {
  digitalWrite(STEP_PIN, LOW);
  digitalWrite(EN_PIN, HIGH);  // Sin retención activa.
  activo = false;
  asentando = false;
  inhibido = true;
}

void setup() {
  digitalWrite(EN_PIN, HIGH); pinMode(EN_PIN, OUTPUT);
  digitalWrite(STEP_PIN, LOW); pinMode(STEP_PIN, OUTPUT);
  digitalWrite(DIR_PIN, LOW); pinMode(DIR_PIN, OUTPUT);
  Serial.begin(115200);
  delay(2);  // RESET/SLEEP ya están HIGH; salidas deshabilitadas.
  Serial.println("C: rearmar; A/V: 400 pulsos; S: abortar");
}

void loop() {
  if (asentando && millis() - inicioAsentamiento >= 100) {
    detener();
    Serial.println("400 pulsos emitidos; posicion fisica no verificada");
  }
  if (Serial.available() > 0) {
    const char cmd = Serial.read();
    if (cmd == 'S') detener();
    else if (cmd == 'C' && !activo && !asentando) inhibido = false;
    else if ((cmd == 'A' || cmd == 'V') && !activo && !asentando && !inhibido) {
      digitalWrite(DIR_PIN, cmd == 'A' ? HIGH : LOW);
      digitalWrite(EN_PIN, LOW);
      emitidos = 0;
      ultimoPulso = micros();
      activo = true;
    }
  }
  const unsigned long ahora = micros();
  if (!activo || ahora - ultimoPulso < INTERVALO_US) return;
  ultimoPulso = ahora;
  digitalWrite(STEP_PIN, HIGH);
  delayMicroseconds(5);
  digitalWrite(STEP_PIN, LOW);
  emitidos++;
  if (emitidos == PULSOS_OBJETIVO) {
    activo = false;
    asentando = true;
    inicioAsentamiento = millis();
  }
}

El primer pulso espera unos 5 ms desde DIR y habilitación. Hay una espera breve de 5 µs para el ancho alto, pero no una espera bloqueante por toda la maniobra. Si el lazo tarda de más, la frecuencia baja: el código no compensa retrasos ni es un generador de pulsos de tiempo real.

Después del último pulso mantiene las fases habilitadas 100 ms como espera didáctica de asentamiento; ese tiempo no verifica posición ni garantiza que cualquier carga haya terminado de responder. La prueba salta directamente a una frecuencia fija baja y no implementa perfil de aceleración. Verificá que el conjunto pueda seguirla; no la aumentes sin planificar el arranque. Las órdenes serie no son una parada independiente y pueden quedar en buffer.

Al deshabilitar, el eje puede moverse y la posición debe considerarse no confirmada. Este ejemplo no sirve para sostener cargas ni para demostrar exactitud de 90°.

10 · Exploración interactiva

Laboratorios: plan nominal y movimiento desconocido

1. Traducir un objetivo a pulsos

Pulsos por vuelta de salida—
Pulsos enteros para el objetivo—
Frecuencia STEP requerida—
Ángulo nominal representado—
Duración nominal sin rampas—

Ajustá objetivo y modo.

Efecto de M para el mismo motor, reducción, ángulo y RPM.
MÁngulo / pulsoPulsos objetivoPulsos/s

La duración se calcula como pulsos redondeados divididos por frecuencia, suponiendo frecuencia constante. No incluye rampas, asentamiento ni errores físicos. El laboratorio compara la tasa con un presupuesto ficticio del controlador de 20000 pulsos/s; no es un límite del A4988 ni una medición del UNO.

Recorrido guiado de cálculo

  1. Con los valores iniciales hay 1600 pulsos/vuelta, 400 pulsos para 90°, 1600 pulsos/s y una duración nominal de 0,25 s.
  2. Cambiá M a 16: se duplican los pulsos y la frecuencia requerida, pero se conserva la duración nominal para el mismo ángulo y RPM.
  3. Restablecé y pedí 1°: se redondea a 4 pulsos y 0,9° representados. No es una prueba de exactitud física.
  4. Con 400 pasos, M = 16, G = 10 y 120 RPM, se requieren 128000 pulsos/s: supera el presupuesto ficticio.

2. El contador puede volver a cero sin que vuelva el eje

Modelo separado y fijo: 200 pasos, M = 8, sin reducción. Cada maniobra ordena 400 pulsos (90°). La pérdida seleccionada se aplica artificialmente a cada nueva maniobra para mostrar un error de seguimiento; no simula resonancia ni el mecanismo real de pérdida de sincronismo.

Posición estimada por órdenes0°
Posición física del modelo0°
Error: estimada − real0°

La simulación comienza referenciada. El controlador no observa directamente la posición real.

Últimas 10 acciones del modelo; la posición real se muestra para aprender, no está disponible por contar pulsos.
AcciónEstimadaRealError
Sin acciones.

Elegí pérdida del 10 % y ordená +90°: el contador indica 90° y el eje simulado 81°. Cambiá la pérdida a cero y ordená −90°: el contador vuelve a 0° y el eje queda en −9°. La referencia física simulada corrige ambos; reiniciar la simulación vuelve al caso inicial.

Mover el eje deshabilitado cambia solo su posición real. En el modelo, las maniobras posteriores vuelven a habilitarlo sin agregar otros efectos eléctricos. Una máquina real puede requerir otra referencia y tratamiento del estado de las fases.

11 · Código ejecutable

Planificar un movimiento en Python

Comparemos modos para un giro solicitado de 1° a 60 RPM, con 200 pasos por vuelta y sin reducción. El código muestra el redondeo y la tasa de eventos requerida; no pretende predecir el rotor.

Probalo en el navegador. Python se descarga con Pyodide la primera vez y requiere conexión. El código es editable y no controla hardware.

from math import floor

pasos_completos = 200
reduccion = 1
objetivo_grados = 1.0
rpm_salida = 60.0

for micro in (1, 2, 4, 8, 16):
    por_vuelta = pasos_completos * micro * reduccion
    pulsos_ideales = objetivo_grados * por_vuelta / 360
    pulsos = floor(pulsos_ideales + 0.5)  # Objetivos no negativos
    representado = pulsos * 360 / por_vuelta
    frecuencia = rpm_salida * por_vuelta / 60
    duracion = pulsos / frecuencia
    error = representado - objetivo_grados
    print(f"M={micro:2}; pulsos={pulsos:2}; "
          f"ángulo={representado:.4f}°; error={error:+.4f}°; "
          f"f={frecuencia:.0f} Hz; t={duracion:.5f} s")

En paso completo se redondea a 1 pulso y 1,8°. Con M = 8 se redondea a 4 pulsos y 0,9°. Con M = 16 resultan 9 pulsos y 1,0125°. Mejor representación nominal no significa automáticamente mejor exactitud física bajo carga.

Cambiá el objetivo a 90°: todos los modos representan ese ángulo exactamente en la aritmética del modelo, pero la frecuencia requerida aumenta con M para mantener las RPM.

12 · Método y diagnóstico

Pruebas y diagnóstico

  1. Identificá bobinas, corriente de fase, ángulo de paso y driver compatible.
  2. Verificá alimentación, sensado y ajuste de corriente según la placa concreta.
  3. Comprobá niveles definidos de STEP, DIR, ENABLE, RESET y SLEEP.
  4. Probá pocos pulsos a baja tasa y verificá sentido y relación de movimiento.
  5. Validá carga, velocidad y aceleración progresivamente, midiendo temperatura y errores.
  6. Ensayá origen, abortos y pérdida de alimentación con una disposición que no deje caer cargas.
«Vibra, pero no avanza»

Puede haber bobinas mal emparejadas, tasa de arranque excesiva, corriente insuficiente o un atasco. Revisá conexiones sin energía y separá pruebas eléctricas de mecánicas.

«El motor indica pocos voltios: no puedo usar un driver con otra alimentación»

La tensión resistiva de bobina y la alimentación de un driver regulador no son la misma especificación. La compatibilidad depende de regulación de corriente, aislamiento, rangos y configuración, no de conectar directamente una fuente mayor.

«Si mando 1600 pulsos, sé que dio una vuelta»

Solo si la escala coincide y el rotor siguió. Un contador de órdenes no detecta pérdida de sincronismo.

«1/16 da dieciséis veces más exactitud»

Divide el incremento nominal. La exactitud física depende de motor, corrientes, carga, fricción y transmisión.

«Cambiar el ancho de STEP cambia el torque»

Mientras cumple los tiempos de la interfaz, el pulso ordena un avance de secuencia. La corriente de fase la regula el driver; la tasa de pulsos determina la velocidad nominal.

«Deshabilitar conserva la posición»

Puede retirar el torque activo y permitir desplazamiento externo. El software necesita conservar o recuperar confianza mediante referencias apropiadas.

13 · Práctica guiada

Predecí antes de comprobar

1. Pasos por vuelta

Un motor tiene paso completo de 0,9°. ¿Cuántos pasos completos y cuántos pulsos en 1/8 necesita una vuelta de motor?

Ver solución

360 / 0,9 = 400 pasos. En 1/8: 400 × 8 = 3200 pulsos.

2. Movimiento con reducción

Con 200 pasos, M = 16 y G = 3, ¿cuántos pulsos representan 45° de salida?

Ver solución

200 × 16 × 3 = 9600 pulsos/vuelta de salida. Para 45°: 9600 × 45 / 360 = 1200 pulsos.

3. Frecuencia

Con 1600 pulsos por vuelta y 30 RPM, calculá frecuencia y período STEP.

Ver solución

f = 30 × 1600 / 60 = 800 Hz. Período: 1/800 = 1,25 ms. El ancho alto se elige cumpliendo el driver; no debe ocupar obligatoriamente medio período.

4. Vref

Para un A4988 con Rsense = 0,05 Ω y límite deseado de 0,8 A compatible con el conjunto, ¿qué Vref calcula la fórmula?

Ver solución

Vref = 8 × 0,8 × 0,05 = 0,32 V. Verificá que esa resistencia y relación correspondan al módulo real.

5. Regresar el contador

Ordenás +90° y el eje avanza solo 81°. Luego ordenás −90° y esa maniobra se cumple. ¿Dónde quedan cuenta y eje?

Ver solución

La cuenta nominal queda en cero y el eje en −9°. La segunda orden no recupera el error anterior por sí sola.

6. Mismo ritmo de pulsos

Un motor de 200 pasos recibe 1600 pulsos/s. Compará sus RPM nominales con M = 8 y M = 16.

Ver solución

Con M = 8 hay 1600 pulsos/vuelta: 60 RPM. Con M = 16 hay 3200 pulsos/vuelta: 30 RPM. Duplicar subdivisión sin duplicar frecuencia reduce la velocidad ordenada.

14 · Síntesis

Ideas para recordar

  • El driver organiza corrientes de fase para desplazar una referencia magnética.
  • Pasos completos, subdivisión y reducción determinan pulsos por vuelta del eje útil.
  • Microstepping mejora resolución nominal y puede suavizar movimiento; no garantiza exactitud proporcional.
  • La frecuencia STEP ordena velocidad; el ancho de pulso debe cumplir la interfaz.
  • La corriente por fase necesita ajuste y no se deduce directamente del consumo de la fuente.
  • Velocidad, aceleración y carga deben permitir al rotor seguir la secuencia.
  • En lazo abierto, contar órdenes no confirma posición física.
  • Referenciar y tratar la pérdida de retención son partes del diseño de posicionamiento.

¿Listo para el tema 15?

Antes de avanzar, calculá pulsos y frecuencia para una maniobra con reducción, explicá qué verificarías en el driver y describí cómo detectarías o recuperarías una posición que perdió confianza.

En el próximo tema estudiamos servomotores: señal de control, rango de giro, torque y alimentación.