Autor Tema: Manipular dos moters dc con pwm del pic16f877  (Leído 4460 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Nara Shikamaru

  • PIC10
  • *
  • Mensajes: 14
Manipular dos moters dc con pwm del pic16f877
« en: 20 de Febrero de 2007, 19:25:00 »
Hola Amigos, esta es mi primera vez aqui y ademas mi primera vez trabajando con los pic, tengo un problemon, necesito realizar un programa en lenguaje ensamblador, para el PIC 16f877, que realice lo siguiente:

""Con 2 pulsadores como entrada al PIC, que uno aumente y el otro disminuya la velocidad de un motor DC utilizando PWM con el pic18f877""

yo se hacer eso con electronica analogica a punta de transistores pero ahora estoy empezando una materia en la universidad llamada Microcontroladores y este es el primer problema sencillo, segun el prof. es un ejercicio de prueba para que nos acostumbremos a trabajar con el pic, sinceramente les agradezco de sobre manera que me puedan guiar para ir adentrandome en este interesante mundo...sin mas que decir me despido de ustedes, un saludo desde Venezuela. Reinaldo Mendez.

Desconectado Nara Shikamaru

  • PIC10
  • *
  • Mensajes: 14
Re: Manipular dos moters dc con pwm del pic16f877
« Respuesta #1 en: 23 de Febrero de 2007, 12:16:06 »
Hola Colegas!...Ya he ido desarrollando el programa para la manipulacion de la velocidad del motor mediante PWM, aqui les muestro el programa que hice, les ruego que lo vean y me digan si lo puedo optimizar o si le falta algo, espero sus respuestas, gracias.


;*              Este programa utilizando un PIC16F877
;*              Controla el ciclo de trabajo de la salida PWM
;*    (Patita CCP1) del PIC con la cual controlará la velocidad de un motor DC                 
;*    Se usa un botón conectado a RB0 para incrementar la velocidad y                 
;*     Otro conectado a RB1 para disminuirla.                                                           
;*     Se supone un cristal de 14.7456 Mhz
;*              Reinaldo Mendez
;*      Ingeniería Electrónica
;*     Instituto Universitario Politécnico “Santiago Mariño”                                                               
;*****************************************************************

cont    EQU         0x20
cont1    EQU         0x21
CTH    EQU         0x22
CTL    EQU         0x23
   org         0x0000
inic    BSF         STATUS, RP0       ; Banco1
   BSF         TRISB, 0       ; Configura RB0 como entrada
   BSF         TRISB, 1       ; Configura RB1 como entrada
   MOVLW          0xFF          ; carga periodo
   MOVWF          PR2          ; lo establece para el PWM
   BCF        TRISC, 2       ; patita RC2/CCP1 como salida
   BCF        STATUS, RP0       ; Banco 0
   CLRF        CCPR1L       ; inicializa Ciclo de trabajo en cero
   BCF        CCP1CON, CCP1X
   BCF        CCP1CON, CCP1Y
   MOVLW         0x04          ; configura Timer 2
   MOVWF         T2CON          ; preescalador 1/1, habilita Timer 2
   BSF       CCP1CON, CCP1M3    ; Configura el modulo CCP1 para
                                                                                ; Operación PWM
   BSF               CCP1CON, CCP1M2
                                                                                ; En este punto la salida PWM
                                                                                ; tiene un Ciclo de trabajo CT=0
   CLRF         CTL          ; inicializa CT de 10 bits en cero
   CLRF             CTH

Esp0    BTFSC           PORTB, 0       ; Checa Botón RB0
   CALL             incre          ; si está presionado incrementa CT
Esp1    BTFSC           PORTB, 1       ; si no se ha presionado Checa botón RB1
   CALL             decre          ; si está presionado Decrementa CT
   MOVF            CTH, W          ; si no se ha presionado obtiene copia de                                                      ; CT parte alta
   MOVWF         CCPR1L       ; actualiza parte alta del CT real
               ; A continuación actualiza la parte alta del                                                      ; CT real
   MOVLW         0xCF          ; máscara
   ANDWF         CCP1CON, 1       ; limpia los dos msbits del CT real
   MOVLW         0x03          ; máscara
   ANDWF         CTL, 1          ; limpia los 6 bits altos en CTL
   SWAPF         CTL, W          ; copia los 2 bits bajos de CTL en el nibble                                                      ; alto de W
   IORWF          CCP1CON, 1       ; pone bits que deben ser 1 en los dos msb                                                      ; del CT real
               ; Con esto queda actualizada la parte baja                                                      ; del CT real
   CALL            pau          ; pausa para moderar la velocidad de                                                      ; incremento/decremento
   GOTO          Esp0          ; repite

incre    INCF            CTL, 1          ; incrementa parte baja de la copia de                                                      ; CT
   MOVF           CTL
   ANDWF         0x04
   BTFSC          STATUS, Z      ; ¿El bit 2 de CTH es cero?
   
   RETURN             ; si no, retorna
   CLRF            CTL
   INCF            CTH, 1         ; si se hizo cero incrementa parte alta                                                      ; de CT y limpia la parte baja.
   RETURN
decre    DECF           CTL,1          ; decrementa parte baja de la copia de                                                      ; CT
   COMF           CTL, W          ; copia negado de CTL a W (para ver si                                                      ; CTL=0xFF)
   BTFSS          STATUS, Z       ; checa si W es cero
   RETURN             ; si no, retorna
   DECF           CTH, 1          ; si sí, Decrementa parte alta de CT
   MOVF           CTL
   ANDWF         0x03
   MOVWF        CTL         ; Borra 6 bits más significativos de CTL
   RETURN

pau    CLRF           cont1          ;** pausa de 50 miliseg. Aproximadamente
   CLRF           cont
p1    DECFSZ      cont,1
   GOTO          p1
   DECFSZ      cont1, 1
   GOTO          p1
   RETURN
   end


Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Manipular dos moters dc con pwm del pic16f877
« Respuesta #2 en: 24 de Febrero de 2007, 02:48:19 »
ya lo has simyulado en proteus para ver si funciona la etapa digital?  :-/
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado Nara Shikamaru

  • PIC10
  • *
  • Mensajes: 14
Re: Manipular dos moters dc con pwm del pic16f877
« Respuesta #3 en: 02 de Marzo de 2007, 10:48:34 »
Epale que mas micro cadaver, no conozco el proteus, descargue la version demo de la pagina pero todavia no lo he aprendido a usar, el asunto es que yo soy nuevo en este mundo de los pic, por eso publique mi programa y solicite uqe me ayudaran, ustedes que saben full sobre los pic pues que le dieran una ojeada y me dijeran si esta bien o si se puede optimizar, yo el programa lo desarrolle pues con los conociemientos que tengo de programacion y las instrucciones y direccionamientos los saque de la datasheet del pic16f877, te agradezco a ti y a todos los de este foro si me pueden echar una mano viendo mi programa, de todas maneras ya estoy metido de cabeza leyendo todas las demas aplicaiones y proyectos del foro. gracias, saludos desde venezuela

Código: [Seleccionar]
;*     Este programa utilizando un PIC16F877
;*     Controla el ciclo de trabajo de la salida PWM
;*     (Patita CCP1) del PIC con la cual controlará la velocidad de un motor DC                 
;*     Se usa un botón conectado a RB0 para incrementar la velocidad y                 
;*     Otro conectado a RB1 para disminuirla.                                                           
;*     Se supone un cristal de 14.7456 Mhz
;*     Reinaldo Mendez
;*     Ingeniería Electrónica
;*     Instituto Universitario Politécnico “Santiago Mariño”                                                               
;*****************************************************************

cont      EQU         0x20
cont1    EQU         0x21
CTH      EQU         0x22
CTL      EQU         0x23
            org         0x0000
inic       BSF         STATUS, RP0       ; Banco1
            BSF         TRISB, 0       ; Configura RB0 como entrada
            BSF         TRISB, 1       ; Configura RB1 como entrada
            MOVLW          0xFF          ; carga periodo
            MOVWF          PR2          ; lo establece para el PWM
            BCF        TRISC, 2       ; patita RC2/CCP1 como salida
            BCF        STATUS, RP0       ; Banco 0
           CLRF        CCPR1L       ; inicializa Ciclo de trabajo en cero
           BCF        CCP1CON, CCP1X
           BCF        CCP1CON, CCP1Y
           MOVLW         0x04          ; configura Timer 2
           MOVWF         T2CON          ; preescalador 1/1, habilita Timer 2
           BSF       CCP1CON, CCP1M3    ; Configura el modulo CCP1 para
                                                                                ; Operación PWM
           BSF               CCP1CON, CCP1M2
                                                                                ; En este punto la salida PWM
                                                                                ; tiene un Ciclo de trabajo CT=0
           CLRF         CTL          ; inicializa CT de 10 bits en cero
           CLRF             CTH

Esp0    BTFSC           PORTB, 0       ; Checa Botón RB0
           CALL             incre          ; si está presionado incrementa CT
Esp1    BTFSC           PORTB, 1       ; si no se ha presionado Checa botón RB1
           CALL             decre          ; si está presionado Decrementa CT
           MOVF            CTH, W          ; si no se ha presionado obtiene copia de
                                                      ; CT parte alta
           MOVWF         CCPR1L       ; actualiza parte alta del CT real
                                                 ; A continuación actualiza la parte alta del
                                                      ; CT real
           MOVLW         0xCF          ; máscara
           ANDWF         CCP1CON, 1       ; limpia los dos msbits del CT real
           MOVLW         0x03          ; máscara
           ANDWF         CTL, 1          ; limpia los 6 bits altos en CTL
           SWAPF         CTL, W          ; copia los 2 bits bajos de CTL en el nibble
                                                      ; alto de W
           IORWF          CCP1CON, 1       ; pone bits que deben ser 1 en los dos msb
                                                      ; del CT real
                                                 ; Con esto queda actualizada la parte baja
                                                  ; del CT real
           CALL            pau          ; pausa para moderar la velocidad de
                                                      ; incremento/decremento
           GOTO          Esp0          ; repite

incre    INCF            CTL, 1          ; incrementa parte baja de la copia de
                                                      ; CT
           MOVF           CTL
           ANDWF         0x04
           BTFSC          STATUS, Z      ; ¿El bit 2 de CTH es cero?
   
           RETURN             ; si no, retorna
           CLRF            CTL
           INCF            CTH, 1         ; si se hizo cero incrementa parte alta
                                                     ; de CT y limpia la parte baja.
           RETURN
decre    DECF           CTL,1          ; decrementa parte baja de la copia de
                                                     ; CT
           COMF           CTL, W          ; copia negado de CTL a W (para ver si
                                                     ; CTL=0xFF)
           BTFSS          STATUS, Z       ; checa si W es cero
           RETURN             ; si no, retorna
           DECF           CTH, 1          ; si sí, Decrementa parte alta de CT
           MOVF           CTL
           ANDWF         0x03
           MOVWF        CTL         ; Borra 6 bits más significativos de CTL
           RETURN

pau     CLRF           cont1          ;** pausa de 50 miliseg. Aproximadamente
          CLRF           cont
p1       DECFSZ      cont,1
          GOTO          p1
          DECFSZ      cont1, 1
          GOTO          p1
          RETURN
          end


Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Manipular dos moters dc con pwm del pic16f877
« Respuesta #4 en: 03 de Marzo de 2007, 01:34:09 »
jejej el proteus es la herramienta mas versatil para depurar tu codigo escrito en un microcontrolador, en este caso par aun pic 16f877, en este soft puedes implementar toda la etapa digital del pic incluso la analoga.

aca una imagen


puedes cargar su programa y simularlo en este potente soft. para aprender a usarlo no hay mejor manera q con los videos tutoriales q son gratis y los puedes encontrar aqui http://proyectosfie.com/html/seccion9.htm la pagina de un amigo compatriota peruano yoel ocmin tambien es del foro. me gustaria q lo sigas intetntando por tu cuenta, pero si ya tiras la toalla nos avisas por aca nomas pa seguir apoyandote!!!  :-/
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com


 

anything