PIC32-Eingangserfassungsmodul

Ich versuche, das Eingangserfassungsmodul eines PIC32MX250F128B zu verwenden , um die Frequenz einer Rechteckwelle zu messen. Die Ergebnisse, die ich erhalte, sind sowohl inkonsistent als auch falsch. Alles, was ich hier versuche, ist, die Frequenz der Eingangsrechteckwelle zu messen, indem ich den Erfassungswert bei jedem Interrupt mit fallender Flanke auslese. Dann setze ich Timer2 zurück und lese den Capture-Wert beim nächsten Interrupt erneut.

Hier ist mein ISR:

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

Hier sind meine Modulkonfigurationen:

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

Sie werden feststellen, dass die erste Zeile des ISR einen digitalen Ausgangspin umschaltet; Ich habe dies hinzugefügt, damit ich die Aktivität überwachen kann, um zu sehen, ob der Interrupt jemals aufgerufen wurde. Der Interrupt wird aufgerufen und ich habe ihn auf einem Oszilloskop betrachtet. Ich würde erwarten, dass die ISR konsistent mit den fallenden Flanken der Eingangsrechteckwelle aufgerufen wird, aber dies ist nicht der Fall. Stattdessen wird die ISR in scheinbar zufälligen Abständen uneinheitlich aufgerufen. Außerdem korrelieren die von IC4BUF gelesenen Werte überhaupt nicht mit Anpassungen an der Frequenz des Eingangssignals.

Hier fehlt mir eindeutig etwas. Wenn Sie Vorschläge haben oder auf offensichtliche Fehler hinweisen können, die ich gemacht habe, wäre ich Ihnen sehr dankbar. Außerdem bin ich offen für alternative Methoden, um die Aufgabe der Messung der Eingangsfrequenz zu erfüllen. Ich habe mich für diesen Weg mit dem Input Capture entschieden, weil er mir am sinnvollsten erschien. Danke!

Welchen Frequenzbereich möchten Sie messen und wie hoch ist die Taktrate Ihres PIC?
Ist capture_value als flüchtig deklariert?
Der PIC taktet mit 48 MHz. Ich rechne mit Eingängen im Bereich von 0,1 - 100 KHz
@RogerRowland, ja, ich habe versucht, capture_value als flüchtig zu deklarieren, keine Änderung

Antworten (1)

Überprüfen Sie diesen Befehl: IFS0bits.IC4IE = 1. Hier IEC0sollte das Register verwendet werden, IFS0um die Flag-Bits zu überprüfen, die gesetzt werden, wenn ein Interrupt auftritt. Ändern Sie also Ihren Befehl wie folgt:

IEC0bits.IC4IE = 1

(Wenn es immer noch nicht funktioniert, überprüfen Sie Ihr Datenblatt auf die Position des IC4IEBits.)

IFS0bits..IC4IP = 1: Dieser Befehl ist auch falsch, Sie müssen IPC0das Register verwenden, um die Priorität des Input Capture festzulegen.