TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: raul1485 en 25 de Mayo de 2007, 18:02:39
-
Hola a todos en este foro, mi problema es el siguiente estoy utilizando el PIC16f877 configurando los dos pwm, he buscado por todos lados de como defasar los dos pwm, ya que cuando configuro los dos pwm y asigno cierto Ciclo de trabajo (CT) para cada uno, los dos CT de los pwm empiezan al mismo tiempo, lo que quiero lograr es que primero empiece el CT del PWM1 despues de un tiempo corto Empiece el CT del PWM2 y posteriormente empice nuevamente le ciclo.
En Pocas Palabras DEFASAR un PWM con respecto al otro.
Aqui les dejo el programa para ver si me pueden ayudar:
Si tienen alguna idea la pueden exponer aqui: gracias
list p=16f877A
#include<p16f877A.inc>
__CONFIG _CP_OFF & _CPD_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _LVP_OFF & _XT_OSC
;Parámetros para eliminar los mensajes de warning cuando lo ensamblas
ERRORLEVEL -302 ;suppress "not in bank 0" message
ERRORLEVEL -203 ;suppress message
ERRORLEVEL -305 ;suppress message
ERRORLEVEL -205 ;suppress message
CTH EQU 22H
CTL EQU 23H
CTH2 EQU 3AH
CTL2 EQU 3BH
ORG 00H
INICIO:
NOP
NOP
BSF STATUS,RP0 ;BANCO 1
CLRF TRISB
CLRF TRISC
CLRF TRISA
MOVLW 0FFH
MOVWF TRISD
CLRF TRISE
MOVLW 0FFH ;CARGA PERIODO
MOVWF PR2
BCF STATUS,RP0 ;BANCO 0
CLRF CCPR1L ;INICIALIZA CICLO DE TRABAJO CON 0 PWM1
BCF CCP1CON,CCP1X
BCF CCP1CON,CCP1Y
CLRF CCPR2L ;INICIALIZA CICLO DE TRABAJO CON 0 PWM2
BCF CCP2CON,CCP2X
BCF CCP2CON,CCP2Y
MOVLW 05H ;CONFIGURA TIMER2
MOVWF T2CON ;PREESCALADOR 1/4,HABILITA TIMER2
BSF CCP1CON,CCP1M3 ;CONFIGURA EL MODULO CCP1 PARA OPERACION PWM
BSF CCP1CON,CCP1M2
BSF CCP2CON,CCP2M3 ;CONFIGURA EL MODULO CCP2 PARA OPERACION PWM
BSF CCP2CON,CCP2M2
MOVLW 0AH
MOVWF CTL ;INICIALIZA CT DE 10 BITS EN 0AH
CLRF CTH
MOVLW 0AH
MOVWF CTL2
CLRF CTH2
START:
;PWM1
MOVF CTL,W
MOVWF CCPR1L ;ACTUALIZA PARTE BAJA DEL CT REAL
;A CONTINUACION ACTUALIZA PARTE ALTA DEL CT REAL
MOVLW 0CFH ;MASCARA
ANDWF CCP1CON,1 ;LIMPIA LOS DOS MSBITS DEL CT REAL
MOVLW 03H ;MASCARA
ANDWF CTH,1 ;LIMPIA LOS 6 BITS ALTOS EN CTH
SWAPF CTH,W ;COPIA LOS 2 BITS BAJOS DE CTH EN EL NIBBLE ALTO D W
IORWF CCP1CON,1 ;PONE BITS QUE DEBEN SER 1 EN LOS DOS MSB DEL CT REAL
;PWM2
MOVF CTL2,W
MOVWF CCPR2L ;ACTUALIZA PARTE BAJA DEL CT REAL
;A CONTINUACION ACTUALIZA PARTE ALTA DEL CT REAL
MOVLW 0CFH ;MASCARA
ANDWF CCP2CON,1 ;LIMPIA LOS DOS MSBITS DEL CT REAL
MOVLW 03H ;MASCARA
ANDWF CTH2,1 ;LIMPIA LOS 6 BITS ALTOS EN CTH
SWAPF CTH2,W ;COPIA LOS 2 BITS BAJOS DE CTH EN EL NIBBLE ALTO D W
IORWF CCP2CON,1 ;PONE BITS QUE DEBEN SER 1 EN LOS DOS MSB DEL CT REAL
GOTO START
END
-
Hola compañero, creo que lo que pretendes hacer desde el programa no será posible, pues al parecer el micro arranca el pwm con el sincronizmo del reloj interno, pues recuerda que este pwm se basa en un timer interno, lo que te recomiendo es que uses un hardware externo, algo como colocar COLOCAR UN FLIP-FLOP tipo D; una salida de un timer que de el tiempo que deseas desfasar y por la entrada D colocas la señal del pwm a desfasar, en la salida Q tendrás una señal desfasada en el tiempo determinado por el timer; este timer puedes hacerlo externo ó con el mismo micro.
Espero te sea de utilidad y puedas usar hardware externo en tu aplicación.
-
Coincido con proteus... el problema es que si usas un PWM por hardware en el 16F877A ambos usan el TMR2 como referencia. Solo puedes cambiar el duty cycle de uno y otro PWM pero no su frecuencia en forma independiente la cual será la misma en ambos casos.
En este pic solo te queda hacerlo por software o bien usar una RED RC como filtro pasabajo y retraso de fase... pero esto es dependiente de la frecuencia.
Saludos
-
Hola. El pic posee dos patas con pwm. Estas patas comparten el generador de clock (utilizando el timer2). En pocas palabras, ambas patas van a tener SIEMPRE la misma frecuencia. Lo unico que podes cambiar es el tiempo que esten en "1" o en "0" (el famoso duty time como dicen arriba).
La idea de poner un FF es buena, pero si no queres agragar circuiterio, y si tenes libre el timer 0 o el 1 preferentemente, podrias "crear" un pwm mediante interrupciones con timer, y el otro dejarlo funcionando con el modulo PWM del pic.
Espero ser de ayuda. Saludos. :mrgreen: