3. Control de un Motor a Pasos Bipolar, PIC18F4550 ASM

Introducción

En varios sistemas electrónicos nos encontramos con una parte mecánica que transmite algún movimiento por palancas, levas, poleas, ejes de rotación, entre otras, todas ellas obtienen, en primera instancia, el movimiento de algún motor.

Existen diferentes tipos de motores, sin embargo para sistemas como: DVD’s, Grabadoras, Quemadores de discos, Impresoras, etc; se necesita un mejor control de las vueltas que realiza el motor, de esta manera los motores a pasos resultan ser los más convenientes.

De igual manera disponemos de motores a pasos unipolares o bipolares, cada uno de ellos tiene una combinación a sus entradas que determina su posición. Para controlar la secuencia de estas combinaciones podemos utilizar un PIC.

Objetivo

Manipular un motor a pasos bipolar en dos direcciones mediante dos botones.

Objetivos específicos

  • Identificar las características del PIC18F4550.
  • Manejar el software MPLAB para crear un proyecto y simular su funcionamiento.
  • Realizar un programa en lenguaje ensamblador para controlar el sentido de giro de un motor a pasos bipolar mediante dos botones pulsadores; un pulsador ubicado en RD0 controla el sentido de giro hacia la derecha, mientras que el otro ubicado en RD1 lo hace hacia la izquierda. El motor sólo avanza un paso cada vez que se presiona uno de los dos botones, si se presionan ambos o no se presiona ninguno el motor no deberá avanzar.
  • Realizar la simulación del código en MPLAB.
  • Armar el circuito en ISIS Proteus y simularlo.
  • Programar el microcontrolador mediante el software Pickit2.
  • Armar el circuito físico y realizar pruebas.

Marco Teórico

En el siguiente gráfico (Figura 1) se muestran los puertos disponibles en el PIC18F4550, sus ubicaciones y las posibles funciones de cada pin.

PIC18F4550_Pines

Figura1. Diagrama de los Pines del PIC18F4550

A continuación se muestra el diagrama de Bloques de dicho microcontrolador (Figura 2)

Diagrama de Bloques del PIC18F4550

figura 2. Diagrama de Bloques del PIC18F4550

Y por último una tabla con funciones para su programación (Figura 3)

Conjunto de instrucciones del PIC18F4550

Figura 3. Conjunto de instrucciones del PIC18F4550

Hemos mencionado que un microcontrolador puede ser considerado como una computadora, pues posee una ALU (Unidad de Aritmética y Lógica), registros, buses y unidad de control, es decir tiene una CPU (Unidad Central de Procesamiento).

La mayoría de los dispositivos de lógica secuencial, entre ellos los CPU, son de naturaleza síncrona. Es decir, están diseñados y operan en función de una señal de sincronización. Esta señal, conocida como señal de reloj, usualmente toma la forma de una onda cuadrada periódica. Calculando el tiempo máximo en que las señales eléctricas pueden moverse en las varias bifurcaciones de los muchos circuitos de un CPU, los diseñadores pueden seleccionar un período apropiado para la señal de reloj.

Para el correcto funcionamiento del microcontrolador debemos definir la frecuencia del oscilador pues determinará los ciclos de instrucción; podemos utilizar un oscilador interno o externo, sin embargo es recomendable utilizar un oscilador de cristal externo para evitar un mal funcionamiento frente a las variaciones de temparatura dentro del microcontrolador.

A continuación mostramos la tabla del registro de configuración del oscilador (Figura 4)

Figura 4. Registro OSCCON para la Configuración del Oscilador

Podemos ver que por default tiene cargado el valor: 0100 X000 que de acuerdo con los valores de la tabla anterior corresponderían a la siguiente configuración:

  • 0 | El dispositivo entra en reposo/bajo consumo cuando se ejecuta la instrucción Sleep.
  • 100 | Frecuencia del oscilador interno: 1MHz
  • X | Depende del estado del bit IESO
  • 0 | INTOSC La frecuencia del Oscilador Interno no es estable
  • 00 | Oscilador primario, externo

Aunque el microcontrolador está configurado por defecto con 1MHz  es necesario especificarlo en la palabra de configuración.

Para estas prácticas se utilizará una frecuencia de 4MHz y, como no es necesario precisión en el tiempo, no pondremos ningún oscilador externo, de esta manera el valor a cargar será el siguiente:

  • 0 110 0 0 00 => 0110 0000 => 0x60

Motor a Pasos Bipolar

Un motor a pasos es capaz de moverse ciertos grados cada vez que se le aplique un pulso y se mueva un paso, este paso puede variar desde 90º hasta 1.8º.

Estos motores poseen la ventaja de poder quedar enclavados en una sóla posición o bien totalmente libres; si una o más de sus bobinas esta energizada el motor permanecerá en la posición correspondiente, o bien, si no hay flujo de corriente en las bobinas el eje del motor estará libre.

Estos motores están constituidos normalmente por un rotor sobre el que van aplicados distintos imanes permanentes y por un cierto número de bobinas excitadoras en su estator.

