Compacte programmeerbare zakvoeding met OLED-display – Arduino-compatibel
Onderdelen en benodigdheden
| Arduino UNO | 1 |
| Arduino Nano R3 | 1 |
| XL 6009 DC-DC Boost | 1 |
| SparkFun Drukknop 12mm | 1 |
| 16 MHz Kristal | 1 |
| Klemblok connector | 1 |
| Lineaire regulator met instelbare uitgang | 1 |
| Lineaire regulator (7805) | 1 |
| 1N4007 – Hoge spanning, hoge stroom diode | 1 |
| USB-A naar B-kabel | 1 |
| Multi-turn Precisie Potentiometer - 10k ohm (25 draai) | 1 |
| OP07 Instrumentatie OpAmp | 1 |
| Generieke socket-doos | 1 |
| FR4 Proto-board | 1 |
| Jumper-draden (generiek) | 1 |
| Male Header 40 positie 1 rij (0.1") | 1 |
| Weerstand 10k ohm | 1 |
| Weerstand 22.1k ohm | 1 |
| Weerstand 1k ohm | 1 |
| Arduino Latching Relay 5V 2A | 1 |
| SparkFun MCP 4131 Digitale Potentiometer 10k | 1 |
| Arduino Koperen tape | 1 |
| Arduino LM358 Opamp | 1 |
| Arduino 1306 OLED | 1 |
Nodige gereedschappen en machines
| Solderbout (generiek) |
| Lijmpistool (generiek) |
| Mini boormachine |
Apps en online diensten
| Arduino IDE |
Over dit project
Het idee
Als hobbyisten hebben we vaak een variabele voeding nodig om prototypes te voeden, spanning/stroom/vermogen te controleren, nieuwe componenten te testen. Helaas heeft niet iedereen een labvoeding. Het is duur als je het koopt, en groot als je het mee moet nemen. Ik zocht een programmeerbare voeding tegen lagere kosten, met draagbaarheid en productiviteit voor mijn prototypes en componenttests. Dus besloot ik er een te bouwen.
Het heeft de volgende kenmerken:
- Programmeerbaar
- Oplaadbaar
- Draagbaar
- Stapsgewijs instelbaar
- Spanning/Stroom/Vermogen-meter
- Beschermde relais
- Aanpasbaar, compact en handzaam
- Coole OLED-gebruikersinterface
- Drukknop-gebruikersbediening en menu-gebaseerde navigatie
- Firmware-upgradeerbaar voor meer functies!
En de meest veelzijdige voeding voor lage-vermogen elektronische projecten.
Live actie!
Bekijk deze video die de werking van het apparaat demonstreert:
Specificaties van het apparaat
Het apparaat heeft de volgende specificaties:
- Maximale uitgangs DC-belastingstroom: 400 mA
- Spanningsbereik: 2,0 Volt - 12,0 Volt
- Spanningsstap: ca. 0,1 Volt
- Beste rendement: 75%
- Stroommeetnauwkeurigheid: +/- 1 mA
- Spanningsmeetnauwkeurigheid: +/- 0,02 Volt
Let op: dit apparaat is een snelle prototype. Het is mogelijk om 0-30V, zelfs negatieve voeding en meer uitgangsstroom te maken door hogecapaciteitsbatterijen, extra elektronica en verbeterd ontwerp te gebruiken.
Werkprincipe
Het ontwerp is hardware-intensief. Er gebeurt veel. Een globaal blokdiagram van het systeem:
De stroombron is de 3,7V Li-Po-accu die via USB oplaadbaar is. Met een XL6009 DC-DC boost-module maken we eerst 15,6 volt van de Li-Po. Voor de MCU maken we ook 5 volt met een 7805-regulator.
De Arduino UNO-clone ATmega328P is verbonden met 2 interrupt-gebaseerde gebruikersinvoerschakelaars, een elegante OLED-uitvoerdisplay. Rx/Tx/DTR firmware (sketch) uploadpoort via USB/Serial van PC. (module 1)
Het hart van het project is de MCP4131 Digitale Potentiometer (Digipot) + LM358 OpAmp-gebaseerde stapsgewijze spanningsgenerator. Deze spanning is de besturingsspanning van de LM317 instelbare regulator. (module 2)
De Digipot wordt vanuit de Arduino bestuurd via pseudo-SPI-commando's. De LM317 is zo ontworpen dat de uitgangspinspanning altijd 1,25 Volt hoger is dan de Adjust-pinspanning, mits de INPUT-pinspanning hoog genoeg is (hier 15,6 volt). (module 3)
De stapsgewijze spanning wordt aan de Adjust-pin aangeboden om variabele uitgang te creëren vanuit de Arduino zoals de gebruiker nodig heeft.
De ADC meet alle spanningen voor toezicht en beveiliging: accuspanning, geboostte spanning, laadspanning en uitgangsspanning worden via een spanningsdeler-netwerk geconditioneerd voor het ADC-bereik (0-1,1 volt hier). Ik heb de INTERNE REFERENTIE van Arduino gebruikt die een referentie-spanning van 1,1 volt creëert.
Voor stroommeting is de return (Load GND) van de uitgangsbelasting in serie aangesloten met een 1 Ohm stroomsensorweerstand aan de systeem-GND. Wanneer stroom door de externe belasting vloeit, ontstaat er ook een spanningsval over deze sensorweerstand. Deze spanning wordt versterkt door een OP07-precisie-operationele-versterker en aan een van de ADC-pinnen aangeboden.
Tot slot, voor het opladen van de accu, is 5 volt van de USB in serie aangesloten met een 4007-diode en een 5-ohm stroombegrenzende weerstand aan de Li-Po-accu. Dit is een ruwe oplademethode, niet de beste voor Li-Po-laden.
Operatie-samenvatting: De MCP4131 Digitale Potentiometer creëert stapsgewijze spanningen in 0-5V-bereik in stappen van ongeveer 40mV (7-bit 10K Digipot heeft 129 stappen, 5V/128 = 0,04V), wat vervolgens 2,5 keer versterkt wordt door de LM358, wat een 0-12,5V besturingsspanningsbereik geeft met stappen van 0,1V. Deze versterkte stapsgewijze spanning wordt aan de Adjust-pin van de LM317 aangeboden. De LM317 genereert een uitgangsspanning van V_Step + 1,25V die aan de externe belasting geleverd wordt. De return/ground van de externe belasting is verbonden met de interne ground via de 1 Ohm stroomsensorweerstand. Stel: x mA stroom vloeit naar de externe belasting, dit creëert x mV val (Ohm's wet V=I*R) op de 1 Ohm stroomsensorweerstand. Dit kleine spanningssignaal wordt aangeboden aan de lage-offset (10uV) OpAmp OP07 geconfigureerd met 2,5x versterking, wat 2,5x mV uitgang genereert. De Arduino ADC is geconfigureerd met 1,1V interne referentie, zodat spanningen van 0-1100 mV in stappen van ~1mV (1100/1023) gemeten kunnen worden. De OP07-uitgang is verbonden met Arduino ADC voor stroommeting. Daarom is de stroomlimiet 400mA. Deze kan verhoogd/verlaagd worden door de versterking van OP07 te wijzigen. De uitgangsspanningsbereik kan gewijzigd worden door de boost-spanning en versterking van LM358 te wijzigen. Andere spanningen worden gemeten met resistieve spanningsdeler-netwerken die spanningen dichten naar het ADC-bereik. De latch-relais heeft 2 spoelen. Door kortstondig spanning aan een van de spoelen aan te leggen, kunnen de relaiscontacten geschakeld worden. Eenmaal geschakeld blijft het daar, dus de spoel wordt direct weer uitgeschakeld.
Het project bouwen
We beginnen met een enkele schakelaar-socketdoos, en maken de benodigde uitsnijden en uitlijningen voor het plaatsen van de accu, USB-laadpoort, voedingsschakelaar, etc.
Vervolgens wordt de heatsink gemaakt met koperen tape en een muntstuk voor de DC-DC boost-module.
De boost-module wordt in de socketdoos geplaatst:
Met de bovenstaande onderdelen worden de volgende 3 modules gemaakt:
- Arduino + I/O + Besturingsmodule
- Stapspanning en Instelbare Regulator Module
- Stroommeting Module
Ten slotte worden de spinnenweb-verbindingen tussen alle borden verbonden en gesoldeerd.
Na het gebruik van lijm als vulling, hebben we het uiteindelijk:
Firmware ontwikkelen & Bedieningsprocedure
De firmware (Arduino Sketch) is momenteel versie 1.0.2 Beta. Nog niet alle functies beschikbaar. Maar de belangrijkste functies zoals spanning regelen, relais aan/uit schakelen, informatie bekijken zijn ingeschakeld. In void setup() staan enkele initialisatiefuncties om de Arduino-pinnen die aan verschillende externe hardware gekoppeld zijn, op te warmen.
INPUT: Er zijn 2 interrupt-gebaseerde invoerknoppen voor uitgangsspanning verhogen/verlagen, menu openen (niet beschikbaar in deze versie). INT0 & INT1 op Arduino-pin 2 en 3 zijn gecodeerd voor VALLEND FLANK INTERRUPT. Je ziet 2 condensatoren parallel aan de mechanische schakelaars voor debouncing. Code is geschreven om interrupts te triggeren wanneer de gebruiker op de schakelaars drukt om de uitgang via relais aan/uit te zetten of spanning te verhogen/verlagen (Beta).
OUTPUT: De 1306 OLED toont uitgangsinformatie door data te verkrijgen van ADC, interne timer (voor apparatuptime) en vlagvariabelen om de gebruiker te informeren over uitgang in-/uitschakelstatus. Gebaseerd op de U8G-bibliotheek print de OLED info als tekst en numeriek. Ik heb plannen voor grafische (analoge) weergave.
5 digitale pinnen van SSD1306 (OLED van Waveshare) clk, din, cs, d/c, res zijn verbonden met Arduino 10, 9, 11, 13, 12 pinnen en daarop geprogrammeerd. In de hoofdloop wordt de update_display()-functie elke keer aangeroepen om de info op de OLED bij te werken.
Interne Timer 1 van ATmega328P is geconfigureerd om elke 1 seconde periodiek te triggeren om de tijd bij te houden.
CONTROLE: De MCP4131 Digitale Potentiometer wordt bestuurd met increment_digipot() & decrement_digipot() functies waar data wordt uitgeklokt met juiste clocking en delay via Pin 6, 7, 8 als CS, Clk, Data-pinnen. Het is als trage zachte SPI. Omdat ik de hardware-SPI-pinnen al elders gebruikte, was dit de enige oplossing toen.
Twee digitale pinnen 4 & 5 worden gebruikt om het latch-relais te besturen. Een korte hoge puls wordt aan de relais-drijftransistors gevoerd om de 2 spoelen te energiseren om het relais om te schakelen. Dit gebeurt zowel automatisch (bij overbelasting/kortsluiting) als handmatig door de gebruiker.
ADC: De calc_VI()-functie in de hoofdloop voert analogRead uit om 20 keer gemiddelde spanning- en stroomgegevens op te halen en de variabelen bij te werken voor nieuwe informatie die vervolgens op het display wordt getoond.
De sketch is geschreven in meerdere tabs om code te organiseren voor verschillende functies geassocieerd met verschillende operaties. Er zijn ADC, Digipot, Display_Fn, Interrupt, Relay en Timer tabs die alle gebruiksgedefinieerde functies rangschikken. Ik zal proberen meer commentaar toe te voegen om alle functies uit te leggen, maar je zou het niet moeilijk moeten vinden omdat die functies gebaseerd zijn op meerdere Arduino-functies die bepaalde taken uitvoeren.
Beperkingen
Er zijn enkele serieuze beperkingen van dit apparaat:
- Spanning kan niet onder 2,0V gaan
- Uitgangsspanning is getrapt, niet continu
- Stroommeting creëert ground-shifting bij hoge stroom
- ADC-meting heeft lage resolutie
- Rendement is slechtst in de klasse bij lage spanning hoge belasting
- Niet-standaard, iets onveilige Li-Po-lading
Referenties
Je kunt meer leren over elk component in deze tutorials:
- Draaipotentiometer
- Knop-tutorial
Conclusie
Deze programmeerbare voeding helpt me om projecten/prototypes efficiënter te maken. Meting van spanning, stroom, vermogen zonder multimeter.
Code
Arduino Programmeerbare Draagbare Voeding (Arduino)
Versie 1.0.1 met pin-out info in commentaar
// Pin Reset, D0 & D1 voor sketch uploaden
// Pin D9,D10,D11,D12,D13 voor OLED-display besturing
// ADC A0 Pin voor V_boost meten
// ADC A2 Pin voor V_batt (LiPo) meten
// ADC A3 Pin voor I_Output (Load) meten
// ADC A4 Pin voor V_USB (Charging) meten
// ADC A5 Pin voor V_Output (Load) meten
// Latch Relay's 2 Spoelen Drijf-pinnen D4 & D5
#define RC1 4
#define RC2 5
// Gebruikersinvoerschakelaars op Pin D2 & D3
#define SW1 2
#define SW2 3
// Pin D6,D7,D8 voor Digitaal Pot Control Pins
#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 Control Pins
// SSD1306 oled waveshare(clk,din,cs,d/c,res); // DIT VOOR WAVESHARE
U8GLIB_SSD1306_128X64 u8g(10, 9, 11, 13, 12);
void setup(void) {
// scherm draaien, indien nodig
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 Versie 1.0.1 Beta (C/C++)
Geen preview (alleen download).
Code Versie 1.0.2 Beta (C/C++)
Bugfix voor tekst/box-uitlijning
Bugfix voor overbelasting-trip
Nog een paar bugs worden in de volgende release gefixt.
Geen preview (alleen download).
Code versie 1.0.3 (C/C++)
Bugfix: uitgangsrelais uitschakelen tijdens opstarten
Bugfix: uitgangsspanning automatisch op 5,00V zetten na opstarten
Geen preview (alleen download).
Schema's
Getekend op witbord!
https://circuits.io/circuits/4762970-arduino-based-programmable-power-supply
Productieproces
- Bouw een Klassiek Pong-spel op Arduino UNO met OLED-display – Stap-voor-stap Tutorial
- Slimme spaarpot bouwen: Muntenacceptor besturen met Arduino Nano
- Arduino Power Control Center: N-FET, P-FET, Relais & RTC Kit
- Arduino Temperatuurbewaking & Realtime Klok met 3.2" TFT-display
- Een LED bedienen via Bluetooth met Arduino – Eenvoudige DIY Handleiding
- Geoptimaliseerde Voedingsoplossingen voor Arduino Projecten
- Interactief Nextion HMI-weerstation met Arduino Mega en sensoren
- Bouw een DIY Voltmeter met Arduino en Nokia 5110 Display – Stap-voor-Stap Handleiding
- Uitgebreide Arduino Trainingskit met Mega 2560, Sensoren, Motoren en Custom PCB
- De Fridgeye-app bouwen met een Nextion-display: stapsgewijze handleiding
- Accurate zonnestralingsmeting met Arduino UNO en Ethernet Shield