An anderer Stelle sind hier PWM-Routinen zu finden, die die Grundlagen beschreiben. Aufbauend auf der optimierten Lösung für einen AVR, wird hier eine Routine vorgestellt, die 64-Kanäle mit 8 Bit Auflösung und hoher Pulsfrequenz bietet. Die Ausgabe erfolgt über Schieberegister (C4094, 74HC595) und ist so organisiert, daß der oberste Kanal (63) zuerst ausgegeben wird und Kanal Nr. 0 zuletzt. Werden weniger als 64 Kanäle benötigt, so kann eine kürzere Kette von Schieberegistern verwendet werden. Kanal Nr. 0 wird immer am 1. Schieberegister Q0 ausgegeben.
Das Programm stellt den ATmega48 auf maximale Taktfrequenz des internen Oszillators ein (ca. 15MHz). Damit werden für die Ausgabewerte 1 und 255 rund 80Hz Pulsfrequenz erzeugt. Auf Grund des speziellen PWM-Verfahrens wird die maximale Pulsfrequenz beim Wert 128 erreicht und beträgt dann ca. 8kHz. Durch dieses PWM-Verfahren ergibt sich eine günstige Verteilung der Ausgangsstöme, da die Kanäle nicht alle gleichzeitig geschaltet werden. Um dies auch bei gleichen PWM-Werten zu erreichen, werden den PWM-Kanälen unterschiedliche Startwerte vorgegeben.
Um maximale Geschwindigkeit zu erreichen, kann auch eine externer Quarz mit 20MHz verwendet werden.
Die Datenübergabe erfolgt über einen TWI-Bus, wobei nach Adressierung zunächst die Kanal-Nr. und anschließend der PWM-Wert dieses Kanals erwartet werden. Weitere Datenbytes werden für die nachfolgenden Kanäle übernommen, die Kanal-Nr. wird automatisch erhöht. Bei einem Überlauf werden nachfolgende Werte ignoriert. Beginnend bei der TWI-Basisadresse können insgesamt 8 ATmega48 adressiert werden; das Programm wertet dazu die unteren drei Pins von PortC aus.
Zunächst das Schaltbild, welches drei der acht möglichen Ausgaberegister zeigt:
Das Programm 'pwm_sub.s90' erzeugt die PWM-Sequenz für alle Kanäle in Assembler und das Programm 'pwm_64.c' übernimmt die Steuerung mit Datenübergabe per TWI. Beide sind für IAR-Compiler geschrieben, sollten sich jedoch einfach an die eigenen Bedürfnisse anpassen lassen. Der Aufruf der Routine pwm_ausgabe() im Interrupt kann optimiert werden. Da am Ende dieser Routine die Ausgabe in die Schieberegister noch nicht fertig sein muß, sollte der SR-Strobe nicht direkt danach ausgeführt werden! Ferner ist beim Einlesen von PortC (TWI-Adresse) darauf zu achten, daß dies nicht sofort nach dem Einschalten der Pullups passiert.
Eine fertige '.hex'-Datei wird hier erst nach einem abschließenden Funktionstest eingestellt werden.
Kontakt: