Vous êtes sur la page 1sur 16

Solucin de la pregunta 3 de la prctica calificada

3. Realizar el control de sentido de giro y velocidad de un motor paso a paso


unipolar.
EI motor est conectado en el puerto B (RbO,RB1,RB2, Rb3) y su activacin se
activara con un interruptor conectado en el puerto D (RDO)
Se pide:
a) Realizar el circuito dejando listo para hacer Pruebas.
b) Hacer el control para hacer cumplir Ia tabla, se pide realizar el programacin
correspondiente.

INTERURTOR MOTOR

abierto paro

cerrado Girar el motor cuatro


vueltas a Ia derecha, luego
hacer girar el motor Cuatro
vueltas a la izquierda, as
constantemente hasta que
el interruptor se abra

el paso del motor es 7.5/paso

Resolucin:

a)
+5V

R1
10k
16 8 U1
U2
1 4 2 3
MCLR RB0/CN4/RP0/AN2/EMUD1/PGD1 IN1 VSS VS OUT1
20 5 7 6
VDDCORE RB1/CN5/RP1/AN3/EMUC1/PGC1 IN2 OUT2
6 1
+5V RB2/CN6/RP2/AN4 EN1
7
RB3/CN7/RP3/AN5
11
RB4/CN1/RP4/SOSCI/EMUD3/PGD3
14 9 +88.8
RB5/CN27/RP5/ASDA1 EN2
28 15 10 11
AVDD RB6/CN24/RP6/ASCL1 IN3 OUT3
27 16 15 14
AVSS RB7/CN23/RP7/INT0 IN4 GND GND OUT4
17
RB8/CN22/RP8/SCL1/PWM2H1/TCK
18
RB9/CN21/RP9/SDA1/PWM2L1/TDO
21 L293D
RB10/CN16/RP10/PWM1H3/TDI
2 22
SWT2 SWT1 3
RA0/CN2/VREF+/AN0/EMUD2/PGD2RB11/CN15/RP11/PWM1L3/TMS
RA1/CN3/VREF-/AN1/EMUC2/PGC2 RB12/CN14/RP12/PWM1H2
23
9 24
RA2/CN30/CLKI/OSCI RB13/CN13/RP13/PWM1L2
10 25
RA3/CN29/CLKO/OSCO RB14/CN12/RP14/PWM1H1
0

12 26
RA4/CN0/T1CK/SOSCO/EMUC3/PGC3 RB15/CN11/RP15/PWM1L1
DSPIC33FJ12MC202
b) Programacin

title "motor paso a paso"; titulo del proyecto

.equ __33FJ12MC202,1; definir constantes y direcciones de memoria

.include "P33FJ12MC202.inc";incluye en el programa un fichero donde


se definen las etiquetas con las que se nombra a los diferentes registros
y sus bits

; Configuration bits:

;..............................................................................

;config __FOSC,CSW_FSCM_OFF&XT_PLL4 ;use cristal oscilador con


el 4x PLL

;config __FWDT,WDT_OFF ;Desabilitado Watchdog Timer

;config __FBORPOR,PBOR_ON&MCLR_EN

;Set Brown-out Reset voltage and

;and set Power-up Timer to 16msecs

;config __FGS,CODE_PROT_OFF ;Desabilitado protecion de codigo

; Declaracin de variables y subprocesos

.equ cont,#0x0810

.equ cont1,#0x0812

.equ nvuelta_H,#0x0814

.equ nvuelta_AH,#0x0816

.global xx

.global yy

.global zz

.global __reset

.text

;*************Programa principal *****************

__reset:
goto main

.org 100

main:

; mov #_SP_init,W15 ;inicializa el SP

; mov #_SPLIM_init,W0

; mov W0,SPLIM

nop

;*******************************configuration de puertos**************

mov #0x0000,W0 ;puerto B salida

mov W0,TRISB

mov #0x0014,W1; puerta A entrada

mov W1,TRISA

loop:

bra swt1 ; empieza leendo el swt1

bra loop ; se dirige a la rutina "loop"

swt1:

BTSS PORTA,#02 ; lee el estado del switch 1

BRA swt2_A ; se va a la rutina swt2 opcion A

BRA swt2_B ; se va a la rutina swt2 opcion B

swt2_A:

BTSS PORTA,#04 ; lee el estado del switch 2

BRA DETENER ; se detiene el motor

BRA GIRO_ANTIHORARIO; gira el motor en sentido antihorario


swt2_B:

BTSS PORTA,#04 ; lee el estado del switch 2

BRA GIRO_HORARIO ; gira el motor en sentido horario

BRA DETENER; se detiene el motor

;*********** SUBPROGRAMAS***********

