Hola que tal hoy les dejo este sencillo codigo y una breve explicacion para poder controlar la velocidad de un motor y hacer cambio del sentido del mismo por medio del pc, utilizando un micro PIC16F84A.
Se controlará
un motor de DC por medio de una computadora, usando la comunicación por RS232.
A la vez se mostraran mensajes en el LCD de a cuánta intensidad va girando el
motor. También se usará el Puente H para hacer que el motor cambie de sentido.
Se debe usar la interrupción externa para leer los datos que envíe la PC y que
el motor continúe girando.
CIRCUITO:
Este es el
circuito utilizado para esta práctica. El PORTA es para las salidas que están
conectados hacia el LCD: el pin RS con el pin RA0 y el pin RA2 con el pin E del
LCD. El pin R/W del LCD puede ir conectado a tierra o al pin RA1 del micro
controlador, siempre y cuando este mandando un 0 a R/W, pero en esta ocasión se
utilizó para la salida hacia el LED.
En el PORTB se
utiliza la parte alta del registro como salidas para el LCD. Van del RB4:RB7 y
del LCD D4:D7. Se activan las resistencias pull-up, ya que el RB0 se conecta
como entrada de la PC. RB1 y RB2 se utilizan como salidas hacia el circuito
integrado L293D.
En los pines
15 y 16 del micro controlador, irá el oscilador de cuarzo de 4 MHz conectado en
paralelo. Se conectará un capacitor de 22pF a cada pin del oscilador y
conectados a tierra. El MCRL estará conectado sólo a voltaje.
Los pines 15 y
16 del LCD, irán a voltaje por medio de una resistencia de 330 ohms y a tierra,
respectivamente.
El circuito
L293 es el integrado que simula el Puente H, los pines 2 y 7 son entradas para
el microcontrolador. Los pines 3 y 6 son salidas hacia el motor. Se conectan
sus respectivos pines a tierra y a voltaje. El pin de Enable está conectado a
voltaje, para que siempre esté habilitado.
MATERIAL:
-Microcontrolador PIC16F84A
-1 LCD 16x2
-1 L293D
-Motor DC
-1 resistencia de 330 ohms
-1 cable para RS232
-Computadora
-Cristal de cuarzo de 4 MHz
-2 capacitores de 22 pF
-Alambres
-Protoboard
-Fuente y sus cables
CÓDIGO:
CODIGO DEL PROGRAMA:
; ZONA DE DATOS
*****************************************************
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF &
_WDT_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x0C
V_tecla
V_encendido
V_apagado
Enciende
Apaga
VCambioG
ENDC
#DEFINE
Giro1 PORTB,1
#DEFINE
Giro2 PORTB,2
; ZONA DE CÓDIGOS **********************************************
ORG 0
goto Inicio
ORG 04h
goto Interrupcion
;MENSAJES--------------------------------------------------------------------
Mensajes
addwf PCL,F ;Tabla de mensajes
MensajeN ;
Posición inicial del mensaje.
DT
"Deana 103696",0x0
Mensaje10
DT
"Velocidad a 10% ",0x0
Mensaje20
DT "Velocidad a 20%
",0x0
Mensaje30
DT
"Velocidad a 30% ",0x0
Mensaje40
DT
"Velocidad a 40% ",0x0
Mensaje50
DT
"Velocidad a 50% ",0x0
Mensaje60
DT
"Velocidad a 60% ",0x0
Mensaje70
DT
"Velocidad a 70% ",0x0
Mensaje80
DT
"Velocidad a 80% ",0x0
Mensaje90
DT
"Velocidad a 90% ",0x0
Mensaje100
DT
"Velocidad a 100%",0x0
Mensaje0
DT
"Velocidad a 0%",0x0
;********************************************************
ORG 0x100
;********************************************************
Inicio
call LCD_Inicializa ;inicializa LCD
call RS232_Inicializa ;Inicializa comunicacion con la PC
bsf STATUS,RP0 ;accesa
al banco 1
bcf Giro1 ;PORTB1
como salida
bcf Giro2 ;PORTB2
como salida
bcf OPTION_REG,INTEDG ;interrupcion
por flanco de bajada
bcf OPTION_REG,NOT_RBPU ;habilita resistencias
pull-up
bcf STATUS,RP0
;accesa al banco 0
movlw b'10010000' ;habilita
la interrupcion externa
movwf INTCON
call LCD_Linea1 ;se
posiciona en la linea 1
movlw MensajeN ;Mensaje
de nombre y mat.
call LCD_Mensaje ;se
muestra en el LCD
call LCD_Linea2 ;se
posiciona en la linea 2
movlw Mensaje0 ;mensaje
de velocidad 0
call LCD_Mensaje ;lo
muestra en el LCD
;-CODIGO-PRINCIPAL-------------------------------------------------------------
Main
movf V_apagado,W ;mueve
lo que obtuvo de apagado en la
movwf Apaga ;interrupcion
movf V_encendido,W ;mueve
lo que obtuvo de encendido en la
movwf Enciende ;interrupcion
sublw .10 ;maximo de velocidad
btfsc STATUS,Z ;llego
a la velocidad maxima?
goto Cien ;si, ve a cien
movf Enciende,W ;lee
de nuevo la variable
sublw .0 ;para saber si no gira
btfsc STATUS,Z ;velocidad=0?
goto Cero ;si, ve a cero
btfsc VCambioG,0 ;ha
cambiado de sentido?
goto CambioGiro ;si,
cambia el sentido del giro
CicloEncendido
bsf Giro1 ;gira
hacia un lado
CambioGiro1
call Retardo_50micros ;espera
decfsz Enciende,F ;decrementa
la variable, llego a 0?
goto CicloEncendido+1 ;no,
ve a esperar de nuevo
goto CicloApagado ;si,
salta a apagado
CambioGiro
bsf Giro2 ;cambia
el giro
goto CambioGiro1 ;regresa
a ciclo de encendido
CicloApagado
bcf Giro1 ;apaga
esa salida
bcf
Giro2 ;apaga esa salida
call Retardo_50micros ;espera
decfsz Apaga,F ;decrementa
la variable, llego a 0?
goto CicloApagado+2 ;no,
espera de nuevo
goto Fin ;
Cien
btfss VCambioG,0 ;Cambio el bit?
goto Cambia100 ;si, cambia el sentido
bsf Giro2 ;no,
continúa en el mismo
goto Fin ;
Cambia100
bsf Giro1 ;ahora
gira en este sentido
goto Fin
Cero
clrf PORTB ; PORTB apagado
Fin goto
Main ;haz todo de nuevo
;INTERRUPCION------------------------------------------------
Interrupcion
call RS232_LeeDato ;tecla
presionada
movwf V_tecla ;la
guarda
call RS232_EnviaDato ;envía dato a la pc
movf V_tecla,w ;rutina
10
xorlw 'q' ;compara tecla
con q
btfsc STATUS,Z ;presiono
q?
goto Diez ;si
movf V_tecla,W ;no,
lee de nuevo
xorlw 'w' ;compara con w
btfsc STATUS,Z ;es
la tecla w?
goto Veinte ;si,
ve a 20
movf V_tecla,W ;
xorlw 'e' ;
btfsc STATUS,Z ;fue
la tecla e?
goto Treinta ;si,
ve a 30
movf V_tecla,W
xorlw 'r'
btfsc STATUS,Z ;fue
la tecla r?
goto Cuarenta ;si,
ve a 40
movf V_tecla,W
xorlw
't'
btfsc STATUS,Z ;presiono
t?
goto Cincuenta ;si,
ve 50
movf V_tecla,W
xorlw 'y'
btfsc STATUS,Z ;presiono y?
goto Sesenta ;si,
ve a 60
movf V_tecla,W
xorlw
'u'
btfsc STATUS,Z ;presiono
u?
goto Setenta ;si,
ve a 70
movf V_tecla,W
xorlw
'i'
btfsc
STATUS,Z ;presiono i?
goto Ochenta ;si, ve a 80
movf V_tecla,W
xorlw 'o'
btfsc STATUS,Z ;presiono o?
goto Noventa ;si,
ve a 90
movf V_tecla,W
xorlw
'p'
btfsc STATUS,Z ;presiono p?
goto Cien1 ;si, ve a 100
movf V_tecla,W
xorlw 'g'
btfsc STATUS,Z ;presiono g?
goto Girog ;si,
cambia el giro
movf V_tecla,W ;
xorlw 'h'
btfsc STATUS,Z ;presiono
h?
goto Giroh ;si,
cambia el giro
movf V_tecla,W ;rutina
cero
xorlw 'c'
btfss STATUS,Z ;presiono c?
goto FinInterrupcion ;no,
termina
Para
call LCD_Linea2 ;si, posicionate en la linea 2
movlw Mensaje0 ;mensaje vel. 0
call LCD_Mensaje ;muestra en el LCD
movlw .0 ;pone a 0 la
variable
movwf V_encendido
goto FinInterrupcion ;termina la interrupcion
Diez
call LCD_Linea2 ;se posiciona en la linea 2
movlw Mensaje10 ;mensaje vel. 10
call LCD_Mensaje ;muestra el mensaje
movlw .1 ;velocidad 10%
movwf V_encendido
movlw .9
movwf V_apagado
goto FinInterrupcion ;termina la interrupcion
Veinte
call LCD_Linea2
movlw Mensaje20 ;mensaje
de 20%
call LCD_Mensaje
movlw .2 ;velocidad 20%
movwf V_encendido
movlw .8
movwf V_apagado
goto FinInterrupcion
Treinta
call LCD_Linea2
movlw Mensaje30 ;mensaje
de 30%
call LCD_Mensaje
movlw .3 ;velocidad
de 30%
movwf V_encendido
movlw .7
movwf V_apagado
goto FinInterrupcion
Cuarenta
call LCD_Linea2
movlw Mensaje40 ;mensaje
de 40%
call LCD_Mensaje
movlw .4 ;velocidad
de 40%
movwf V_encendido
movlw .6
movwf V_apagado
goto FinInterrupcion
Cincuenta
call LCD_Linea2
movlw Mensaje50
call LCD_Mensaje
movlw .5
movwf V_encendido
movlw .5
movwf V_apagado
goto FinInterrupcion
Sesenta
call LCD_Linea2
movlw Mensaje60
call LCD_Mensaje
movlw .6
movwf V_encendido
movlw .4
movwf V_apagado
goto FinInterrupcion
Setenta
call LCD_Linea2
movlw Mensaje70
call LCD_Mensaje
movlw .7
movwf V_encendido
movlw .3
movwf V_apagado
goto FinInterrupcion
Ochenta
call LCD_Linea2
movlw Mensaje80
call LCD_Mensaje
movlw .8
movwf V_encendido
movlw .2
movwf V_apagado
goto FinInterrupcion
Noventa
call LCD_Linea2
movlw Mensaje90
call LCD_Mensaje
movlw .9
movwf V_encendido
movlw .1
movwf V_apagado
goto FinInterrupcion
Cien1
call LCD_Linea2
movlw Mensaje100
call LCD_Mensaje
movlw .10
movwf V_encendido
goto FinInterrupcion
Girog
bsf VCambioG,0 ;activa
bit para cambiar en este sentido
bcf Giro1 ;apaga
este sentido de giro
goto FinInterrupcion
Giroh
bcf VCambioG,0 ;desactiva bit para regresar el giro de inicio
bcf Giro2 ;apaga
el otro sentido de giro
FinInterrupcion
bcf INTCON,INTF ;vuelve a habilitar las interrupciones
retfie
; Librerias
----------------------------------------------------
INCLUDE <LCD_MENS.INC> ; Subrutina
LCD_MensajeMovimiento.
INCLUDE <LCD_4BIT.INC> ; Subrutinas de control del
LCD.
INCLUDE <RETARDOS.INC> ; Subrutinas de retardos.
INCLUDE <RS232.INC> ;subrutina
para comunicacion con la PC
END ;
Fin del programa.
CONCLUSIÓN:
El programa
tiene que hacer muchas comparaciones debido a que son 12 teclas que tiene que
estar evaluando. La interrupción debe de estar por flanco descendente y la
llamada para saber que tecla pulsó, debe estar dentro del servicio a la
interrupción. Así no estará verificando continuamente el pin de recepción para
el inicio de la comunicación con el RS232. Los retardos se tuvieron que bajar
de 100us a 50us, porque el motor tenía problemas con el pwm, ya que no estaba
girando al porcentaje especificado.
Espero les sea de utilidad.
1 comentario:
Snow Peak Titanium. S - TITanium-Arts
A Snow Peak in edc titanium Titanium-Arts at TITanium-Arts. We titanium studs have the best titanium chloride value and a guarantee that your order is for. We have it titanium ingot up titanium vs steel for grabs
Publicar un comentario