Control de motor bipolar con pic16f887 en ensamblador y simulado en Proteus

Control de motor bipolar con pic16f887 en ensamblador y simulado en Proteus

Escrito Por: admin Publicado En: Proyectos de microcontroladores PIC Fecha de Creación: 2013-03-09 visitas: 1998

Control de motor bipolar con pic16f887 en ensamblador y simulado en Proteus

Objetivos:
 

  • Control de un motor bipolar
  • Interruptor de prendido 
  • Interruptor de giro

 

Materiales

  • pic16f887
  • motor bipolar
  • l293d
  • fuente de voltaje

Desarrollo:

 

Tabla para el control de la bobina A, B, del motor bipolar

RC3

RC2

RC1

RC0

A1

A2

B1

B2

1

0

1

0

1

0

0

1

0

1

0

1

0

1

1

0

 

Diagrama en proteus

 

Diagrama de flujo

Programa en ensamblador

 

;  control motor a pasos revision// christian 2013

__CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOREN_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDTE_OFF & _FOSC_INTRC_NOCLKOUT
__CONFIG    _CONFIG2, _WRT_OFF;

LIST P=16F887

INCLUDE <P16F887.INC>


errorlevel -302                     ;supress the 'not in bank0' warning
                                       ;  Se emplean para declarar inicio y final de un bloque de constantes. Se asignan valores correlativos
                                       ; CBLOCK 0x20
                                       ;  A, B, C, D ;A = 0x20, B=0x21, C=0x22, D=0x23
 cblock 0x70
Delay1                                  ;Define two file registers for the delay loop in shared memory
Delay2
 endc

;Delay1 0x70
;Delay2 0x71

 

 


; zona codigo

ORG 0x00

Inicio


           banksel        OSCCON              ;bank1
           movlw          b'00111100'         ;set cpu clock speed  8 Mhz
           movwf          OSCCON


           BANKSEL PORTA ;
           CLRF PORTA ;Init PORTA

           BANKSEL ANSEL ;
           CLRF ANSEL ;digital


           BANKSEL TRISA ;
           MOVLW b'00000011'
           MOVWF TRISA

            ; configuramos puerto B
          BANKSEL PORTC ;
          CLRF PORTC ;Init PORTB


          BANKSEL TRISC ;
          CLRF  TRISC ;

 

 


principal:
        banksel        PORTA
        btfsc PORTA,0     ; arraque=0
        goto apaga  ; no -> se va la subrutina apaga
        goto sentidogiro;  si -> se va a la subrutina sentidogiro
        goto principal;  regresa a principal

;subrutina apaga
apaga:
       banksel        PORTC               ;bank1
         movlw          b'00000000'         ;start the rotation by setting DS4 ON
         movwf          PORTC                ;write contents of the working register to the latch
        goto principal ;  regresa a principal

;subrutina sentidogiro
sentidogiro:
       banksel        PORTA               ;bank
       btfsc PORTA,1;  giro=0 RA1==0
       goto giroizq2;  no  ->  va la subrutina gira izquierda
       call giroder; si ->  llama la subrutina gira derecha
       goto principal ;  regresa al inicio

; subrutina giroizq2
giroizq2:
        call giroizq  ; llama la subrutina gira izquierda
        goto principal ; regresa a principal


; subrutina giroizq
giroizq:

       movlw b'00001010' ; primer paso
       call activasalida ; llama a subrutina activasalida
       movlw b'00001001' ;
       call activasalida
       movlw b'00000101' ;
       call activasalida
       movlw b'00000110' ;
       call activasalida
          movlw b'00001010' ; primer paso
       call activasalida ; llama a subrutina activasalida


       return

; subrutina giroder
giroder:

       movlw b'00000110' ;
       call activasalida
       movlw b'00000101' ;
       call activasalida
       movlw b'00001001'
       call activasalida
       movlw b'00001010' ;
       call activasalida
       movlw b'00000110' ;
       call activasalida
       return

; subrutina activasalida

activasalida:
       

      banksel        PORTC               ;bank
      movwf PORTC  ; mueve el valor de w a la portb
      call pausa   ; llama a subrutina pausa
      return


pausa:
    decfsz         Delay1,f             ;will always be decrementing 255 here
    goto           pausa            ;The Inner loop takes 3 instructions per loop * 255 loops (required delay)
    decfsz         Delay2,f             ;The outer loop takes and additional 3 instructions per lap * X loops (X = top 8 MSbs from ADC conversion)
    goto           pausa
      RETURN                    ;retorna de donde lo llamaron

 END