Eine LED dimmen

LEDs bestimmen mehr und mehr die Lichttechnik von heute. Vom Automotiv- bis in den Home- und Entertainmentbereich ist die LED als Leuchtmittel nicht mehr weg zu denken. Dabei wird Licht nicht einfach an- oder ausgeschaltet. Es werden vielfältige Lichteffekte erzeugt. Hinter einer Vielzahl von Lichteffekten steckt ein Mikrcontroller, dessen Firmware die Effekte über Pulsweitenmodulation (PWM) erzeugt. Dieser Abschnitt soll den Grundstein für die Anwendung der Pulsweitenmodulation mit dem XMC und dem hier vorgestellten Framework legen.

Entwickeln Sie eine XMC-Anwendung, bei der eine LED per PWM auf- und ab-gedimmt wird. Nutzen Sie für die Generierung einen Timer.

Falls Sie jetzt noch das Klassendiagramm geöffnet haben wählen Sie im Kontextmenü (rechte Maustaste) des Diagramms den Menüpunkt nach oben. Falls das Projekt nicht mehr geöffnet ist, öffnen sie das SiSy UML-Projekt wieder. Legen Sie ein neues Klassendiagramm an und wählen Sie die Sprache ARM C++. Beachten Sie die Einstellungen für die Zielplattform XMC4500 Relax Kit. Beim Öffnen des Diagramms (rechte Maustaste, nach unten) laden Sie die Diagrammvorlage für eine PEC Applikation und fügen das Treiberpaket für den XMC4500 ein.

Die Timer des XMC sind mehr als nur einfache Zählerbausteine. Sie werden als Capture/Compare Unit (CCU) bezeichnet und übernehmen eine Reihe verschiedener Aufgaben unter anderem auch die Generierung von PWM-Signalen.

Der XMC verfügt über zwei Timerarten, welche zu Capture/Compare Units zusammengefasst werden, den CCU4 und CCU8. Die CCU8 Timer sind funktional dabei um einiges umfangreicher als die CCU4 Timer. Beim XMC4500 stehen zwei CCU8 (CCU80,CCU81) und vier CCU4 (CCU40-CCU43) zur Verfügung. Jede CCU verfügt wiederum über je vier unabhängige Timer (CCx0-CCx3).

Jeder CC4x Timer besitzt einen PWM Kanal (CCU4x.OUTx). Jeder CC8x Timer verfügt über vier PWM Kanäle (CCU8x.OUTx0 bis CCU8x.OUTx3). Über die Device Connection Matrix können diese auf die entsprechenden Pins geschaltet werden. Die Anzahl der verfügbaren Pins ist von der Gehäuseform abhängig. Die folgende Darstellung zeigt die gewählte Verbindung von P0.12 = CCU40.OUT3 mit einer LED und die PWM-Pin-Matrix der myXMC Referenzkarte mit den verfügbaren CCU4x-PWM-Pins am XMC4500 im 100-Pin Gehäuse.

Hier die gesamte Problemstellung noch mal als Blockbild. Es soll der Timer CC43 der CCU40 genutzt werden. Als PWM Kanal wird Pin0.12 (CCU40.OUT03) zugeordet.

Die benötigten PWM-Klassen finden wir wiederum in den UML-Paketen. Wir suchen nach einer geeigneten Pec-Klasse oder Pec-Template und dazugehörigen Realisierungstemplates für den XMC4500.

Das Basis-Template PecPwmChanel finden wir im Paket Pec::PecTimer. Das Realisierungstemplate gehört zum Paket des Controllers myXMC4500. Ergänzen Sie den Klassenentwurf wie folgt, beachten Sie die Attribute der Klasse Controller:

Das Dimmen der LED wird vom 100 ms Ereignis getriggert (onTimer10ms). Die Helligkeit der LED wird durch schrittweises Hoch- oder Runterregeln (Rampe) des PWM-Signals angepasst. Die Rampe läuft im Intervall von 0 - 1000 und wird mit der Schrittweite 5 (Rampensteilheit) abgefahren werden. An den Intervallgrenzen soll die Richtung umkehren.

Controller::onStart

// PWM-Frequenz festlegen
pwmLED.configHz(1000);

Controller::onTimer10ms

// Rampe abfahren
duty+=direction;
// Richtung ändern
if(duty==0 || duty>=1000)
	direction*=-1;
// Helligkeitswert in 1000stel setzen
pwmLED.setDuty(duty);

Übersetzen und übertragen Sie das Programm. Testen Sie die Anwendung.

Und hier diesen Abschnitt wiederum als Text- und Videozusammenfassung.