Para controlar un motor a pasos es necesario conocer su funcionamiento, diseñar la etapa de potencia (transistores, diodos) y un circuito digital para la etapa de control (Circuitos TTL, Microcontrolador PIC). (Figura 5)

Figura 5. Motor a Pasos Bipolar y puente H

Existen 2 tipos de motores a pasos:

  1. Unipolares
  2. Bipolares

Ambos soncontrolados mediante una secuencia de activación específica, pero se diferencian en el modo en que están conectadas sus bobinas. Debido a que se usará un motor  a pasos bipolar se caracterizará a continuación.

Motor Bipolar

En este tipo de motores las bobinas del estator se conectar en serie formando solamente dos grupos, que se montan sobre dos estatores. De acuerdo a la (Figura 5) se observa que de este motor salen cuatro hilos que se conectan al circuito de control que realiza la función de cuatro interruptores electrónicos dobles, que nos permiten variar la polaridad de alimentacón de las bobinas.

Con la activación y desactivación adecuada de dichos interruptores dobles, podemos obtener las secuencias adecuadas para que el motor pueda girar en un sentido o en otro.

Secuencia para manejar motores paso a paso Bipolares

Los motores a pasos Bipolares generalmente tienen 4 cables de salida. Se caracterizan por tener dos bobinas independientes que al ser excitadas posicionan el eje del motor en cierta posición, estos motores necesitan la inversión de la corriente que circula en sus bobinas en una secuencia determinada; Cada inversión de la polaridad provoca el movimiento del eje en un paso, cuyo sentido de giro está determinado por la secuencia siguiente (Figura 6):

Figura 6. Secuencia para un Motor a Pasos Bipolar

Motor Unipolar

Estos motores suelen tener 6 o 7 cables de salida, dependiendo de sus conexiones internas. Este tipo se caracteriza por ser más simple de controlar. En la (Figura 7) podemos apreciar un ejemplo de conexionado para controlar un motor a pasos unipolar mediante el uso de un ULN2803, el cual es un array de 8 transistores tipo darlington capaz de manejar cargas de hasta 500mA. Las entradas de activación (A, B, C y D) pueden ser activadas por un microcontrolador.

Figura 7. Motor a Pasos Unipolar

Secuencia para manejar motores paso a paso Unipolares

Existen tres secuencias posibles para este tipo de motores, todas las secuencias comienzan nuevamente por el “paso 1” una vez alcanzao el paso final (4 u 8).

  1. Secuencia normal: La descrita en la tabla de la (Figura 8).
  2. Secuencia del tipo Wave drive: Sólo activa una bobina a la vez.
  3. Secuencia del tipo medio paso: Activa una bobina y después dos.

Figura 8. Secuencia normal para motor a pasos unipolar

Para invertir el sentido de giro, simplemente se debe ejecutar las secuencias en modo inverso.

Cálculos

Dado que se configuró el oscilador interno del microcontrolador a 4MHz, se tiene:

  • Ciclo de reloj:
  • Ciclo de instrucción:
  • Para limitar la corriente del pin de Reset y el botón pulsador a 0.5mA, utilizar una resistencia de 10kΩ.

  • Se emplea un retardo de 200 ms para verificar la secuencia de pulsos de los botones, tomando en cuenta que es un tiempo considerable para pulsar y soltar un botón. Por lo tanto se crean 2 variables quedando definidas de la siguiente manera:

Conta 1: 256
Conta 2: 256

El contador 1 se encuentra dentro del ciclo de conteo del contador 2. Tomando en cuenta que se necesitan 3 ciclos de instrucción 3 us para la ejecución de cada sustracción al contador 1. La fórmula queda como sigue:

Simulación

Antes de comenzar la simulación es necesario leer lo siguiente: ¿Cómo simular en MPLAB? y ¿Cómo simular en ISIS Proteus? en caso de saber cómo hacerlo se pueden omitir los enlaces anteriores.

Simulación en MPLAB

Para el desarrollo de esta práctica haremos uso de una librería que contendrá las funciones para los retardos, de manera que necesitaremos un archivo con extensión *.inc y un *.asm, éste último será el archivo principal.

En primer lugar se realizará el código correspondiente a los retardos, para ello creamos un nuevo archivo File\New o Ctrl + N

Nos aparecerá una ventana en blanco donde podemos comenzar a escribir el código, sin embargo la sintaxis no se resaltará hasta que tenga una extensión, para ello ejecutamos el comando Guardar como… mediante el menú File\Save As En la ventana que aparece asignar el nombre de la librería, en este caso le llamaremos “Retardo” y le colocamos la extensión “.inc” de manera que antes de guardar deberá aparecer en el cuadro de texto “Retardo.inc” como se muestra en la (Figura 9)

Figura 9. Guardar Librería de la función Retardo

Después de verificar la configuración de la ventana Guardar como, damos clic en “Guardar” y ahora nuestro archivo aparecerá en la ventana de archivos de proyecto en la carpeta “Header Files” (Figura 10). De este manera podemos insertar el código que se interpretará como una función incluida en una librería.

Figura 10. Archivo Fuente y para Librería

Ahora en el archivo Retardo.inc escribiremos el siguiente código:


