Mein Freund und ich möchten eine universelle lernende Fernbedienung wie diese für Lernzwecke entwerfen . Grundsätzlich wollen wir Infrarot-Impulse speichern und wiedergeben.
Wir wollen 36kHz-, 38kHz- und 40kHz-Signale erkennen. Ein 40kHz - Signal wird über einen Zeitraum von 25 hat s.
Wir möchten einen 8-Bit-PIC-Mikrocontroller verwenden, für den wir PIC16F616 ausgewählt haben, der mit einem 20-MHz-Hochgeschwindigkeits-Quarzoszillator betrieben wird. Wir haben zwei Möglichkeiten:
- Verwenden Sie das
Interrupt On Change
Modul. - Verwenden Sie den Erfassungsmodus des CCP-Moduls.
Die erste Option lautet wie folgt:
Angenommen , ein Register gesetzt als: unsigned char _10_us = 0;
. Dieses Register enthält die Uhrzeit. TMR2 Modul mit Periodenregister gesetzt ist ein Interrupt alle 10 bis schaffen sec. Wenn ein Interrupt auftritt, erhöht er das Register und verlässt es. Dies ergibt eine maximale Zeit von 2,55 ms. Wenn mehr Zeitmessung benötigt wird, können zusätzliche Register definiert und nach Bedarf erhöht werden._10_us
_1_ms
Jedes Mal, wenn eine Unterbrechung durch eine Änderung (von hoch nach niedrig oder von niedrig nach hoch) erzeugt wird, notiert das Programm die aktuelle Zeit, dh den Wert des _10_us
Registers. Nach einer Weile, wenn der nächste Interrupt erzeugt wird, subtrahiert das Programm den gespeicherten Wert vom _10_us
Register und somit die zwischenzeitlich abgelaufene Zeit mit einer Einheit von 10 .
Diese Option lässt mich meinen Kopf kratzen; TMR2-Interrupt tritt etwa alle 50 Anweisungen auf. Für die Interrupt-Behandlung werden ca. 20 Anweisungen benötigt. Ich habe noch 30 Anweisungen, um den Zeitraum zu berechnen und in einem Array zu speichern. Funktioniert diese Methode?
Die zweite Option lautet wie folgt:
Richten Sie den Erfassungsmodus des CCP-Moduls so ein, dass ein Interrupt generiert wird, wenn ein Ereignis (High-to-Low) am CCP1-Pin auftritt. In der Interruptroutine wird ein Flag gesetzt, damit eine Task im Programm (falls erforderlich) den Wert von CCPR1H (wahrscheinlich nicht erforderlich) und CCPR1L berechnen und speichern kann. Dann werden wir die Konfiguration des Erfassungsmodus so ändern, dass er den Interrupt auslöst, wenn eine Low-to-High-Flanke auftritt. Und dann wird es auf das nächste Ereignis warten. Ich kann die Leistung dieser Methode nicht einschätzen, da ich sie nie verwendet habe.
Andere Option?
Wir können einen Infrarot-Demodulator-IC wie die TSOP17xx- Serie verwenden. Das würde unser Problem komplett lösen. Es kommen jedoch einige Fragen in den Sinn.
Unsere Anforderung an die Lesedistanz ist nicht viel. 1 Meter. Wenn wir einen TSOP1738 auswählen, der in 38 kHz arbeiten soll, wie gut funktioniert dies mit 36 kHz- und 40 kHz-Signalen?
Seite 4 des Datenblattes der TSOP17xx-Serie zeigt das Diagramm "Frequenzabhängigkeit der Empfindlichkeit". Soweit wir verstanden haben;
- 40 kHz, dh 1,053 von 38 kHz, ergeben eine relative Empfindlichkeit von 0,6.
- 36 kHz, dh ~ 0,95 von 38 kHz, ergeben eine relative Empfindlichkeit von ~ 0,65.
Was bedeuten diese Werte? Können wir ein TSOP1738 verwenden und in Ordnung sein?
quelle
Antworten:
Sorgen Sie sich nicht um die Leistung des PIC. Der TSOP1738 gibt das 38-kHz-Signal nicht aus. Das ist die Trägerfrequenz, die vom TSOP1738 entfernt wird, um das Basisbandsignal mit einer viel niedrigeren Frequenz und einer Pulsdauer in der Größenordnung von 1 ms zurückzugewinnen. Es bleibt also viel Zeit, um die Zeit zwischen den Flanken genau zu messen.
Die folgenden Oszilloskopbilder veranschaulichen dies:
Dies ist ein RC5-Code. Das obere Signal ist das 36 kHz modulierte Signal, das untere das Basisbandsignal mit dem aktuellen Code.
Dies wird auf einen Impuls des Basisbandsignals hineingezoomt. Sie sehen einzelne Impulse des 36-kHz-Trägers.
Noch ein Wort zur Trägerfrequenz. Möglicherweise verwenden Sie eine Fernbedienung, deren Frequenz Sie nicht kennen. Die TSOP1738 gibt es nicht an seinem Ausgang, so dass , wenn Sie es lesen wollen , erhalten Sie eine IR - Photodiode oder Transistor in einem der PIC - Eingänge anschließen müssen und die Zeit zwischen zwei Lese gleichen Kanten. Das ist machbar. Periodenzeiten für verschiedene Trägerfrequenzen:
40 kHz: 25 us
38 kHz: 26,3 us
36 kHz: 27,8 us
Ein 20-MHz-PIC16F616 hat einen Befehlszyklus von 200 ns (er teilt den Takt durch 4!). Die Messwerte für die drei Frequenzen sollten also bei 125, 131 und 139 liegen. Das sollte ausreichen, um sie voneinander zu unterscheiden. Wenn Sie möchten, können Sie eine Reihe von Flanken passieren lassen und den Timer erst nach dem 10. Interrupt auslesen, zum Beispiel: 1250, 1316, 1389. Nicht zu viel länger, da Sie die Zeit kürzer als einen Impuls des Basisbandsignals halten müssen .
Erfolg!
quelle