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.
| Estado | Fase A | Fase 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_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:
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:
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:
| Señal | Función | Qué comprobar |
|---|---|---|
| STEP | El flanco ascendente avanza la secuencia | Ancho alto y bajo mínimos |
| DIR | Selecciona sentido de la secuencia | Estabilidad antes y después de STEP |
| ENABLE | LOW habilita las salidas | Estado al arrancar y pérdida de retención al deshabilitar |
| RESET / SLEEP | Reinicio de secuencia y reposo | Niveles definidos y tiempo de despertar |
| MS1, MS2, MS3 | Seleccionan el modo de paso | Que 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
Ajustá objetivo y modo.
| M | Ángulo / pulso | Pulsos objetivo | Pulsos/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
- Con los valores iniciales hay 1600 pulsos/vuelta, 400 pulsos para 90°, 1600 pulsos/s y una duración nominal de 0,25 s.
- 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.
- Restablecé y pedí 1°: se redondea a 4 pulsos y 0,9° representados. No es una prueba de exactitud física.
- 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.
La simulación comienza referenciada. El controlador no observa directamente la posición real.
| Acción | Estimada | Real | Error |
|---|---|---|---|
| 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
- Identificá bobinas, corriente de fase, ángulo de paso y driver compatible.
- Verificá alimentación, sensado y ajuste de corriente según la placa concreta.
- Comprobá niveles definidos de STEP, DIR, ENABLE, RESET y SLEEP.
- Probá pocos pulsos a baja tasa y verificá sentido y relación de movimiento.
- Validá carga, velocidad y aceleración progresivamente, midiendo temperatura y errores.
- 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.