Medir señal PWM externa

Hola.
Intento medir el duty cycle de una fuente externa, para ello quiero utilizar el módulo CCP con el temporizador TMR1. El procedimiento teórico a seguir lo conozco hasta cierto punto. Se trata de leer el tiempo transcurrido entre un flanco de subida y a continuación cuando llega el flanco de bajada y ya está. Mi problema viene cuando después de leer mucho en lo que encuentro en la red, no consigo enterarme de por qué hay que conectar en un pin un oscilador que controla el TIMER1 si ya existe, en este caso, uno conectado a la las entradas normales para un oscilador externo. Otra duda que no entiendo bien es como sincronizar el oscilador que controla el TMR1 y la señal PWM que viene por el CCP si las frecuencias pueden no ser iguales. ¿Cómo se sincronizan?.
Todo esto lo trato de hacer en mikroC aunque en pseudocódigo me serviría.
Si alguien me puede ayudar se lo agradecería.
Gracias de antemano.
 
es probable que ese oscilador sea la señal PWM que querés medir. No me acuerdo como funcionan los timers de microchip pero los timers suelen poder andar con reloj externo, entonces usando como reloj externo la señal a medir calculas el tiempo activo.
 
Hola

Los timers los puedes usar con un oscilador externo o interno. En este caso lo vas a usar interno porque no necesitas una frecuencia determinada para hacer "algo", por ejemplo, un temporizador en tiempo real con el cristal de 32.768khz.

Y bueno como dijiste, cuando vez el flanco de subida, interrumpes y arrancas el timer, cuando ves el flanco de bajada, apagas el timer. Ahora, si lo que quieres es arrancar el timer en el flanco de la subida de la señal para tener una medicion exacta pues.... no recuerdo si el pic trae esa facilidad, pero si no lo tuviera, lo que puedes hacer es sumarle el tiempo en que tarda en ingresar a la interrupcion y el tiempo que tarda en colocar el .Ton=1
 
Hola:

En ASM:
Código:
;Los módulos CCPx.
;Modo PWM. Modulación de anchura de pulsos.
;
;Consiste en generar una señal de onda cuadrada por la línea RC2/CCP1 cuyo periodo puede
;ser modificado así como la anchura del pulso (Duty Cycle). El periodo se determina según la 
;fórmula T=(PR2+1)*4*Tosc*TMR2 preescaler. La duración del pulso o "Duty Cycle" (d) se deter-
;mina según d=(CCPR1L:CCP1CON<5:4>)*Tosc*TMR2 preescaler.
;
;El ejemplo emplea al módulo CCP1 con salida de señal por la línea RC2/CCP1. La señal de 
;salida tiene un periodo determinado pora la constante "Periodo" y una anchura "Duty" 
;determinada por la constante "Duty". Un osciloscopio conectado en RC2/CCP1 puede ayudar
;a realizar las oportunas medidas. Nosotros hemos empleado el modelo PoScope Basic 2.

        List    p=16F886        ;Tipo de procesador
        include    "P16F886.INC"    ;Definiciones de registros internos

;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades

        __config    _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF    ;Palabra 1 de configuración
        __config    _CONFIG2, _WRT_OFF&_BOR40V                                    ;Palabra 2 de configuración

Periodo        equ    .250            ;Periodo de 1000 uS (250 * 4 de preescaler)
Duty        equ    .70                ;Anchura 280 uS (70 * 4 de preescaler)

            org    0x00            ;Vector de RESET    
            goto    Inicio    
            org    0x05

;Programa principal

Inicio          bsf        STATUS,RP0    
            bsf        STATUS,RP1    ;Banco 3
            clrf    ANSEL        
            clrf    ANSELH        ;Puertas A y B digitales
            bcf        STATUS,RP1    ;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

;El módulo CCP1 actúa en el modo PWM con salida de señal por RC2/CCP1

            movlw    b'00001100'
            movwf    CCP1CON

;El TMR2 trabaja con un preescaler 1:4 por lo que con una frecuencia de 4MHz evoluciona
;cada 4uS ((4*Tosc)*4)

            movlw    b'00000101'
            movwf    T2CON        ;T2 en On
    
Loop        nop
            goto    Loop        ;Bucle infinito        

            end                    ;Fin del programa fuente
En CCS:
Código:
/*
Los módulos CCPx.
Modo PWM. Modulación de anchura de pulsos.

Consiste en generar una señal de onda cuadrada por la línea RC2/CCP1 cuyo periodo puede
ser modificado así como la anchura del pulso (Duty Cycle). El periodo se determina según la 
fórmula T=(PR2+1)*4*Tosc*TMR2 preescaler. La duración del pulso o "Duty Cycle" (d) se deter-
mina según d=(CCPR1L:CCP1CON<5:4>)*Tosc*TMR2 preescaler.

El ejemplo emplea al módulo CCP1 con salida de señal por la línea RC2/CCP1. La señal de 
salida tiene un periodo determinado pora la constante "Periodo" y una anchura "Duty" 
determinada por la constante "Duty". Un osciloscopio conectado en RC2/CCP1 puede ayudar
a realizar las oportunas medidas. Nosotros hemos empleado el modelo PoScope Basic 2. */
    
#include <16f886.h>

/* Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades */

#fuses     NOLVP,PUT,NOWDT,EC_IO,NOFCMEN,NOBROWNOUT    //Palabra 1 de configuración
#fuses    NOWRT,BORV40                                //Palabra 2 de configuración

/* Con estas directivas las funciones "input" y "output_bit" no reprograman
el pin de la puerta cada vez que son utilizadas. Si no se indica el
modo fast_io se asume por defecto standard_io el cual reprograma el pin
siempre antes de ser utilizadas estas funciones. */

#use fast_io (C)

int    periodo=250;                            //Periodo de 1000 uS (250 * 4 de preescaler)
int duty=70;                                //Anchura 280 uS (70 * 4 de preescaler)

main()
{  
    SETUP_ADC_PORTS(NO_ANALOGS);            //Puertas A y B digitales
    output_c(0x00);                            //Borra las salidas
    set_tris_c(0xb1111011);                    //RC2 salida

//El módulo CCP1 actúa en el modo PWM con salida de señal por RC2/CCP1

    CCP_1_LOW=duty;            //Carga la anchura del pulso
    setup_ccp1(CCP_PWM);    //Modo PWM para el CCP1
    
/* El TMR2 trabaja con un preescaler 1:4 por lo que con una frecuencia de 4MHz evoluciona
cada 4uS (4*Tosc) */

    setup_timer_2(T2_DIV_BY_4,periodo-1,1);    //Carga el periodo

    while(1)
    {    
    }
}
 
Atrás
Arriba