Hallo,
hat jemand Erfahrung mit dem Input Capture Modul beim PIC24?? Ich möchte mit einem PIC24 die Herzfrequenz messen. Als Eingangssignal habe ich ein digitales Signal mit einem High-Pegel pro Herzschlag. Ich muss für die Bestimmung der Herzfrequenz also nur die Periodendauer des Eingangssignals messen. Da die Herzfrequenz bis auf Werte von minimal 40-45 Schläge pro Minute absinken kann, muss ich also eine Dauer von deutlich über einer Sekunde messen können.
Ich betreibe den PIC24FJ256GB106 mit einem externen 8 MHz Quarz und mit 32MHz intern. Wenn ich das Input Capture Modul mit einem 16 bit Zähler nutze und bspw. timer2 mit maximalem Prescaler von 256, dann kann ich also eine maximale Dauer von (1/(32MHz/256))*2*65535=1,04856s messen was einer Frequenz von ca 57,2 entspricht. Um niedrigere Frequenzen messen zu können, muss ich das Input Capture Modul also im Cascaded 32bit Modus nutzen und 2 Module synchron betreiben (IC1 und IC2).
Allerdings werde ich aus der Initialisierungssequenz im Datenblatt nicht ganz schlau. Ich habe mich beim setzen der Bits in ICxCON1/2 und ICyCON1/2 an die dort beschriebene Reihenfolge gehalten, aber so wie ich das sehe, läuft trotzdem nur das Modul (IC1), dass das LSW des 32 bit Wertes liefert.
Ausserdem habe ich versucht nur IC1 im Synchronen Modus zu betreiben. Da sollte doch eigentlich der Zähler nach jedem Event am IC1 Pin zurück gesetzt werden oder? Wenn ich da ein Signal von ca 1,2 Hz anlege und den Wert aus dem IC1BUF auslese, wäre doch eigentlich bei jedem Capture Event der gleiche Zählerwert zu erwarten oder? Ich bekomme aber durchlaufende Zählerwerte?
Ich habe den Eindruck, dass die Module nicht so initialisert werden, wie ich das eigentlich möchte. Der Code für zum setzen der Bits in ICxCON1/2 sieht für 16 bit Synchron so aus:
IC1CON1L = 0x00; //turn off(reset) capture module
IC1_32 = 1; //IC32 for IC2
IC1CON1H = 0x04; //ICTSEL for IC1 (timer2)
IC1CON2L = 0x54; //set SYNCSEL and ICTRIG bits for IC1
IC1CON1L = 0x03; //set capture mode of IC1 to capture on every rising edge (enable IC1)
Für 32bit synchron so:
IC1CON1L = 0x00; //turn off(reset) capture module
IC2CON1L = 0x00; //turn off(reset) capture module
IC2_32 = 1; //IC32 for IC2
IC1_32 = 1; //IC32 for IC1
IC2CON1H = 0x04; //ICTSEL for IC2 (timer2)
IC1CON1H = 0x04; //ICTSEL for IC1 (timer2)
IC2CON2L = 0x54; //set SYNCSEL and ICTRIG bits for IC2
IC1CON2L = 0x54; //set SYNCSEL and ICTRIG bits for IC
IC2CON1L = 0x03;
IC1CON1L = 0x03 //set capture mode of IC1 to capture on every rising edge (enable IC1)
In der Main Funktion initialisiere und starte ich dann zuerst timer2 und dann kommt die Sequenz oben. Was läuft da falsch?? Im Datenblatt steht was von "enable the selected trigger/sync source". Was ist damit gemeint? Ich verwende das Input Capture Modul 1 (IC1) als sync source. Wie aktiviere ich das modul? Zum deaktivieren kann man in IC1CON ICM2:ICM0=000 setzen. Aktivert das setzen dieser Bits dann das Modul
Ziemlich viele Fragen... Wäre super wenn da jemand schon Erfahrung mit dem IC-Modul hätte und mir auf die Sprünge helfen könnte.
Schöne Grüße
Flo
Edit: Bitte Code-Tags verwenden.
Bernd