GIRO_HORARIO:

call NUMERO_DE_VUELTAS_H; numero de vueltas: 5

resta: dec nvuelta_H ; decrementa el numero de vueltas en 1

bra NZ, HORARIO ; si el numero de vuelta es diferente de 0 se va a


la rutina HORARIO, y si es 0 se va a la rutina pausa_H

bra pausa_H

GIRO_ANTIHORARIO:

call NUMERO_DE_VUELTAS_AH; numero de vueltas: 5

resta1: dec nvuelta_AH; decrementa el numero de vueltas en 1

bra NZ, ANTIHORARIO; si el numero de vuelta es diferente de 0 se


va a la rutina ANTIHORARIO, y si es 0 se va a la rutina pausa_AH

bra pausa_AH

HORARIO:; gira el motor en sentido horario

mov #0x0000,W0

mov W0,PORTB

call delay

mov #0x000A, W0

mov W0, PORTB

call delay
mov #0x0009, W0

mov W0, PORTB

call delay

mov #0x0005, W0

mov W0, PORTB

call delay

mov #0x0006, W0

mov W0, PORTB

call delay

mov #0x0000,W0

mov W0,PORTB

call delay

BRA resta

ANTIHORARIO:; gira el motor en sentido antihorario

mov #0x0000,W0

mov W0,PORTB

call delay
mov #0x0006, W0

mov W0, PORTB

call delay

mov #0x0005, W0

mov W0, PORTB

call delay

mov #0x0009, W0

mov W0, PORTB

call delay

mov #0x000A, W0

mov W0, PORTB

call delay

mov #0x0000,W0

mov W0,PORTB

call delay

bra resta1

DETENER:

mov #0x0000,W0; se detiene el motor

mov W0,PORTB
call delay

bra swt1 ; se va a la rutina swt1

pausa_H: ; rutina para que se detenga cuando termine los 5 giros


horarios del motor y no siga dando vueltas

mov #0x0000,W0

mov W0,PORTB

call delay

bra ENCLAVADO_H ; se dirige a la rutina ENCLAVADO_H

ENCLAVADO_H:

BTSS PORTA,#04

BRA pausa_H ; se dirige a la rutina pausa_H

BRA loop ; se dirige a la rutina loop

pausa_AH: ; rutina para que se detenga cuando termine los 5 giros


antihorarios del motor y no siga dando vueltas

mov #0x0000,W0

mov W0,PORTB

call delay

bra ENCLAVADO_AH; se dirige a la rutina ENCLAVADO_AH

ENCLAVADO_AH:

BTSS PORTA,#04
BRA loop ; se dirige a la rutina loop

BRA pausa_AH; se dirige a la rutina pausa_AH

NUMERO_DE_VUELTAS_H: ; esta rutina es para indicarle al motor


cuantos giros horarios debe realizar

mov #0x0006,W3 ; se le carga el numero de vueltas horario

mov W3,nvuelta_H

return

NUMERO_DE_VUELTAS_AH:; esta rutina es para indicarle al motor


cuantos giros antihorarios debe realizar

mov #0x0006,W3; se le carga el numero de vueltas antihorario

mov W3,nvuelta_AH

return

INTERRUPCION: ; rutina para detectar cambios de estados en el switch


1 y switch 2

BTSS PORTA,#02

BRA OPCION_1

BRA OPCION_2

OPCION_1:

BTSS PORTA,#04

BRA loop
BRA XX

OPCION_2:

BTSS PORTA,#04

BRA XX

BRA loop

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

delay: ;Subrutina de Retardo en dos lazos

mov # 0xA000 ,W2

mov W2,cont

YY: mov # 0x000f, W1

mov W1,cont1

BRA INTERRUPCION ; se dirige a la rutina interrupcion

XX: dec cont1

bra NZ,XX

dec cont

bra NZ,YY

return

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

.end
Solucin del examen parcial

1.

2. Contesta las siguientes preguntas:

a) .
b) .
c) Explicar cmo funciona el TIMER1 como contador
Para los temporizadores tipo A adems de poner el valor de TCS=1, el
bit TSYNC (TxCON) <2> deber igualmente tomar valor 1 para realizar
la sincronizacin con la seal de reloj externa.
Los temporizadores trabajando en modo contador sncrono no
funcionaran dentro del modo de reposo (SLEEP).
d) Como selecciona el TIMER1 en modo sncrono
Se lleva a cabo cuando el bit TCS del registro de control del
temporizador (TxCON) tiene valor 0.
e) Cul es la funcin del Preescaler y describa
El Preescaler es un circuito que permite modificar la frecuencia del reloj
de entrada del Timer0, dividiendo esta y generando una nueva seal de
menor frecuencia a la salida que ser la seal de reloj de entrada al
registro TMR0. El Preescaler es una facilidad para cuando la seal de
entrada es demasiado rpida para nuestros propsitos y necesitamos
ralentizarla.
f) Cul es la funcin del registro PR1
El registro PR1 por defecto vale 0xFFFF con lo que el periodo del
Timer1 ser ese, pero podemos ajustarlo al valor que queramos, lo que
nos permite seleccionar una frecuencia de interrupcin programable muy
til.

