Simulación de movimiento cámara de seguridad Proyecto MSP430G2553



Introducción



Los motores paso a paso son ideales para la construcción de mecanismos en donde se requieren movimientos muy precisos.

La característica principal de estos motores es el hecho de poder moverlos un paso a la vez por cada pulso que se le aplique. Este paso puede variar desde 90° hasta pequeños movimientos de tan solo 1.8°, es decir, que se necesitarán 4 pasos en el primer caso (90°) y 200 para el segundo caso (1.8°), para completar un giro completo de 360°.

Estos motores poseen la habilidad de poder quedar enclavados en una posición o bien totalmente libres. Si una o más de sus bobinas está energizada, el motor estará enclavado en la posición correspondiente y por el contrario quedará completamente libre si no circula corriente por ninguna de sus bobinas.



Motor Unipolar: Estos motores suelen tener 6 o 5 cables de salida, dependiendo de su conexionado interno. Este tipo se caracteriza por ser más simple de controlar. En la figura 4 podemos apreciar un ejemplo de conexionado para controlar un motor paso a paso unipolar mediante el uso de un ULN2803, el cual es una array de 8 transistores tipo Darlington capaces de manejar cargas de hasta 500mA. Las entradas de activación (Activa A, B, C y D) pueden ser directamente activadas por un microcontrolador.


Descripción del problema
Se necesita crear un sistema con un motor a pasos que simule el movimiento de una cámara de seguridad, la cual puede girar de manera automática de derecha a izquierda hasta los límites respectivos que nosotros establezcamos y también podemos manipular su giro de manera manual respetando los límites establecidos.



Solución del Problema 
Se debe tener un seleccionador de modo: automático / manual, para modo manual como para modo automático se deben tener 2 sensores que detecten el giro del motor, éstos serán los límites izquierda y derecha respectivamente.
Cuando se seleccione el modo manual el giro se debe manipular con 2 push botton uno para sentido izquierda y otro para sentido derecha. Cuando el motor llegue a cualquiera de los dos límites deberá de detenerse.



Hardware
 


 

Software
Diagrama de Flujo 


Programa Software
  ;MOTOR AUTOMÁTICO MANUAL PARA MSP430G2553

;*******************************************************************************

            .cdecls C,LIST, "msp430G2553.h"  ; header

;-------------------------------------------------------------------------------

            .text                           ;  Inicio de programa

            .retain

            .retainrefs



;-------------------------------------------------------------------------------
RESET       mov.w   #250h,SP                ; Inicializar  stackpointer
     AltoWDT     mov.w   #5A80h,&120h  ; Alto WDT

;--------------------------------------------------------

                 bis.b   #17h,&P1DIR  ;habilita 00010111 salidas=1

                bis.b   #00h,&P2DIR ;habilita como entradas a todo P2

                 bis.b #008h,&P1REN ;ya es entrada y se habilita resistencia

                 bis.b #008h,&P1OUT; resistencia en PullUp

                 bis.b #0Fh,&P2REN ;habilita resistencia de push en  todo P2

                 bis.b #0Fh,&P2OUT ;pone las resistencias de P2 en Pull Up

;--------------------------------------------------------

     Boton            bit.b #008h,&P1IN    ;lee P13

                 jnz         Manual   ;si P13 es diferente 0 pasa a modo manual

;--------------------------------------------------------

    ;Entra en modo Automático cuando en P1.3 lee 0

  

     Automatico      bit.b #001h,&P2IN  ;lee sensor1        

                     jnz   Move1 ; si es 1 ejecuta Move1

                     bit.b  #002h,&P2IN ;si sensor1 fue 0 lee sensor2    

                     jnz     Move2 , si sensor2 es 1 ejecuta Move2

  

    

 

    Move1       call #Sentido1     ;Llama subrutina sentido1   

                bit.b     #001h,&P2IN ;lee sensor1 2.0

                jnz        Move2   ;si es 1 cambia a Move2

                bit.b      #008h,&P1IN ;lee botón P1.3

                jnz        Manual  ;Si P1.3=1 Cambia a modo manual

                jmp  Move1    ;si el sensor y P1.3 fueron 0 repite Move1



    Move2       call #Sentido2   Llama subrutina sentido2

                bit.b     #002h,&P2IN  ;lee sensor2 2.1

                jnz       Move1   ;si es 1 cambia a Move1

                bit.b     #008h,&P1IN  ;lee botón P1.3

                jnz        Manual  ;Si P1.3=1 Cambia a modo manual

                jmp  Move2  ;si el sensor y P1.3 fueron 0 repite Move2