#define Conta
cblock
     Conta1
     Conta2
     Conta3
endc

Retardo200ms
     clrf Conta1
     clrf Conta2
Repeat
     decfsz Conta1, F  ;Salta cuando Conta1 llega a 0
     bra Repeat        ;Salta a Repeat para Decrementar Conta1

     decfsz Conta2, F  ;Salta cuando Conta2 llega a 0
     bra Repeat        ;Salta a Repeat

Return

Se guardan los cambios y se continua editando el archivo fuente como sigue:


; ********************************************************
; Desarrollo de Microcontroladores y DSPS
; Control de un Motor a pasos Bipolar
; Práctica 3
;
; Fecha: 15/06/2012
; Notas: Control de un motor a pasos bipolar mediante
;        dos botones que controlan su dirección
;
; Autor: ek
; ************************************************************
LIST P = 18F4550
INCLUDE <P18F4550.INC>
;************************************************************
CONFIG FOSC = HS ;INTOSC_XT no disponible para simulación, usar HS
CONFIG PWRT = ON
CONFIG BOR = OFF
CONFIG WDT = OFF
CONFIG MCLRE = ON
CONFIG PBADEN = OFF
CONFIG LVP = OFF
CONFIG DEBUG = OFF
CONFIG XINST = OFF
; CODE ******************************************************
cblock
     SecuenC ;Indice de la Secuencia
endc

ORG 0x00     ;Iniciar el programa en el registro 0x00

    movlw 0x62    ;Palabra de congiguración del OSC Interno
    movwf OSCCON  ;Configurar OSCC2ON <- W

    clrf PORTD    ;Borra posibles valores en PORTD
    clrf PORTB    ;Borra posibles valores en PORTB

    movlw 0x03    ;Configurar RD0 y RD1 como entradas
    movwf TRISD   ;TRISD <- W
    clrf TRISB    ;Configurar PORTD como salida
    clrf SecuenC  ;Estado de Posición a 0x00

INICIO
    movf SecuenC, W
    call MotorPosition
    movwf PORTB
    call Retardo200ms

ButtonRight         ;Verificar Botón Derecho
    btfss PORTD, 0  ;Verificar RB0 == 1, R == ON
    bra ButtonLeft  ;RB0 == 0, R == OFF
    btfsc PORTD, 1  ;Verificar RB1 == 0, L == OFF
    bra INICIO      ;Ambos están Presionados
    bra MoveRight   ;Entradas RB0 == 1, RB1 == 0
ButtonLeft          ;Verificar Botón Izquierdo
    btfss PORTD, 1  ;R == OFF ahora Verificar RB1 == 0, L == ON
    bra INICIO      ;Ambos están Sueltos
    bra MoveLeft

MoveRight           ;Aumentar indice para la tabla
    movf SecuenC, W
    xorlw 0x06      ;Verificar el indice Max
    btfss STATUS, Z ;Salta si Z == 1, SecuenC = Indice Max
    bra Continue1
    clrf SecuenC
    bra INICIO
Continue1
    incf SecuenC, F
    incf SecuenC, F
    bra INICIO

MoveLeft
    movf SecuenC, W ;SecuenC -> W
    xorlw 0x00      ;Comprobar si W == 0
    btfss STATUS, Z ;Salta si Z == 1, SecuenC = Indice Min
    bra Continue2   ;Secuence =/= 0
    movlw 0x06      ;Rotar hasta Indice Max
    movwf SecuenC   ;Asignar Indice Max -> SecuenC
    bra INICIO
Continue2
    decf SecuenC, F
    decf SecuenC, F
    bra INICIO

MotorPosition
    addwf PCL, F
    retlw 0x0A     ;0000 1010
    retlw 0x09     ;0000 1001
    retlw 0x05     ;0000 0101
    retlw 0x06     ;0000 0110

    include "Retardo.inc"   ;Agregar librería Retardo.inc

END ;Fin de Programa

Simulación en ISIS Proteus

Se construyó en ISIS Proteus el diagrama eléctrico de la siguiente manera y se verificó que el motor respondía como se esperaba al presionar los pulsadores que controlan el sentido de giro del mismo. El motor siempre se mueve sólo un paso si se presiona sólo una vez, el sentido depende del botón presionado.

Si el botón se mantiene presionado el motor seguirá girando en el sentido correspondiente hasta que se suelte, y si ambos se ambos se encuentran en el mismo estado el motor no hará nada.

Figura 11. Circuito para el control de un Motor a Pasos Bipolar

Desarrollo Experimental

Material y Equipo requerido

  • 1   PIC18F4550
  • 1   CI L293D (Puente H con diodos)
  • 3   Resistencias de 10kΩ
  • 8   Diodos 1N4007
  • 1   Motor a pasos Bipolar
  • 1   Tablilla de experimentación (Protoboard)
  • 1   Fuente de 5V
  • 1   Multímetro
  • 1   Programador de Microcontroladores
  • 1   Computadora
  • Software MPLAB y software de programador
  • Software ISIS Proteus

 

This entry was posted in Uncategorized. Bookmark the permalink.

Leave a comment