3. Realizar el control de un motor paso a paso ubicado en el puerto D del


dsPIC34F4013, cuando se cierra el interruptor ubicado en el PIN RB4 el motor
el motor debe da un vuelta completa(360 grados. Luego el motor debe estar en
paro 0.5 segundos y despus debe girar una vuelta en sentido contrario; luego
el motor debe parar 0.5 segundos despus comenzar la secuencia hasta que
se el interruptor se ponga en on abierto; el control de tiempo de 0.5 segundos
debe hacerse con el TIMER 1.

a. Realizar el circuito del control dejando listo para hacer pruebas


+5V

R1
10k
16 8 U1
U2
1 4 2 3
MCLR RB0/CN4/RP0/AN2/EMUD1/PGD1 IN1 VSS VS OUT1
20 5 7 6
VDDCORE RB1/CN5/RP1/AN3/EMUC1/PGC1 IN2 OUT2
6 1
+5V RB2/CN6/RP2/AN4 EN1
7
RB3/CN7/RP3/AN5
11
RB4/CN1/RP4/SOSCI/EMUD3/PGD3
14 9 +88.8
RB5/CN27/RP5/ASDA1 EN2
28 15 10 11
AVDD RB6/CN24/RP6/ASCL1 IN3 OUT3
27 16 15 14
AVSS RB7/CN23/RP7/INT0 IN4 GND GND OUT4
17
RB8/CN22/RP8/SCL1/PWM2H1/TCK
18
RB9/CN21/RP9/SDA1/PWM2L1/TDO
21 L293D
RB10/CN16/RP10/PWM1H3/TDI
2 22
SWT2 SWT1 3
RA0/CN2/VREF+/AN0/EMUD2/PGD2RB11/CN15/RP11/PWM1L3/TMS
RA1/CN3/VREF-/AN1/EMUC2/PGC2 RB12/CN14/RP12/PWM1H2
23
9 24
RA2/CN30/CLKI/OSCI RB13/CN13/RP13/PWM1L2
10 25
RA3/CN29/CLKO/OSCO RB14/CN12/RP14/PWM1H1
0

12 26
RA4/CN0/T1CK/SOSCO/EMUC3/PGC3 RB15/CN11/RP15/PWM1L1
DSPIC33FJ12MC202

b. Hacer los clculos para temporizar los 0.5 segundos

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


se tiene:
Ciclo de reloj:

Ciclo de instruccin:
Para limitar la corriente del pin de Reset y el botn pulsador a
0.5mA, utilizar una resistencia de 10k.

c. Escribir las instrucciones del programa comentando cada instruccin


.title "TERCERA pregunta del parcial"
.equ __30f4013,1
.include "p30f4013.inc"
;***********+CONFIGURACION DE BITS*****************************
config __FOSC, FRC ;Trabajar con el Osc Interno
config __FWDT, WDT_OFF ;deshabilitar el Perro guardian
config __FBORPOR, MCLR_EN

;..............................................................................
.equ cont,#0x0810
.equ cont1,#0x0812
.equ nvuelta_H,#0x0814
.equ nvuelta_AH,#0x0816

.global __reset
.text
;*************Programa principal *****************
__reset:
goto main
.org 100
;**************Configuracion de Puertos*****************************+
main:
mov #0x0000, W0
mov W0,LATB ; Limpio los valores de los latch
mov W0,TRISB ; Ponemos todos los pines de salida RB0-15

mov #0x0001, W1 ; se declara el pin RD0 como entrada


mov W1,TRISD

;*********************ESCIRTURA EN LOS PUERTOS********************


mov #0x0000, W0; inicia el programa con el motor apagado
mov W0,PORTB
;..................................

............................................
;Programa Principal
;..............................................................................

loop :

BRA swt ; se dirige a rutina swt


BRA loop ; se dirige a la rutina loop

swt:
BTSS PORTD,#0 ; lee el estado del switch
BRA DETENER ; switch=0, se dirige a la rutina DETENER
BRA GIRO ; switch=1, se dirige a la rutina GIRO

;*********SUBRUTINAS********************************************

DETENER:
mov #0x0000,W0 ; se apaga el motor
mov W0,PORTB
call delay ; se dirige a la rutina delay
BRA swt ; se dirige a ala rutina swt

GIRO:
call GIRO_HORARIO ; se dirige a la rutina GIRO_HORARIO
call pausa_H ; se dirige a la rutina pausa_H
call GIRO_ANTIHORARIO ; se dirige a la rutina GIRO_ANTIHORARIO
call pausa_AH ; se dirige a la rutina pausa_AH
BRA swt ; se dirige a la rutina swt

GIRO_HORARIO:
call NUMERO_DE_VUELTAS_H; se dirige a la rutina numero de
vueltas_H
resta: dec nvuelta_H ; decrementa el numero de vueltas en 1
bra NZ, HORARIO ; si el numero de vuelta es diferente de 0 se va a
la rutina HORARIO, y si es 0 retorna donde fue llamado
return

GIRO_ANTIHORARIO:
call NUMERO_DE_VUELTAS_AH; numero de vueltas
resta1: dec nvuelta_AH; decrementa el numero de vueltas en 1
bra NZ, ANTIHORARIO; si el numero de vuelta es diferente de 0 se
va a la rutina ANTIHORARIO, y si es 0 retorna donde fue llamado
return

HORARIO: ; gira el motor en sentido horario


mov #0x0000,W0
mov W0,PORTB
call delay

mov #0x000A, W0
mov W0, PORTB
call delay

mov #0x0009, W0
mov W0, PORTB
call delay

mov #0x0005, W0
mov W0, PORTB
call delay

mov #0x0006, W0
mov W0, PORTB
call delay

mov #0x0000,W0
mov W0,PORTB
call delay
BRA resta

ANTIHORARIO:; gira el motor en sentido antihorario

mov #0x0000,W0
mov W0,PORTB
call delay

mov #0x0006, W0
mov W0, PORTB
call delay

mov #0x0005, W0
mov W0, PORTB
call delay
mov #0x0009, W0
mov W0, PORTB
call delay
mov #0x000A, W0
mov W0, PORTB
call delay

mov #0x0000,W0
mov W0,PORTB
call delay
bra resta1

NUMERO_DE_VUELTAS_H: ; esta rutina es para indicarle al motor


cuantos giros horarios debe realizar
mov #0x0014,W3 ; se le carga el numero de vueltas horario
mov W3,nvuelta_H
return

NUMERO_DE_VUELTAS_AH:; esta rutina es para indicarle al motor


cuantos giros antihorarios debe realizar
mov #0x0014,W3; se le carga el numero de vueltas antihorario
mov W3,nvuelta_AH
return

pausa_H: ; rutina para detener el giro 0.5 seg despues de una vuelta el
sentido horario
mov #0x0000,W0
mov W0,PORTB

call INICIO_DELAY ; se dirige a la rutina INICIO_DELAY


BB: btss IFS0,#T1IF ; lee el estado del registro IFS0
BRA BB ; IFS0=0,entonces se dirige a la rutina BB
bclr IFS0,#T1IF ; IFS0=1 , borrar el estado del registro IFS0
BCLR T1CON,#TON ; apagamos el temporizador
clr TMR1 ; TMR1=0
return ; retorna donde fue llamado

pausa_AH: ; rutina para detener el giro 0.5 seg despues de una vuelta
en sentido antihorario
mov #0x0000,W0
mov W0,PORTB

call INICIO_DELAY ; se dirige a la rutina INICIO_DELAY


AA: btss IFS0,#T1IF ; lee el estado del registro IFS0
BRA AA ; IFS0=0,entonces se dirige a la rutina AA
bclr IFS0,#T1IF ; IFS0=1 , borrar el estado del registro IFS0
BCLR T1CON,#TON ; apagamos el temporizador
clr TMR1; TMR1=0
return; retorna donde fue llamado

INICIO_DELAY:
bclr T1CON,#TON ; desabilito el timer
clr TMR1 ;TIMER 1=0
MOV #0x4CAB,W0 ;Cargo valor en PR1
MOV W0,PR1
mov #0x8030,W0; Configuracion del registro T1CON
mov W0,T1CON
BCLR IFS0,#T1IF ; T1IF=0
return

;**************** delay**********************
delay: ;Subrutina de Retardo en dos lazos
mov # 0x5000 ,W2
mov W2,cont
YY: mov # 0x0005, W1
mov W1,cont1
BTSS PORTD,#0 ; lee el estado del switch
BRA loop
XX: dec cont1
bra NZ,XX
dec cont
bra NZ,YY
return

;----------------- Fin del codigo ---------------------------------------------


.end

Vous aimerez peut-être aussi