viernes, 23 de mayo de 2014

CONTROL SERIAL DE PWM Y CAMBIO DE GIRO MOTOR PIC16F84A

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:

bairdladuca dijo...

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