Control de motor bipolar con pic16f887 en ensamblador
Control de motor bipolar con pic16f887 en ensamblador y simulado en Proteus
Objetivos:
- Control de 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
