Verilog Práctico

Capítulo 15. Motores Paso a Paso

27 de marzo de 2022

En este tutorial veremos algunos conceptos básicos para  controlar motores paso a paso con la Alhambra FPGA.


Resumiendo un poco, para controlar un motor paso a paso lo que vamos a hacer es aplicar pulsos en la entrada STEP de un driver y éste a su vez será el encargado de alimentar las bobinas del motor. Un nivel alto o bajo en el pin DIR hará que el eje gire en un sentido u otro. 


El driver que vamos a utilizar en este tutorial es el A4988, muy similar al DRV8825 ambos de uso muy extendido en el mundillo maker gracias a su amplio uso en impresoras 3D, CNC´s,...Para saber más sobre estos drivers para motores paso a paso, recomiendo leer esta entrada  del gran Luis LLamas.

El número de pulsos aplicados es la distancia que recorre el eje y la frecuencia con que aplicamos los pulsos, es directamente proporcional a la  velocidad de giro. Asimismo un nivel alto aplicado en la entrada DIR hace que el motor gire en sentido horario, mientras que una señal a nivel bajo hace que el eje se mueva en sentido antihorario.


Otras entradas son:


La entrada /RESET pone el driver en un estado inicial predefinido  y apaga las salidas. Todos los pulsos aplicados en la entrada STEP se ignoran hasta que la entrada /RESET se pone a nivel alto.


/ENABLE. Cuando se aplica valor lógico alto (3.3 - 5V) las salidas se desactivan. Cuando se aplica un 0 el control interno habilita las salidas.


/SLEEP. Modo de reposo. Para minimizar el consumo de energía cuando el motor no está en uso, esta entrada desactiva gran parte de la circuitería interna. Un nivel lógico bajo en el pin SLEEP pone al A4988 en modo de reposo.


MS1, MS2, MS3. Microstep Resolution, desde full step hasta 1/16 micropasos. Para full-step poner todos los pines a GND. 

Ejemplo 1


Empezamos con un montaje sencillo, para comprobar que todo funciona correctamente y luego iremos añadiendo funciones.


Montamos el circuito como se muestra en el siguiente esquema. Con una fuente de 12 voltios alimentamos el driver en el pin VMOT y la Alhambra en la entrada Vin.  Con los +5V del regulador de la Alhambra alimentamos el A4988 en el pin VDD.


Con un interruptor externo habilitamos el driver en el pin ENABLE. El sentido de giro lo controlamos con el switch 1 de la Alhambra.

La entrada STEP del A4988 la conectamos en la salida GP0. El resto de salidas de la Alhambra no son aptas para excitar la entrada STEP del driver, esto es porque no son salidas directas de la FPGA sino que están intercalados unos conversores de nivel bidireccionales de 3.3 a 5 voltios y la arquitectura de salida no es compatible con la entrada del driver. Será cuestión de hacer una pequeña interfaz con un optoacoplador, un buffer o line driver...Lo investigaré y lo pondré por aquí en la próxima actualización.

Por último, antes de poner en marcha el motor, hay que regular la corriente máxima con el potenciómetro. Mira el tutorial de Luis LLamas que hacía referencia un poco más arriba, apartado REGULACIÓN DE INTENSIDAD (CHOPPING). 

Código Verilog


Vamos a modelar un circuito generador de pulsos de 1 KHz de frecuencia y 10 microsegundos de ancho de pulso. Para ello vamos a hacer unos sencillos cálculos. El periodo de la señal es 1/1000 Hz = 1 ms. Si la Alhambra tiene un reloj de 12 MHz, 1 ms  son 12.000 ciclos de reloj. Basta con hacer una regla de tres:

De la misma manera para obtener un ancho de pulso de 10 us hay que restar 120 a 12.000

El código Verilog de este ejemplo y los dos siguientes está disponible para descargar al final de la página.

Archivo .pcf

El circuito que hemos implementado consta de  un contador y comparador. 

Mientras que el contador genera la frecuencia de 1 KHz, con la declaración assign step = (counter < 11880) ? 0:1; hacemos que la salida step sea 0 cuando es menor que 11880 y 1 cuando es mayor que 11880. Y así es como obtenemos los pulsos de 10 us de ancho y 1 KHz de frecuencia.

Subimos el código a la Alhambra y veremos cómo el motor gira a toda velocidad. Si pulsamos el switch 1 de la Alhambra, el motor cambia el sentido de giro.

Ejemplo 2. Motor de 2 velocidades


En este ejemplo vamos a modelar un circuito para controlar la velocidad y el sentido de giro del motor. Con el switch 1 seleccionamos el sentido de giro y con el switch 2 la velocidad. El esquema de conexión es el mismo que en el ejemplo 1.


Código Verilog


El código consiste en un generador de pulsos de dos frecuencias; 20 Hz y 1 KHz. Un multiplexor 2-1 cuya entrada de selección es el switch 2. La salida del multiplexor se conecta al pin STEP y dependiendo de la entrada de selección aplicaremos una u otra frecuencia de pulsos al driver. El switch 1 lo aplicamos directamente a la entrada DIR del A4988.


Utilizaremos un estilo de diseño jerárquico. Describiremos en dos módulos separados el generador de pulsos y el multiplexor, después instanciaremos ambos módulos mediante mapeo explícito de puertos.

A continuación el código de los distintos módulos.


Módulo Principal

Generador de pulsos de dos frecuencias.

Multiplexor 2-1.

Archivo .pcf

Lo subimos a la Alhambra y al pulsar el switch 1 vemos como cambia el sentido de giro del motor. Por defecto el eje gira en sentido horario, al pulsar el switch 1 cambiamos a sentido antihorario.

Para cambiar la velocidad actuamos sobre el pulsador 2 de la Alhambra. Por defecto el motor gira a velocidad lenta, si pulsamos el switch 2 seleccionamos velocidad rápida.

Ejemplo 3. Motor de 4 velocidades

Vamos a llevar el ejemplo anterior un poco más lejos, haremos un control de velocidad de 4 frecuencias que seleccionaremos mediante dos interruptores externos. El sentido de giro también lo seleccionaremos con un interruptor externo.

Código Verilog

El código consiste en cuatro generadores de pulsos de 50, 200, 500 y 1000 Hz. Un multiplexor 4-1 modelado con estructura case se encarga de conmutar entre las distintas señales. En este ejemplo describiremos el circuito en un único módulo.

Archivo .pcf

Subimos el código a la Alhambra y en función de los switches de selección SW3 y SW4 aplicamos en la entrada STEP pulsos de 50, 200, 500 y 1000 Hz que se traducen en cuatro velocidades distintas.