Sei sulla pagina 1di 9

Control de un motor a pasos unipolar con un

pic16f84a
Christian A Vazquez Villanueva
UACM, San Lorenzo Tezonco
September 18, 2013
Contents
0.1 Diagrama de ujo . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
0.2 Diagrama en proteus . . . . . . . . . . . . . . . . . . . . . . . . . 2
0.3 Programa en emsamblador . . . . . . . . . . . . . . . . . . . . . . 2
0.4 Programa en c . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
0.1 Diagrama de ujo
1
0.2 Diagrama en proteus
0.3 Programa en emsamblador
; control motor a pasos revision// christian 2013
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>
#DEFINE arranque PORTA,0 ;interruptor de arranque
#DEFINE giro PORTA,1 ;interruptor control de giro
reg1 EQU 0X0C ;registro usado para el retardo
reg2 EQU 0X0D ;registro usado para el retardo
2
; zona codigo
ORG 0
Inicio
bsf STATUS,RP0 ; Selecciona Banco 1 de registros.
bsf arranque ; se configura como entrada
bsf giro ; se configura como entrada
clrf PORTB ; El Puerto B se configuran como salida.
bcf STATUS,RP0 ; Selecciona Banco 0 de registros.
principal
btfss arranque ; arraque=1
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
clrf PORTB ; se apagan todas las salidas del puerto b.
goto principal ; regresa a principal
;subrutina sentidogiro
sentidogiro
btfss giro; giro=1
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 b00000101 ; primer paso
call activasalida ; llama a subrutina activasalida
movlw b00000110 ;
call activasalida
movlw b00001010 ;
3
call activasalida
movlw b00001001 ;
call activasalida
return
; subrutina giroder
giroder
movlw b00001001 ; primer paso
call activasalida
movlw b00001010 ;
call activasalida
movlw b00000110 ;
call activasalida
movlw b00001001 ;
call activasalida
return
; subrutina activasalida
activasalida
movwf PORTB ; mueve el valor de w a la portb
call pausa ; llama a subrutina pausa
return
pausa
MOVLW d249 ;cargamos (w) con el decimal 249
MOVWF reg1 ;mover lo que hay en W al registro1
MOVLW d249 ;cargamos (w) con el decimal 249
MOVWF reg2 ;mover lo que hay en W al registro2
uno DECFSZ reg1,1 ;Decrementa registro1 y el resultado guardalo en el mismo
GOTO uno
dos DECFSZ reg2,1 ;decrementa registro2 y el resultado guardalo en el mismo
GOTO dos
RETURN ;retorna de donde lo llamaron
END
4
0.4 Programa en c
// control de motor de pasos // Christian
#include <pic16f84a.h>
//-- Valor inicial del TMR0 para realizar una pausa de 2ms
//-- Divisor del prescar a 226
#define T_2ms 61
/******************************/
/* Hacer una pausa de 2ms */
/******************************/
void timer0_delay(unsigned char t0ini) {
//-- Dar valor inicial del timer
TMR0 = t0ini;
//-- Flag de interrupcion a cero
T0IF = 0;
//-- Esperar a que transcurra el tiempo indicado
while (T0IF == 0);
}
/*******************************************************/
/* Pausa */
/* ENTRADA: duracion de la pausa en centesimas (2ms) */
/*******************************************************/
void timer0_delay_long(unsigned int duracion) {
unsigned int i;
for (i = 0; i < duracion; i++)
timer0_delay(T_2ms);
}
void main(void) {
//-- Configurar el bit 1 del puerto B para Salida
TRISA0 = 1;
5
TRISA1 = 1;
TRISB0 = 0;
TRISB1 = 0;
TRISB2 = 0;
TRISB3 = 0;
//-- Configurar Timer 0
//-- Modo temporizador
T0CS = 0;
PSA = 0;
//-- Presscaler a 226
PS2 = 1;
PS1 = 1;
PS0 = 1;
while(1) {
if (RA0 == 1) { // si esta oprimido el boton de arranque
if (RA1 == 1) { // si esta en uno gira a la derecha
RB0 = 1;
RB1 = 0;
RB2 = 0;
RB3 = 1;
timer0_delay_long(2);
RB0 = 1;
RB1 = 0;
RB2 = 1;
RB3 = 0;
timer0_delay_long(2);
RB0 = 0;
RB1 = 1;
RB2 = 1;
RB3 = 0;
timer0_delay_long(2);
RB0 = 0;
RB1 = 1;
RB2 = 0;
6
RB3 = 1;
timer0_delay_long(2);
/*
PORTB = 0b0011201;
timer0_delay_long(2);
PORTB = 0b001122;
timer0_delay_long(2);
PORTB = 0b001212;
timer0_delay_long(2);
PORTB = 0b001221;
*/
} else { // gira a la izquierda
//PORTB = 0b001221;
RB0 = 0;
RB1 = 1;
RB2 = 0;
RB3 = 1;
timer0_delay_long(2);
//PORTB = 0b001212;
RB0 = 0;
RB1 = 1;
RB2 = 1;
RB3 = 0;
timer0_delay_long(2);
//PORTB = 0b001122;
RB0 = 1;
RB1 = 0;
RB2 = 1;
RB3 = 0;
timer0_delay_long(2);
//PORTB = 0b0011201;
RB0 = 1;
RB1 = 0;
RB2 = 0;
RB3 = 1;
7
timer0_delay_long(2);
}
} else { // esta parado
PORTB = 0x00;
}
}
}
8

Potrebbero piacerti anche