Kompakte programmierbare Taschen-Netzteil mit OLED-Display – Arduino-kompatibel
Komponenten und Materialien
| Arduino UNO | × | 1 |
| Arduino Nano R3 | × | 1 |
| XL6009 DC-DC Boost-Modul | × | 1 |
| SparkFun Drucktaster 12mm | × | 1 |
| 16 MHz Quarz | × | 1 |
| Klemmenblock-Anschluss | × | 1 |
| Linearer Regler mit einstellbarem Ausgang (LM317) | × | 1 |
| Linearer Regler 7805 | × | 1 |
| 1N4007 Hochspannungs-Diode | × | 1 |
| USB-A auf B Kabel | × | 1 |
| Mehrgang-Präzisionspotentiometer 10k Ohm (25 Umdrehungen) | × | 1 |
| OP07 Instrumentations-OpAmp | × | 1 |
| Generisches Gehäuse / Socket Box | × | 1 |
| FR4 Lochrasterplatine | × | 1 |
| Jumper-Kabel (generisch) | × | 1 |
| Male Header 40-polig 1 Reihe (2.54mm) | × | 1 |
| Widerstand 10k Ohm | × | 1 |
| Widerstand 22.1k Ohm | × | 1 |
| Widerstand 1k Ohm | × | 1 |
| Arduino Latching Relay 5V 2A | × | 1 |
| SparkFun MCP4131 Digitales Potentiometer 10k | × | 1 |
| Arduino Kupferband | × | 1 |
| Arduino LM358 OpAmp | × | 1 |
| Arduino 1306 OLED (SSD1306) | × | 1 |
Benötigte Werkzeuge und Maschinen
| Lötkolben (generisch) |
| Heißklebepistole (generisch) |
| Minibohrmaschine |
Apps und Online-Dienste
| Arduino IDE |
Über dieses Projekt
Die Idee
Als Hobbyisten benötigen wir häufig Strom für Prototypen, um Spannung, Strom und Leistungsgrenzen zu prüfen oder neu gekaufte Bauteile zu testen. Ein variables Labornetzteil ist teuer, sperrig und nicht tragbar. Ich suchte nach einem programmierbaren Netzteil zu geringeren Kosten, mit Tragbarkeit und Produktivität für meine Prototypen und Bauteiltests. Also beschloss ich, eines selbst zu bauen.
Es bietet folgende Features:
- Programmierbar
- Wiederaufladbar
- Tragbar
- Stufenweise einstellbar
- Spannungs-/Strom-/Leistungsmessung
- Geschütztes Relais
- Anpassbar, kompakt und handlich
- Cooles OLED-Benutzerinterface
- Drucktasten-Bedienung und Menü-Navigation
- Firmware-upgradbar für weitere Features!
Das vielseitigste Netzteil für Low-Power-Elektronikprojekte.
Live-Demo
Sehen Sie sich dieses Video an, das den Gerätebetrieb demonstriert.
Spezifikationen
- Max. Ausgangs-Gleichstrom: 400 mA
- Spannungsbereich: 2,0 V – 12,0 V
- Spannungsschritt: ca. 0,1 V
- Bester Wirkungsgrad: 75 %
- Strommessgenauigkeit: ±1 mA
- Spannungsmessgenauigkeit: ±0,02 V
Hinweis: Dies ist ein schneller Prototyp. Es ist möglich, 0–30 V, sogar negative Spannungen und höhere Ausgangsströme durch größere Akkus, zusätzliche Elektronik und überarbeitetes Design zu erreichen.
Funktionsprinzip
Das Design ist hardware-lastig. Ein grobes Blockdiagramm des Systems:
Stromquelle ist ein 3,7 V Li-Po-Akku, USB-aufladbar. Mit dem XL6009 DC-DC-Boost-Modul erzeugen wir zuerst 15,6 V aus dem Li-Po. Für den MCU erzeugen wir per 7805-Regler 5 V.
Der Arduino-UNO-Klon (ATmega328P) ist verbunden mit 2 Interrupt-basierten Eingabetastern, einem eleganten OLED-Ausgabedisplay und einem Rx/Tx/DTR-Firmware-Upload-Port über USB/Serial vom PC (Modul 1).
Das Herz des Projekts ist der MCP4131 Digital-Potentiometer (Digipot) + LM358 OpAmp-basierte Stufen-Spannungsgenerator. Diese Spannung ist die Steuerspannung des LM317 einstellbaren Reglers (Modul 2).
Der Digipot wird vom Arduino über pseudo-SPI-ähnliche Befehle gesteuert. Der LM317 ist so ausgelegt, dass der Ausgangspin immer 1,25 V höher liegt als die Adjust-Pin-Spannung, vorausgesetzt der Eingangspin hat ausreichend Spannung (hier 15,6 V) (Modul 3).
Die Stufenspannung wird an den Adjust-Pin geführt, um den vom Benutzer gewünschten variablen Ausgang zu erzeugen.
Der ADC misst alle zur Überwachung und zum Schutz relevanten Spannungen: Akkuspannung, Boost-Spannung, Ladespannung und Ausgangsspannung werden über Spannungsteiler-Netzwerke für den ADC-Bereich (0–1,1 V hier) konditioniert. Ich nutze die INTERNE REFERENZ des Arduino (1,1 V).
Für die Strommessung wird der Rückleiter (Last-GND) vom Ausgang in Reihe mit einem 1-Ohm-Strommesswiderstand zum System-GND geschaltet. Wenn Strom durch die externe Last fließt, entsteht ein Spannungsabfall an diesem Messwiderstand. Diese Spannung wird über den OP07 Präzisions-Operationsverstärker verstärkt und an einen ADC-Pin geführt.
Für das Laden des Akkus werden 5 V vom USB in Reihe mit einer 1N4007-Diode und einem 5-Ohm-Strombegrenzungswiderstand zum Li-Po-Akku geführt. Dies ist eine einfache Lademethode, nicht optimal für Li-Po.
Zusammenfassung der Funktion: Der MCP4131 Digipot erzeugt Stufenspannungen im 0–5 V Bereich in Schritten von ca. 40 mV (7-Bit 10k Digipot hat 129 Stufen, 5 V / 128 = 39 mV), die dann 2,5-fach vom LM358 verstärkt werden → 0–12,5 V Steuerspannung mit 0,1 V Schritten. Dieses Signal geht an den Adjust-Pin des LM317. Der LM317 erzeugt eine Ausgangsspannung von V_Step + 1,25 V, die an die externe Last geliefert wird. Der Rückleiter der Last geht über den 1-Ohm-Messwiderstand zum internen GND. Fließen x mA, entstehen x mV Spannungsabfall (Ohmsches Gesetz). Dieser wird vom OP07 (Offset 10 µV) mit 2,5-facher Verstärkung zu 2,5x mV verstärkt. Der Arduino-ADC nutzt die 1,1 V interne Referenz, sodass 0–1100 mV in ~1 mV Schritten erfasst werden (1100/1023). Deshalb ist der Strom auf 400 mA begrenzt. Er lässt sich durch Ändern der OP07-Verstärkung erhöhen/verringern. Ebenso lässt sich der Ausgangsspannungsbereich durch Ändern der Boost-Spannung und LM358-Verstärkung anpassen. Andere Spannungen werden über resistive Spannungsteiler in den ADC-Bereich gebracht. Das Latch-Relais hat 2 Spulen. Durch kurzen Stromimpuls an eine Spule werden die Kontakte umgeschaltet. Einmal geschaltet bleibt die Position, die Spule wird sofort stromlos gemacht.
Projektbau
Beginnen Sie mit einer Einzelschalter-Dosenbox und machen Sie notwendige Ausschnitte und Ausrichtungen für Akku, USB-Ladeanschluss, Netzschalter etc.
Kühlkörper aus Kupferband und Münze für das DC-DC-Boost-Modul anfertigen:
Boost-Modul in die Dosenbox einbauen:
Mit den obigen Teilen werden folgende 3 Module gebaut:
- Arduino + I/O + Steuerungs-Modul
- Stufenspannungs- und Einstellregler-Modul
- Strommess-Modul
Schließlich werden alle Platinen miteinander verdrahtet und verlötet.
Nach dem Auffüllen mit Heißkleber ist das Gerät fertig:
Firmware-Entwicklung & Bedienungsanleitung
Die Firmware (Arduino Sketch) ist derzeit Version 1.0.2 Beta. Noch nicht alle Features sind verfügbar, aber die wichtigsten wie Spannungssteuerung, Relais Ein/Aus, Informationsanzeige sind aktiv. Im void setup() befinden sich Initialisierungsfunktionen für die Arduino-Pins der externen Hardware.
EINGABE: 2 interruptbasierte Taster für Erhöhen/Verringern der Ausgangsspannung, Menüzugriff (in dieser Version nicht verfügbar). INT0 & INT1 an Arduino Pin 2 und 3 sind für FALLING EDGE INTERRUPT konfiguriert. Zwei Kondensatoren parallel zu den mechanischen Tastern entprellen. Der Code löst Interrupts aus, wenn der Benutzer die Taster drückt, um den Ausgang über das Relais ein-/auszuschalten oder die Spannung zu erhöhen/verringern (Beta).
AUSGABE: Das SSD1306 OLED zeigt Ausgabedaten aus ADC, internem Timer (Betriebszeit) und Flag-Variablen (Ausgang Ein/Aus-Status). Basierend auf der U8G-Bibliothek druckt das OLED Text und Zahlen. Grafische (Analog-artige) Darstellung ist geplant.
5 digitale Pins des SSD1306 (OLED von Waveshare) clk, din, cs, d/c, res sind mit Arduino 10, 9, 11, 13, 12 verbunden und entsprechend programmiert. Im Hauptloop wird update_display() bei jedem Durchlauf aufgerufen, um die OLED-Info zu aktualisieren.
Interner Timer 1 des ATmega328P ist so konfiguriert, dass er jede Sekunde triggert, um die Zeit zu verfolgen.
STEUERUNG: Der MCP4131 Digipot wird mit increment_digipot() & decrement_digipot() gesteuert, wobei Daten mit korrektem Takten und Delay über Pin 6, 7, 8 als CS, Clk, Data Pins herausgeschoben werden. Es handelt sich um langsames Soft-SPI. Da die Hardware-SPI-Pins bereits anderswo belegt waren, war dies die einzige Lösung.
Zwei digitale Pins 4 & 5 steuern das Latch-Relais. Ein kurzer High-Impuls wird an die Relais-Treibertransistoren gegeben, um die 2 Spulen zu energisieren und das Relais umzuschalten. Dies geschieht sowohl automatisch (bei Überlast/Kurzschluss) als auch manuell durch den Benutzer.
ADC: Die Funktion calc_VI() im Hauptloop führt analogRead aus, um 20-fach gemittelte Spannungs- und Strominformationen zu erhalten und die Variablen für neue Informationen zu aktualisieren, die dann auf dem Display ausgegeben werden.
Der Sketch ist in mehrere Tabs unterteilt, um Code für verschiedene Funktionen zu organisieren: ADC, Digipot, Display_Fn, Interrupt, Relay und Timer Tabs ordnen alle benutzerdefinierten Funktionen. Ich werde versuchen, mehr Kommentare hinzuzufügen, aber es sollte nicht schwer zu verstehen sein, da diese Funktionen auf mehreren Arduino-Funktionen basieren, die bestimmte Aufgaben erledigen.
Einschränkungen
Es gibt einige ernste Einschränkungen dieses Geräts:
- Spannung kann nicht unter 2,0 V gehen
- Spannungsausgang ist gestuft, nicht kontinuierlich
- Strommessung verursacht Ground-Shifting bei hohem Strom
- ADC-Auflösung ist gering
- Wirkungsgrad ist bei niedriger Spannung und hohem Strom am schlechtesten
- Nicht-standardmäßige, leicht unsichere Li-Po-Ladung
Referenzen
Mehr über die Komponenten in diesen Tutorials:
- Drehpotentiometer
- Taster-Tutorial
Fazit
Dieses programmierbare Netzteil hilft mir, Projekte und Prototypen effizienter zu erstellen. Spannung, Strom, Leistung messen ohne Multimeter.
Code
Arduino Programmierbares Tragbares Netzteil (Arduino)
Ver 1.0.1 mit Pin-Belegung in Kommentaren
// Pin Reset, D0 & D1 für Sketch-Upload
// Pin D9,D10,D11,D12,D13 für OLED-Display Steuerung
// ADC A0 Pin für V_boost Messung
// ADC A2 Pin für V_batt (LiPo) Messung
// ADC A3 Pin für I_Output (Last) Messung
// ADC A4 Pin für V_USB (Laden) Messung
// ADC A5 Pin für V_Output (Last) Messung
// Latch-Relais 2 Spulen Ansteuerung Pin D4 & D5
#define RC1 4
#define RC2 5
// Benutzer-Eingabetaster an Pin D2 & D3
#define SW1 2
#define SW2 3
// Pin D6,D7,D8 für Digital-Pot Steuerung
#define CS_PIN 6
#define CLK_PIN 7
#define DATA_PIN 8
volatile uint8_t Switch1 = 1;
volatile uint8_t Switch2 = 1;
float V_Out = 0.0;
float I_Out = 0.0;
float V_Bat = 0.0;
float V_Bst = 0.0;
float V_Chg = 0.0;
uint32_t time = 0;
#include "U8glib.h"
// OLED Display Steuerungspins
// SSD1306 oled waveshare(clk,din,cs,d/c,res); // FÜR WAVESHARE
U8GLIB_SSD1306_128X64 u8g(10, 9, 11, 13, 12);
void setup(void) {
// Bildschirm spiegeln, falls nötig
analogReference(INTERNAL);
u8g.setRot180();
button_init();
relay_init();
init_timer1();
digipot_init();
}
void loop(void) {
update_display();
calc_VI();
if (Switch1 == 0) {
rc1_latch();
Switch1 = 1;
increment_digipot();
}
if (Switch2 == 0) {
rc2_latch();
Switch2 = 1;
decrement_digipot();
}
delay(100);
}
Code Ver 1.0.1 Beta (C/C++)
Keine Vorschau (nur Download).
Code Ver 1.0.2 Beta (C/C++)
Bugfix Text/Box-Ausrichtung
Bugfix Überlast-Abschaltung
Weitere Bugfixes im nächsten Release.
Keine Vorschau (nur Download).
Code Ver 1.0.3 (C/C++)
Bugfix: Ausgangsrelais beim Einschalten deaktiviert
Bugfix: Automatisch Ausgangsspannung 5,00 V nach Einschalten
Keine Vorschau (nur Download).
Schaltpläne
Auf Whiteboard gezeichnet!
https://circuits.io/circuits/4762970-arduino-based-programmable-power-supply
Herstellungsprozess
- Klassisches Pong-Spiel auf Arduino UNO mit OLED-Display bauen – Schritt-für-Schritt-Tutorial
- Smartes Sparschwein: Münzprüfer mit Arduino Nano steuern
- Arduino Power Control Center: N-FET, P-FET, Relais & RTC Kit
- Arduino Temperaturoverwachung & Echtzeituhr mit 3,2″ TFT-Display
- LED per Bluetooth mit Arduino steuern – Einfache DIY-Anleitung
- Optimierte Stromversorgungslösungen für Arduino-Projekte
- Interaktives Nextion HMI Projekt mit Arduino Mega und Sensoren
- DIY-Voltmeter mit Arduino und Nokia 5110 Display – Schritt-für-Schritt-Anleitung
- Umfassendes Arduino-Trainingskit mit Mega 2560, Sensoren, Motoren & Custom PCB
- Fridgeye-App mit Nextion-Display bauen: Schritt-für-Schritt-Anleitung