Módulo de captura de entrada PIC32

2

Estoy tratando de usar el módulo de captura de entrada en un PIC32MX250F128B para medir la frecuencia de una onda cuadrada. Los resultados que estoy obteniendo son inconsistentes e incorrectos. Todo lo que estoy tratando de hacer aquí es medir la frecuencia de la onda cuadrada de entrada leyendo el valor de captura en cada interrupción de flanco descendente. Luego reinicio el Timer2 y leo el valor de captura nuevamente en la siguiente interrupción.

Aquí está mi ISR:

void __ISR(_INPUT_CAPTURE_4_VECTOR, ipl1) Capture4(void) {
    mPORTBToggleBits(BIT_10);
    capture_value = IC4BUF; 
    mIC4ClearIntFlag();
    TMR2 = 0;
}

Aquí están mis configuraciones de módulo:

IC4Rbits.IC4R = 0;     // Assign peripheral pin RPA0 to IC4
mPORTASetPinsDigitalIn(BIT_0);
IC4CONbits.C32 = 0;    // 16-bit source timer
IC4CONbits.ICTMR = 1;  // Use Timer2
IC4CONbits.ICI = 0;    // Interrupt every capture event
IC4CONbits.ICM = 2;    // Simple Capture Event mode - every falling edge
IFS0bits.IC4IF = 0;    // Clear interrupt flag
IFS0bits.IC4IE = 1     // Enable IC interrupt
IFS0bits..IC4IP = 1;   // Set interrupt priority to 1
IC4CONbits.ON = 1;     // Enable IC module

T2CONbits.ON = 0;      // Disable while config
TCONbits.SIDLE  = 0;   // Continue in idle mode
TCONbits.TCS = 0;      // Use internal clock
TCONbits.TCKPS = 0;    // Set 1:1 prescale
TCONbits.TGATE = 0;    // Disable gated time accumulation
PR2 = 0xFFFF;          // set period register
TMR2 = 0;              // start counting at zero
T2CONbits.ON = 1;      // enable module

Notará que la primera línea del ISR alterna un pin de salida digital; Agregué esto para poder monitorear la actividad para ver si alguna vez se llamó la interrupción. La interrupción se llama y lo he visto en un osciloscopio. Yo esperaría que el ISR se llame de forma consistente en línea con los bordes descendentes de la onda cuadrada de entrada, pero este no es el caso. En cambio, el ISR se llama inconsistentemente en intervalos aparentemente aleatorios. Además, los valores que se leen de IC4BUF no se correlacionan en absoluto con ningún ajuste en la frecuencia de la señal de entrada.

Claramente me estoy perdiendo algo aquí. Si tiene alguna sugerencia o puede señalar algún error obvio que haya cometido, se lo agradecería enormemente. Además, estoy abierto a métodos alternativos para realizar la tarea de medir la frecuencia de entrada. Escogí esta ruta con la captura de entrada porque parecía tener más sentido. Gracias!

    
pregunta JBrown

1 respuesta

0

Marque este comando 'IFS0bits.IC4IE = 1' Aquí se debe utilizar el registro IEC0. IFS0 se usa para verificar los bits de bandera que se establecen cuando se produce alguna interrupción. Por lo tanto, modifique su comando de la siguiente manera: 'IEC0bits.IC4IE = 1'
(Si aún así no funciona, verifique en su hoja de datos la ubicación del bit IC4IE).

IFS0bits..IC4IP = 1 este comando también es incorrecto, debe utilizar el registro IPC0 para establecer la prioridad de la captura de entrada.

    
respondido por el kavya gupta

Lea otras preguntas en las etiquetas