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!
Überprüfen Sie diesen Befehl: IFS0bits.IC4IE = 1
. Hier IEC0
sollte das Register verwendet werden, IFS0
um 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 IC4IE
Bits.)
IFS0bits..IC4IP = 1
: Dieser Befehl ist auch falsch, Sie müssen IPC0
das Register verwenden, um die Priorität des Input Capture festzulegen.
brhans
Roger Rowland
JBraun
JBraun