Eine per RS232 einstellbare Spannungsquelle

Hintergrund

Manchmal benötigt man eine variable Spannung, beispielsweise um etwas zu steuern. In vielen Fällen kann man eine PWM (Pulsweitenmodulation) nutzen, bei der die Versorgungsspannung schnell ein- und ausgeschaltet wird. Durch die Dauer der jeweiligen Zustände ergibt sich ein mittlerer Spannungswert, den man recht gut steuern kann. Für LEDs oder einfache Gleichstrommotoren (klassisches Beispiel: PC-Lüfter) funktioniert das prima, da durch die Trägheit des menschlichen Auges bzw. der trägen Masse des Motors eine Art Filterung der plötzlich wechselnden Zustände erzielt wird. Manchmal benötigt man aber doch eine "echte" Gleichspannung, nämlich wenn das zu versorgende Bauteil einem plötzliche Aussetzer der Versorgungsspannung übel nimmt.

Eine einfache und bewährte Methode ist einen Linearregler mit einstellbarer Ausgangsspannung zu verwenden, z.B. den LM317. Die Widerstände zum Einstellen der Spannung ersetzt man durch ein Potentiometer und fertig ist die steuerbare Spannungsquelle. Allerdings ist diese nur manuell bedienbar. Abhilfe schaffen digitale Potentiometer, wie z.B. MCP4151, die per SPI angesteuert werden können. Doch manchmal ist auch dieser Weg ungeeignet, da diese Potentiometer mitunter recht hohe Widerstandswerte besitzen (ab 10 kΩ aufwärts).

Die Hardware

Mich hat vor allem interessiert wie man so etwas selbst bauen könnte. Eine tiefpassgefilterte PWM zu nutzen ist guter Ansatz. Es gibt zahlreiche Projekte, bei denen über eine solchermaßen erzeugte PWM ein Lautsprecher oder Piezo-Piepser angesteuert wird, um Musik oder Sprache ertönen zu lassen. Allerdings ist eine solche Gleichspannung nicht sehr belastbar. Mein Ziel bestand darin, eine Spannungsquelle zu bauen, die mit einigen hundert Milliampere belastet werden kann. Dies konnte ich erreichen, indem ich zwei Transistoren als Emitterfolger nachgeschaltet habe, welche die Impedanz der Quelle erheblich verstärken.

Die Ausgangsspannung dieser Schaltung kann prinzipbedingt niemals die Vesorgungsspannung erreichen, da die Basis-Emitter-Strecken der beiden Transistoren einen Spannungsabfall erzeugen. Dieser ist abhängig vom Strom der fließt. Das folgende Diagramm zeigt verschiedene Messreihen, bei denen unterschiedliche Lastwiderstände angeschlossen wurden. Die Kurven für die unbelastete und wenig belastete Spannung sehen anfangs recht steil aus, während ab einer Last von etwa 100 Ω ein ausgesprochen linearer Zusammenhang zwischen PWM-Dutycycle und Ausgangsspannung sichtbar wird.

Eine weitere interessante Größe ist der Innenwiderstand, denn dieser bestimmt bis zu welcher Stromstärke die vorgegebene Spannung gehalten werden kann. Das folgende Diagramm zeigt die Spannung im Verhältnis zum Strom. Bei den hohen Strömen sind die Werte etwas unsauber, da sich die Widerstände teilweise stark erwärmt und damit ihre Werte geändert haben. Aber die geglättete Kurve zeigt recht genau den weiteren Verlauf an.

Dieses mal habe ich auch ein komplettes Gerät gebaut, mit Leiterplatte und Gehäuse. Für die Ausgänge habe ich 2,5 mm Mono-Klinkenbuchsen verwendet. Die Versorgungsspannung wird über einen Hohlstecker angeschlossen, die serielle Schnittstelle wie üblich über eine 9-polige SubD-Buchse.

Die Software

simple