;--------------------------------------------------------

     Manual     bic.b #17h,&P1OUT   ;apaga motor



                bit.b #04h,&P2IN    ;Lee push P2.2

                jnz   Move3        ;Dif 1 va a Move3

                bit.b #08h,&P2IN    ;test push P2.3

                jnz   Move4        ;Dif 1 va a Move4

                bit.b #001h,&P2IN    ;Lee sensor P2.0

                jnz        STOP    ;si es 1 para motor

                bit.b      #002h,&P2IN    ;test sensor P21

                jnz        STOP

                jmp Boton     ;Brinca a Boton para verificar que esta en 1

 

      Move3   bit.b    #001h,&P2IN    ;Lee sensor P2.0

              jnz           STOP    ;Lee si es 1 ejecuta STOP

              call #Sentido1      ;Llama sentido1

              bit.b #04h,&P2IN    ;test push P2.2

              jnz Move3           ;mientras se 1 ejecuta Move3

              jmp Manual     ;Si se suelta el push P2.2 regresa a MANUAL





   
  Move4   bit.b    #002h,&P2IN    ;Lee sensor P2.1
              jnz           STOP

              call #Sentido2

              bit.b #08h,&P2IN    ;test push P2.3

              jnz   Move4        ;Dif 1 va a Move4

              jmp Manual  ;Si se suelta el push P2.3 regresa a MANUAL





       STOP    bic.b #17h,P1OUT  ;Detiene Motor

               jmp Manual

;--------------------------------------------------------

 ;   ;SUBRUTINA SENTIDO1 

     Sentido1:                        

            mov.b   #14h,&P1OUT

            call #Tiempo          ;llama subrutina

            call #Tiempo



             mov.b   #06h,&P1OUT

             call #Tiempo

             call #Tiempo



             mov.b   #03h,&P1OUT

            call #Tiempo

            call #Tiempo



             mov.b   #11h,&P1OUT

             call #Tiempo

             call #Tiempo

             ret

;--------------------------------------------------------

      ;SUBRUTINA SENTIDO2

     Sentido2:

            mov.b   #03h,&P1OUT

            call #Tiempo          ;llama subrutina

           call #Tiempo



           mov.b   #06h,&P1OUT

           call #Tiempo

           call #Tiempo



           mov.b   #14h,&P1OUT

           call #Tiempo

           call #Tiempo



           mov.b   #11h,&P1OUT

            call #Tiempo

            call #Tiempo

            ret

;-------------------------------------------------------



      Tiempo         mov.w   #010FFh,R5   ;subrutina

      LoopTiempo:    dec.w   R5

                     jnz     LoopTiempo

                     ret

;-------------------------------------------------------------------------------

;           Interrupt Vectors

;-------------------------------------------------------------------------------



           .sect   ".reset"                ;  Vector de RESET

           .short  RESET



 
MATERIAL 


  • 1 Motor a pasos unipolar de 12V
  • 1 ULN2803
  • 2 Sensores ITR8102
  • 2 push button
  • 1 switch 
  • 11 cables jumpers macho-hembra
  • 5 resistencias 330Ω
  • 2 Resistencias 6.8KΩ


ESQUEMÁTICO




Comentarios

Entradas populares de este blog

Mapas de Karnaugh

Sumador binario de 2 números de 2 Bits

EAGLE 9.0.0