¿Cómo configurar PWM a 125 KHz?

#1
Hola a todos, tengo la siguiente duda, necesito configurar el PIC 16f648a para que por su patilla CCCP1 correspondiente a PWM, obtenga una señal cuadrada una frecuencia de 125khz o lo que es lo mismo un periodo de 8us con un ciclo de trabajo del 50%, esto lo he conseguido pero el problema es que la tensión de salida es muy baja del orden de décimas de voltio, con lo cual no puedo excitar a la salida un driver mosfet TC4422.

La parte del programa que configura el pwm es la siguiente:

InicPwm movlw b'00000100'
movwf T2CON
movlw .39
movwf PR2
movlw b'00000100'
movwf T2CON
movlw (.39/.2)
movwf CCPR1L
clrf CCP1CON
return
Como el oscilador externo es de 20MHZ , haciendo calculos:
20Mhz/4= 5mhz , T=1/5Mhz=200ns, es decir cada conteo del timer 2 se produce cada 200ns , como tengo que usar un Tpwm=8us tendria que precargar en PR2 el valor 39 ya que 39*200ns=7,8us aprox 8us. y Tonpwm para que trabaje en un duty cycle del 50% ccpr1l le asigno el valor (.39/.2).
Bien con estos valores consigo una frecuencia de 125khz pero al ser Tonpwm 39/2 y no 255 (5v) la tension media que da ccp1 es de unas pocas décimas de voltio.
Resumiendo, mi pregunta es, como puedo tener una frecuencia de 125khz y una tension en ccp1 on entre 2,5v y 5v usando pwm que sea capaz de excitar el mosfet que va conectado a CCP1.

Muchisimas gracias de antemano a todos, si necesitáis alguna aclaración no dudeis en preguntarme.
 
#2
Me parece que no leíste bien la hoja de datos. (Sección 9.0 Capture/Compare/PWM CCP Module)
Ahí se explican muy bien las fórmulas para configurar el módulo CCP

Programa funcional generando PWM a una frecuencia de 125 KHz con Fosc = 20 MHz.
El ciclo activo se ha establecido al 50 %
PHP:
    list    p = 16f648a        ; Microcontrolador utilizado.
    include    p16f648a.inc    ; Incluir la librería del PIC16F648A
    ; Palabra de configuración:
    __config _HS_OSC & _PWRTE_ON & _WDT_OFF & _MCLRE_OFF & _LVP_OFF
    ; Fosc = Xtal @ 20 MHz.
    
    errorlevel -302            ; Suprimir mensajes de selección de bancos.


Reset
    org    0x00

Inicio
    bsf    STATUS,RP0            ; Seleccionar el Banco 1
    movlw    b'11110111'        ; RB3 (CCP1) como salida.
    movwf    TRISB
    movlw    0x27            ; Valor de configuración para el registro PR2
    movwf    PR2
    bcf    STATUS,RP0            ; Seleccionar el Banco 0
    movlw    0x04            ; Configuración para el Timer 2
    movwf    T2CON            ; Prescaler 1:1, Postescaler 1:1
    movlw   0x0C            ; Configuración del registro CCP1CON
    movwf    CCP1CON            ; CCP en modo PWM, Frecuencia = 125 KHz @ 20 MHz.
    movlw    0x14            ; Establecer el ciclo activo en 50 %
    movwf    CCPR1L

Programa
    goto $    ; Bucle infinito

    end
 
#3
Muchas gracias D@rkbytes, por tu respuesta, revisando el programa parece que he metido la pata en la selección del banco de memoria de Pr2 ya que pertenece al banco 1 , lo modificaré y lo probaré a ver si se resuelve el problema asi.
 

Arriba