LED-Booster für Mikrocontroller
über
Immer wieder kommt der Wunsch auf, an einem mit 3 V betriebenen Mikrocontroller eine weiße LED anzuschließen. Doch der Versuch scheitert und die schöne weiße LED leuchtet nur ganz schwach oder überhaupt nicht...
Rote oder grüne LEDs jedoch funktionieren problemlos. Nach etwas Datenblatt-Recherche findet sich die Ursache prompt: Eine weiße LED hat eine typische Durchlass-Spannung von 3,2 V. Damit reichen 3 V einfach nicht aus, um ein helles Leuchten aus der LED zu zaubern. Man solle einen Boost-Konverter (Hochsetzsteller) zur Erzeugung einer höheren Spannung und einen Schalttransistor zum Schalten der LED einsetzen, so steht es oft in Internetforen. Doch für den Betrieb einer einzigen LED ist das wohl eher ein übertriebener Aufwand.
Die gute Nachricht: Es geht auch einfacher! Und zwar mit nur einem einzigen billigen zusätzlichen Bauteil: Einer Induktivität, die für ein paar wenige Cent erhältlich ist. Wird diese an der richtigen Stelle eingebaut und mit der richtigen Ansteuerung betrieben, leuchtet die weiße LED - und das sogar schon ab 2,5 V Versorgungsspannung des Mikrocontrollers. Magie? Natürlich nicht.
Bei der Schaltung aus Bild 1 handelt es sich um einen Boost-Konverter. Manche sagen dazu im deutschen Sprachgebrauch auch „Aufwärtswandler“ oder „Hochsetzsteller“. Doch wie funktioniert dieser Minimal-Boost-Konverter?
Prinzip des Boost-Konverters
Eine Induktivität L (Spule), an deren Ende die Eingangsspannung UE anliegt, wird mit einen Schalter S am anderen Ende gegen Masse geschaltet. Durch L fließt daraufhin ein Strom, der langsam ansteigt und dabei ein Magnetfeld erzeugt. Wird der Schalter S nach einiger Zeit geöffnet, bricht das Magnetfeld wieder zusammen, was in der Spule eine Induktionsspannung (Bild 2) entstehen lässt (ähnlich wie bei der Zündspule eines Fahrzeugs).
Diese Spannung addiert sich zur Versorgungsspannung. Somit liegt an der Diode D eine höhere Spannung UA als die Versorgungsspannung an, mit welcher der Kondensator C geladen wird. Wird der Schalter S wieder geschlossen, wiederholt sich dieser Vorgang. Da eine LED im Prinzip nichts anderes ist als eine Diode, kann die Diode D auch durch eine LED ersetzt werden (Bild 3). Und diese kann dann direkt an GND angeschlossen werden.
Wie lässt sich nun dieser LED-Boost-Konverter an einem Mikrocontroller mit nur einem einzigen Bauteil, der Induktivität, realisieren? Dabei helfen die unterschiedlichen Port-Modi. Ein Mikrocontroller-I/O kann im Push-Pull- oder Open-Drain-Modus verwendet werden. Push-Pull bedeutet, dass bei einer logischen Eins (also Portpin auf High) der Pin gegen VCC geschaltet wird und bei einer logischen Null gegen GND (Bild 4). Bei der Open-Drain-Einstellung jedoch bleibt der Ausgang bei einer logischen Eins offen und schaltet bei einer logischen Null nach wie vor auf GND, also genau so wie der Schalter S in unserem obigen Beispiel.
Die Größe der Induktivität hängt von der Schaltfrequenz, dem Strom, sowie der Ein- und Ausgangsspannung ab. In den meisten Datenblättern von Boost-Schaltreglern findet sich folgende Annäherung zur Bestimmung der Induktivität:
L = UE•(UA-UE)/(∆IL•fs•UA)
L = Induktivität [H], UA = Ausgangsspannung [V], UE = Eingangsspannung [V],
IA = Ausgangsstrom [A], fs = Schaltfrequenz [Hz], ∆IL = Induktor Ripple Current [A]
Der sogenannte Induktor Ripple Current ∆IL gibt die Stromdifferenz zwischen minimalem und maximalem Spulenstrom an, also die „Peak-to-Peak Strom-Amplitude“ des Spulenstroms, der sich um den Ausgangsstrom bewegt (Bild 5).
Der Spulenstrom bewegt sich immer ein paar Prozent um den Ausgangsstrom herum. Auch dafür wird in den meisten Datenblättern von Boost-Schaltregler-Herstellern eine Annäherung angegeben, die für unseren LED-Booster völlig ausreichend ist:
∆IL = 0,2•IA(max)•(UA/UE)
Der maximale Ausgangsstrom IA(max) ist der maximale Strom durch die LED, der erlaubt wird. Die ausgewählte weiße LED ist mit 30 mA im Datenblatt angegeben. Wird für den Strom IA(max) also 30 mA eingesetzt und für die Ausgangsspannung UA = 4 V, sowie UE (Eingangsspannung) = 2,5 V, dann kommt für ∆IL = 9,6 mA heraus. Damit errechnet sich nach oben angegebener Formel für eine Schaltfrequenz fs von 1 MHz eine Induktivität L von 97,66 µH.
100-µH-Induktivitäten gibt es wie Sand am Meer. Sie sind in unterschiedlichen Bauformen erhältlich. Für eine kleine weiße LED mit einem typischen maximalen Strom von 30 mA eignet sich die SMD Bauform 0805.
Versuchsaufbau
Auf ein Steckbrett wird eine an zwei Drähte angelötete, weiße LED im PLCC-4-Gehäuse gesteckt, mit einer Durchlass-Spannung von 3,2 V und einem Durchlass-Strom von 30 mA. Dazu kommen ein AVR-Mikrocontroller ATtiny24 (der zufällig gerade in der Bauteilekiste lag) und eine 100-µH-Drossel (Bilder 6 und 7). Der Mikrocontroller wird an das Programmiergerät mit den Pins RESET, MOSI, MISO, SCK und GND angeschlossen. Ein einstellbares Labornetzteil versorgt die Schaltung mit 2 V bis 3 V.
Programmierung des LED-Boosters
Sind alle erforderlichen Verbindungen richtig angeschlossen, geht’s ans Programmieren des ATtiny24. Rechteckspannungen können auf verschiedene Arten von einem Mikrocontroller ausgegeben werden. Zum Einen über PWM (Pulsweitenmodulation), zum Anderen über toggelnde I/O-Pins (Ausgänge), was der Einfachheit halber hier angewendet wird. Da für einen Boost-Konverter ein toggelnder Schalter gegen Masse benötigt wird, muss der entsprechende Ausgang also abwechselnd auf Open-Drain und Pull-Down gesetzt werden. Dies geschieht in einer Schleife direkt ohne Delays. Bei einem mit 8 MHz Takt betriebenen ATtiny ergibt das gerade so eine Ausgangsfrequenz von ungefähr 1 MHz.
Zum Ändern des voreingestellten internen 1-MHz-Takts auf 8 MHz muss die als Default gesetzte CKDIV8-Fuse ausgeschaltet werden. Beispielsweise mit dem Programm avrdude:
avrdude -U lfuse:w:0xEA:m
Wird eine zweite Schleife zum Toggeln des Versorgungs-Pins (UE) um die Open-Drain-Pull-Down-Schleife (Booster-Schleife) gelegt, so entsteht ein klassischer Blinker mit weißer, „geboosteter“ LED (Bild 8).
#define F_CPU 8000000UL // 8 Mhz
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
unsigned long int i;
while (1)
{
PORTA |= (1<<PA7);
DDRA |= (1<<DDA7); // LED ON
for(i=0; i<=400000; i++) // Booster Loop
{
DDRB |= (1<<DDB2); // Open Drain
DDRB &= ~(1<<DDB2); // Pull down
}
PORTA &= ~(1<<PA7); // LED OFF
_delay_ms(500);
}
}
----------------------------------------------------------------------------------------------------------------------------------------------------
Wollen Sie weitere Elektor-Artikel lesen? Jetzt Elektor-Mitglied werden und nichts verpassen!
----------------------------------------------------------------------------------------------------------------------------------------------------
Diskussion (10 Kommentare)