Die Software besteht aus nur einem Teil, der Firmware auf dem Gerät. Sie kann direkt mit einem Terminal-Programm wie z.B. PuTTY oder picocom bedient werden. Die Steuerung der Ausgangsspannung erfolgt über die Vorgabe des PWM-Duty-Cycles in Dezimalwerten zwischen 0 und 255. Eine Sitzung könnte wie folgt aussehen:

+OK voltsrc 1.0 ready
SET A 100
+OK Channel set
SET B 150
+OK Channel set
SET A 0
+OK Channel set

Wobei das Ganze case-insensitive ist, d.h. "set a 0" würde genauso zum Erfolg führen. Das Programm sendet alle Zeichen zurück (echo), wobei CR durch CRLF ersetzt wird. Bei der Eingabe wird eine Zeile als komplett betrachtet, wenn CR empfangen wird (weil dies die meisten Terminal-Programme als Default verwenden). Das erste Zeichen der Antwort ist "+" für positive Meldungen und "-" für negative Meldungen. Das habe ich mir bei POP3 abgeschaut und soll die automatische Verarbeitung durch ein Programm auf PC-Seite vereinfachen.

Die Software benötigt ca. 1 KByte Programmspeicher, wobei ein großer Anteil davon auf die Zeichenketten-Verarbeitung entfällt.

ee_curve

Die ee_curve-Software besteht aus zwei Teilen, einer Firmware und einem PC-Programm. Im Unterschied zur simple-Software kann der Benutzer hierbei einen Spannungswert in Millivolt angeben, der von der Hardware in einen vorher konfigurierten PWM-Duty-Cycle übersetzt wird. Die Konfiguration erfolgt in Form einer Kennlinie (Spannung zu Duty-Cycle) mit 5 Stützpunkten, die für jeden Kanal getrennt im EEPROM abgespeichert wird. Für einen gegebenen Spannungs-Wert wird der dazugehörige Duty-Cycle über das Verfahren der linearen Interpolation angenähert. In der Praxis erreicht man damit erstaunlich gute Ergebnisse.

Auf Grund des geringen Programmspeicherplatzes im verwendeten ATtiny2313 (und der einfacheren Verarbeitung) kommt ein Binärprotokoll zum Einsatz. Daher muss zwingend auf der PC-Seite ein passendes Gegenstück existieren, mit einem einfachen Terminal-Programm lässt sich diese Firmware nicht bedienen. Ich habe dazu ein simples Konsolen-Programm für Linux & Co. sowie ein dialogbasiertes Windows-Programm erstellt.

Hinweis: bei einer späteren Portierung auf den ATmega32A ist mir aufgefallen, dass die Schreib- und Lesegeschwindigkeit des internen EEPROMs unterschiedlich ist. Während mein Programm auf dem ATtiny2313 super lief hat sich beim ATmega32A die Protokoll-Statemachine verheddert. Grund dafür ist, dass für die serielle Verbindung keinerlei Flusskontrolle benutzt wird und die Abarbeitung pollend im Hauptprogramm erfolgt (anstatt z.B. interruptgesteuert). Somit können einzelne Zeichen verloren gehen, was bei einem Binärprotokoll meistens fatal ist. ;-)
Einfachste Abhilfe ist das Timing ("Sleep"-Aufrufe) im PC-Programm zu verändern. Der schönere Weg wäre die Firmware zu ändern, aber ich vermute in die 2 KByte Flash-Speicher wird das nicht rein passen...

Downloads

Version Datum Änderungen Datei Beschreibung
1.1 2013-03-31 ee_curve-Software hinzugefügt voltsrc-1.1.tar.gz Schaltplan und Layout im Eagle-Format (Version 6), Software
1.0 2012-10-02 Erstes Release voltsrc-1.0.tar.gz Schaltplan und Layout im Eagle-Format (Version 6), Software

Zurück zur Hauptseite