Autor Tema: Control de PWM utilizando CCP 16F877A  (Leído 2161 veces)

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

Desconectado chacon2000

  • PIC10
  • *
  • Mensajes: 5
Control de PWM utilizando CCP 16F877A
« en: 21 de Octubre de 2017, 15:33:17 »
Hola, mucho gusto
soy nuevo en el foro y estoy muy confundido respecto al uso del CCP1 de este pic y con mas que busco en los foros solo me revuelvo mas
Lo que pasa es que me pidieron controlar un motor DC por medio de interrupciones en el CCP1 (yo se que este no tiene una interrupción como tal si no que usa la del timer2). Tengo un programa que genera el pwm pero no se como implementar la interrupción y en si la duda que tengo es:
1.-¿Que tipo de interrupcion podria realizar con el timer2?
Por que me gustaría que por ejemplo que cada 5 segundos se genere una interrupción para detener el motor y realizar otra acción o generar una interrupción donde cada cierto tiempo aumente el pwm al 90% y regrese al 50%.
O de plano estoy confundiendo el tipo de interrupción que se genera con el timer2?

Muchas gracias por su atención

Citar
List   p=16F877A      
include   "P16F877A.INC"   

__config _CP_OFF&_CPD_OFF&_LVP_OFF&_WDT_OFF&_XT_OSC

;PR2=[(4MHz)/(10KHz*4*1)]-1    usando un prescaler de 1 y oscilador de 4Mhz
;PR2=100-1
;PERIODO=[(100+1)*4*Tosc*Prescaler]
;PERIODO=101us=.000101
;Buscando un ciclo de la mitad el Duty seria de:
;Duty=.000050

Periodo      equ   .000101         ;100 uS
Duty      equ   .000050         ;50 uS

         org   0x00      
         goto   Inicio   
         org   0x05

;Programa principal

Inicio       clrf   PORTA
         clrf   PORTB
         clrf   PORTC      ;Borra salidas
         bsf      STATUS,RP0   ;Selecciona banco 1
         movlw   b'11111011'
         movwf   TRISC      ;RC2 salida
         movlw   Periodo-1
         movwf   PR2         ;Carga el registro de periodos
         bcf      STATUS,RP0   ;Selecciona banco 0
         movlw   Duty
         movwf   CCPR1L      ;Carga la anchura del pulso

;Configura el modo PWM-----------------

         movlw   b'00001100'
;                     11xx= modo PWM   
         movwf   CCP1CON
;--------------------------------------


;Preescaler de 1:1 por lo tanto con una frecuencia de 4MHz evoluciona:
;cada 1uS (4*Tosc)

         movlw   b'00000100'
                    ; ------00= Prescaler de 1
                    ; -----1--= Timer2 activado
          movwf   T2CON      ;T2 en On
   
Loop      nop
         goto   Loop      ;Bucle infinito      

         end               
« Última modificación: 22 de Octubre de 2017, 14:30:54 por chacon2000 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Control de PWM utilizando CCP 16F877A
« Respuesta #1 en: 21 de Octubre de 2017, 17:05:51 »
No se que interrupcion genera el CCP en modo PWM (tal ves cuando termine cada ciclo), el problema es que no vas a poder usar el Timer2 para crear ese tiempo. Ya que este nunca se va a producir el overflow (cuando pasa de 0xFF a 0x00)  por estar trabajando con el CCP. Es decir el TMR2 jamas va a tener su flag activo.

Para el tiempo que estas pensando, y para que se vea, vas a tener que usar otro timer, por lo que decis son 5 segundos, entonces lo mejor es usar el Timer1 que es de 16bits, y requeris menos interrupciones para llegar a esos segundos. Y dejas el TMR2 + CCP funcionando para unicamente el PWM.

Desconectado chacon2000

  • PIC10
  • *
  • Mensajes: 5
Re:Control de PWM utilizando CCP 16F877A
« Respuesta #2 en: 22 de Octubre de 2017, 14:27:42 »
Se puede usar el modulo PWM con otro timer que no sea timer2?
por que si uso el timer1 ya no estaría usando como tal el modulo PWM si no el comparador o captura y en la escuela me pidieron programar el PWM solamente.
« Última modificación: 22 de Octubre de 2017, 14:34:53 por chacon2000 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Control de PWM utilizando CCP 16F877A
« Respuesta #3 en: 22 de Octubre de 2017, 19:22:24 »
No el CCP utiliza para el PWM el TMR2 unicamente.

Te quedan 2 opciones:

- En tu loop principal, leer un boton, cuando sea presionado, activar el PWM hacerlo pasar por una demora de 1s por ejemplo, y aumentar el PWM, asi 5 veces (asi llegamos a los 5s ) y detener el PWM, y volver a leer el boton. Si haces mas pequeño el delay, podes hacer que aumente en pasos mas pequeños el duty del PWM.

- La otra que te queda es intentar definir un "periodo" entero, y ver si el flag de interrupcion del CCP se activa, de esa forma si tu periodo es de 10ms por ejemplo, y necesitas esperar 5s, contas 5s/10ms = 500 interrupciones, para saber que pasaron los 5s.
Esto supuestamente si es que el flag se activa. Ahora no veo sentido el porque no te permite usar CCP+TMR2 para el PWM y un TMR1 para cualquier "tiempo" que quieras dar.


En resumen, si solo queres usar el CCP+TMR2, entonces la primera opcion es la que debes seguir. Pero no utilizarias interrupciones.


 

anything