Pfad: Home =>
AVR-Übersicht =>
Anwendungen => PCM-Encoder
Funkfernsteuerungs-Signalerzeugung mit ATtiny24
Eigenschaften
Hier ist ein 4-Kanal-Signalerzeuger für Funkfernsteuerungen beschrieben,
der folgende Eigenschaften aufweist:
- gesamte Steuerung mit einem 14-poligen ATtiny24,
- Messung der vier Potentiometerstellungen mit 10-Bit-ADCs,
- Mittelung der Potentiometermessungen über 1..64 Messungen (einstellbar),
- Umwandlung in Impulslängen von 800 bis 2.200µs,
- Impulsdauer eines gesamten Durchlaufs exakt 20.000µs.
Die Schaltung ist im Schaltbild dargestellt.
Die Schleifer der vier Potenziometer sind mit den vier AD-Wandlerkanälen
ADC0 bis ADC3 des ATtiny24 verbunden.
Die erzeugten Signale werden in normaler und in invertierter Form an den
Pins OC1A bzw. OC1B ausgegeben.
Am Pin PB0 ist eine LED angeschlossen, die während des Betriebs gemütlich
blinkt. Sie kann auch einfach weggelassen werden.
Die Pins USCK, MISO, MOSI und RESET können an einen 6- oder 10-poligen
ISP-Verbinder gelegt werden, um den ATtiny24 in der Schaltung zu programmieren.
Die Schaltung wurde auf einem Steckbrett aufgebaut. Die vier Trimmer dienen
als Eingabespannungsgeber für die vier Kanäle.
Zu sehen ist auch der ISP6-Programmieranschluss zum Programmieren in der Schaltung
selbst, zu Erkennen am sechsadrigen Parallelkabel.
Zur Stromversorgung über Batterie ist noch ein 5V-Spannungsregler mit einem
78L05 dazugebaut.
Die Software für den Prozessor ist natürlich in Assembler geschrieben.
Sie funktioniert folgendermaßen:
- Der AD-Wandler wird gestartet und erzeugt nach jeder vollendeten Umwandlung
einen ADC-Interrupt. Innerhalb der Interruptservice-Routine wird das Ergebnis
ausgelesen und zu der Summe des betreffenden Kanals dazu addiert und im SRAM
abgelegt. Dann wird der nächste Kanal gemessen. Ist jeder Kanal mit der
vorgewählten Anzahl gemessen und aufsummiert, wird die Auswerteflagge
gesetzt.
- Außerhalb des Interrupts wird die Summe des Ergebnisses jedes Kanals
mit (65536 * (2200 - 800) / 1023 / cAdc) multipliziert. Nach Teilen durch
65536 und Rundung werden 800 addiert. Das Ergebnis ist die Anzahl
Mikrosekunden Dauer des Signals für den jeweiligen Kanal (800 .. 2200).
Die Ergebnisse werden in einem SRAM-Bereich gespeichert. Die Werte der vier
Kanäle werden von 20.000 abgezogen, um die Dauer des letzten Signals,
des Synchronsignals zu bestimmen.
- Sobald das lang andauernde letzte Signal eines Zyklus gesendet wird, werden
die neu berechneten Signaldauern in den SRAM-Bereich geschrieben, aus der der
Timer die Signaldauern erhält. Da die Reihenfolge, in der der Timer
die Signaldauern aus dem RAM liest (von höheren zu niedrigeren Adressen,
MSB zuerst), ist dazu etwas umsortieren nötig.
- Die Erzeugung der Signale erfolgt mit dem 16-Bit-Timer im Fast-PWM-Modus. Er
läuft mit dem Systemtakt von 1 MHz. Die Signaldauer wird in das ICR
Register des Timers geschrieben. Ist der Zählerstand erreicht, beginnt
der Zähler bei Null neu. Der ICR-Interrupt liest die im SRAM
gespeicherte nächste Signaldauer und schreibt diese wieder in das ICR.
- Die Hardware-Signalerzeugung arbeitet mit den Compare-Registern A (normal)
und B (invertiert). Mit dem Rücksetzen des Zählers wird der Compare
A Ausgang auf High gesetzt, der Compare B Ausgang auf Low. In beide Compare
Register wird zu Beginn der Wert 500 geschrieben, um 500µs lange
Startsignale zu erzeugen. Erreicht der Zählerstand diesen Wert, dann
wird der Compare A Ausgang zurückgesetzt, der Ausgang B wird gesetzt.
Die Software ist hier im HTML-Format und
hier im ASM-Format verfügbar.
Beim Programmieren des Prozessors sind keine Fuses des ATtiny24 zu setzen.
Zu programmieren ist nur der Flash-Code, kein EEPROM-Code wird erzeugt.
Inverses Signal am Compare-Ausgang OC1B
Low-Signale 500µs lang
vier Low+High-Signale mit 800µ Dauer und
langes inaktives Synchronsignal.
Inverses Signal am Compare-Ausgang OC1B
Low-Signale 500µs lang
vier Low+High-Signale mit 2200µ Dauer und
langes inaktives Synchronsignal.
©2011 by http://www.avr-asm-tutorial.net