Inhoudsopgave:

Digitale voeding op batterijen - Ajarnpa
Digitale voeding op batterijen - Ajarnpa

Video: Digitale voeding op batterijen - Ajarnpa

Video: Digitale voeding op batterijen - Ajarnpa
Video: Hoe werkt een multimeter. 2024, November
Anonim
Digitale voeding op batterijen
Digitale voeding op batterijen
Digitale voeding op batterijen
Digitale voeding op batterijen
Digitale voeding op batterijen
Digitale voeding op batterijen
Digitale voeding op batterijen
Digitale voeding op batterijen

Altijd al een voeding willen hebben die je onderweg kunt gebruiken, zelfs zonder een stopcontact in de buurt? En zou het niet gaaf zijn als het ook nog eens heel precies, digitaal en via pc bestuurbaar was?

In deze instructable laat ik je zien hoe je precies dat kunt bouwen: een digitale, op batterijen werkende voeding, die arduino-compatibel is en via de pc via USB kan worden bestuurd.

Een tijdje terug heb ik een voeding gebouwd van een oude ATX PSU, en hoewel het geweldig werkt, wilde ik mijn spel opvoeren met een digitale voeding. Zoals gezegd werkt hij op batterijen (2 lithiumcellen om precies te zijn) en kan hij maximaal 20 V leveren bij 1 A; dat is genoeg voor de meeste van mijn projecten die een nauwkeurige voeding vereisen.

Ik zal het hele ontwerpproces laten zien en alle projectbestanden zijn te vinden op mijn GitHub-pagina:

Laten we beginnen!

Stap 1: Functies en kosten

Functies en kosten
Functies en kosten

Functies

  • Constante spanning en constante stroommodi
  • Gebruikt een lineaire regelaar met weinig ruis, voorafgegaan door een tracking-preregulator om vermogensdissipatie te minimaliseren
  • Gebruik van onderdelen die met de hand kunnen worden gesoldeerd om het project toegankelijk te houden
  • Aangedreven door ATMEGA328P, geprogrammeerd met Arduino IDE
  • PC-communicatie via Java-toepassing via micro-USB
  • Aangedreven door 2 beschermde 18650 lithium-ioncellen
  • Banaanstekkers met een tussenafstand van 18 mm voor compatibiliteit met BNC-adapters

Specificaties:

  • 0 - 1A, stappen van 1 mA (10 bit DAC)
  • 0 - 20V, stappen van 20 mV (10 bit DAC) (echte 0V-werking)
  • Spanningsmeting: 20 mV resolutie (10 bit ADC)
  • Huidige meting:

    • < 40mA: 10uA resolutie (ina219)
    • < 80mA: 20uA resolutie (ina219)
    • < 160mA: 40uA resolutie (ina219)
    • < 320mA: 80uA resolutie (ina219)
    • > 320mA: 1mA resolutie (10 bit ADC)

Kosten

De complete voeding kostte me ongeveer $ 135, met alle eenmalige componenten. De batterijen zijn het duurste onderdeel ($ 30 voor 2 cellen), omdat ze beschermd zijn met 18650 lithiumcellen. Het is mogelijk om de kosten aanzienlijk te verlagen als er geen batterijwerking nodig is. Door de batterijen en het laadcircuit weg te laten, daalt de prijs tot ongeveer $ 100. Hoewel dit misschien duur lijkt, kosten voedingen met veel minder prestaties en functies vaak meer.

Als u het niet erg vindt om uw componenten via eBay of AliExpress te bestellen, zou de prijs met batterijen dalen tot $ 100 en $ 70 zonder. Het duurt langer voordat de onderdelen binnen zijn, maar het is een haalbare optie.

Stap 2: Schema en werkingstheorie

Schema en werkingstheorie
Schema en werkingstheorie

Om de werking van het circuit te begrijpen, zullen we naar het schema moeten kijken. Ik heb het opgedeeld in functionele blokken, zodat het makkelijker te begrijpen is; Ik zal dus ook stap voor stap de werking uitleggen. Dit deel is behoorlijk diepgaand en vereist een goede elektronica kennis. Als u alleen wilt weten hoe u het circuit moet bouwen, kunt u doorgaan naar de volgende stap.

Hoofdblok

De werking is gebaseerd op de LT3080-chip: het is een lineaire spanningsregelaar, die op basis van een stuursignaal spanningen kan verlagen. Dit stuursignaal wordt gegenereerd door een microcontroller; hoe dit wordt gedaan, wordt later in detail uitgelegd.

Spanningsinstelling

Het circuit rond de LT3080 genereert de juiste stuursignalen. Eerst bekijken we hoe de spanning wordt ingesteld. De spanningsinstelling van de microcontroller is een PWM-signaal (PWM_Vset), dat wordt gefilterd door een laagdoorlaatfilter (C9 & R26). Dit levert een analoge spanning op - tussen 0 en 5 V - evenredig met de gewenste uitgangsspanning. Aangezien ons uitgangsbereik 0 - 20 V is, zullen we dit signaal met een factor 4 moeten versterken. Dit wordt gedaan door de niet-inverterende opamp-configuratie van U3C. De versterking van de ingestelde pin wordt bepaald door R23//R24//R25 en R34. Deze weerstanden zijn 0,1% tolerant om fouten te minimaliseren. R39 en R36 doen er hier niet toe, omdat ze deel uitmaken van de feedbacklus.

Huidige instelling

Deze set-pin kan ook worden gebruikt voor de tweede instelling: huidige modus. We willen de stroomafname meten en de uitgang uitschakelen wanneer deze de gewenste stroom overschrijdt. Daarom beginnen we opnieuw met een PWM-signaal (PWM_Iset), gegenereerd door de microcontroller, dat nu laagdoorlaatgefilterd en verzwakt is om van een bereik van 0 - 5 V naar een bereik van 0 - 2 V te gaan. Deze spanning wordt nu vergeleken met de spanningsval over de stroomdetectieweerstand (ADC_Iout, zie hieronder) door de comparatorconfiguratie van opamp U3D. Als de stroom te hoog is, zal deze een led aanzetten en ook de ingestelde lijn van de LT3080 naar aarde trekken (via Q2), waardoor de uitgang wordt uitgeschakeld. Het meten van de stroom en het genereren van het signaal ADC_Iout wordt als volgt gedaan. De uitgangsstroom vloeit door de weerstanden R7 - R16. Deze zijn in totaal 1 ohm; de reden om 1R in de eerste plaats niet te gebruiken is tweeledig: 1 weerstand zou een hoger vermogen moeten hebben (hij moet minstens 1 W dissiperen), en door 10 1% weerstanden parallel te gebruiken, krijgen we een hogere precisie dan met een enkele weerstand van 1%. Een goede video over waarom dit werkt, is hier te vinden: https://www.youtube.com/embed/1WAhTdWErrU&t=1s Als er stroom door deze weerstanden vloeit, ontstaat er een spanningsval, die we kunnen meten, en het is geplaatst vóór de LT3080, aangezien de spanningsval erover de uitgangsspanning niet mag beïnvloeden. De spanningsval wordt gemeten met een verschilversterker (U3B) met een versterking van 2. Dit resulteert in een spanningsbereik van 0 - 2 V (daarover later meer), vandaar de spanningsdeler bij het PWM-signaal van de stroom. De buffer (U3A) is er om ervoor te zorgen dat de stroom die naar de weerstanden R21, R32 en R33 vloeit niet door de stroomdetectieweerstand gaat, wat de uitlezing zou beïnvloeden. Merk ook op dat dit een rail-to-rail opamp moet zijn, omdat de ingangsspanning op de positieve ingang gelijk is aan de voedingsspanning. De niet-inverterende versterker is alleen voor de koersmeting, voor zeer nauwkeurige metingen hebben we de INA219-chip aan boord. Deze chip stelt ons in staat om zeer kleine stromen te meten, en wordt aangesproken via I2C.

Extra dingen

Aan de uitgang van de LT3080 hebben we nog wat meer spullen. Allereerst is er een stroomput (LM334). Deze trekt een constante stroom van 677 uA (ingesteld door weerstand R41), om de LT3080 te stabiliseren. Het is echter niet verbonden met aarde, maar met VEE, een negatieve spanning. Dit is nodig om de LT3080 tot 0 V te laten werken. Bij aansluiting op aarde zou de laagste spanning ongeveer 0,7 V zijn. Dit lijkt laag genoeg, maar houd er rekening mee dat dit ons verhindert de voeding volledig uit te schakelen. De zenerdiode D3 wordt gebruikt om de uitgangsspanning te klemmen als deze boven 22 V komt, en de weerstandsdeler verlaagt het uitgangsspanningsbereik van 0 - 20 V tot 0 - 2 V (ADC_Vout). Helaas bevinden deze circuits zich aan de uitgang van de LT3080, wat betekent dat hun stroom zal bijdragen aan de uitgangsstroom die we willen meten. Gelukkig zijn deze stromen constant als de spanning constant blijft; zodat we de stroom kunnen kalibreren wanneer de belasting eerst wordt losgekoppeld.

Laad pomp

De negatieve spanning die we eerder noemden wordt opgewekt door een merkwaardig circuit: de ladingspomp. Voor de werking zou ik hier verwijzen: https://www.youtube.com/embed/1WAhTdWErrU&t=1s Het wordt gevoed door een 50% PWM van de microcontroller (PWM)

Boost-omzetter

Laten we nu eens kijken naar de ingangsspanning van ons hoofdblok: Vboost. We zien dat het 8 - 24V is, maar wacht, 2 lithium cellen in serie geeft maximaal 8,4 V? Inderdaad, en daarom moeten we de spanning opkrikken, met een zogenaamde boost-converter. We kunnen de spanning altijd verhogen tot 24 V, ongeacht welke output we willen; dit zou echter veel stroom verspillen in de LT3080 en het zou lekker heet worden! Dus in plaats van dat te doen, verhogen we de spanning tot iets meer dan de uitgangsspanning. Ongeveer 2,5 V hoger is geschikt om rekening te houden met de spanningsval in de stroomdetectieweerstand en de uitvalspanning van de LT3080. De spanning wordt ingesteld door weerstanden op het uitgangssignaal van de boost-converter. Om deze spanning on-the-fly te wijzigen, gebruiken we een digitale potentiometer, de MCP41010, die wordt aangestuurd via SPI.

Batterij opladen

Dit leidt ons naar de echte ingangsspanning: de batterijen! Omdat we beveiligde cellen gebruiken, hoeven we ze alleen maar in serie te zetten en klaar! Het is belangrijk om hier beschermde cellen te gebruiken, om overstroom of overontlading en dus beschadiging van de cellen te voorkomen. Nogmaals, we gebruiken een spanningsdeler om de batterijspanning te meten en deze terug te brengen tot een bruikbaar bereik. Nu naar het interessante deel: het laadcircuit. Hiervoor gebruiken we de BQ2057WSN-chip: in combinatie met de TIP32CG vormt deze in feite zelf een lineaire voeding. Deze chip laadt de cellen op via een geschikt CV CC-traject. Aangezien mijn batterijen geen temperatuursonde hebben, moet deze ingang worden gekoppeld aan de helft van de batterijspanning. Hiermee is het spanningsregelgedeelte van de voeding afgesloten.

5V-regelaar

De 5 V voedingsspanning van de arduino wordt gemaakt met deze eenvoudige spanningsregelaar. Het is echter niet de meest nauwkeurige 5 V-uitgang, maar dat wordt hieronder opgelost.

2,048 V spanningsreferentie

Deze kleine chip levert een zeer nauwkeurige 2,048 V spanningsreferentie. Dit wordt gebruikt als referentie voor de analoge signalen ADC_Vout, ADC_Iout, ADC_Vbatt. Daarom hadden we spanningsdeler nodig om deze signalen terug te brengen naar 2 V. Microcontroller Het brein van dit project is de ATMEGA328P, dit is dezelfde chip die in de Arduino Uno wordt gebruikt. We hebben de meeste stuursignalen al doorgenomen, maar er zijn toch enkele interessante toevoegingen. De roterende encoders zijn verbonden met de 2 enige externe interrupt-pinnen van de arduino: PD2 en PD3. Dit is nodig voor een betrouwbare software-implementatie. De schakelaars eronder gebruiken een interne pullup-weerstand. Dan is er deze vreemde spanningsdeler op de chipselectielijn van de potentiometer (Pot). Een spanningsdeler op een uitgang, waar is dat goed voor; je zou kunnen zeggen. Zoals eerder vermeld, is de 5 V-voeding niet erg nauwkeurig. Het zou dus goed zijn om dit nauwkeurig te meten en de duty cycle van het PWM-signaal hierop aan te passen. Maar omdat ik geen vrije ingangen meer had, moest ik een pin dubbel laten trekken. Als de voeding opstart, wordt deze pin eerst als ingang ingesteld: hij meet de voedingsrail en kalibreert zichzelf. Vervolgens wordt het ingesteld als een uitvoer en kan het de chipselectielijn aansturen.

Beeldschermstuurprogramma

Voor het display wilde ik een algemeen verkrijgbaar - en goedkoop - hitachi lcd-scherm. Ze worden aangedreven door 6 pinnen, maar aangezien ik geen pinnen meer had, had ik een andere oplossing nodig. Een shift register om te redden! Met de 74HC595 kan ik de SPI-lijn gebruiken om het display te bedienen, waardoor ik slechts 1 extra chipselectielijn nodig heb.

FTDI

Het laatste onderdeel van deze voeding is de verbinding met de wrede, buitenwereld. Hiervoor moeten we de seriële signalen omzetten in USB-signalen. Dit wordt gedaan door een FTDI-chip, die is aangesloten op een micro-USB-poort voor eenvoudige aansluiting.

En dat is alles!

Stap 3: PCB & elektronica

PCB & Elektronica
PCB & Elektronica
PCB & Elektronica
PCB & Elektronica
PCB & Elektronica
PCB & Elektronica
PCB & Elektronica
PCB & Elektronica

Nu we begrijpen hoe het circuit werkt, kunnen we beginnen met het bouwen ervan! Je kunt de print gewoon online bestellen bij je favoriete fabrikant (de mijne kost ongeveer $ 10), de gerber-bestanden zijn te vinden op mijn GitHub, samen met de stuklijst. Het in elkaar zetten van de print is dan eigenlijk een kwestie van de componenten op hun plaats solderen volgens de zeefdruk en de stuklijst.

De eerste stap is het solderen van de SMD-componenten. De meeste zijn gemakkelijk met de hand te doen, behalve de FTDI-chip en de micro-USB-connector. U kunt daarom voorkomen dat u die 2 componenten zelf soldeert en in plaats daarvan een FTDI-breakoutboard gebruikt. Ik heb header-pinnen geleverd waar dit op kan worden gesoldeerd.

Wanneer het SMD-werk is voltooid, kunt u doorgaan met alle componenten met doorlopende gaten. Deze zijn heel eenvoudig. Voor de chips kun je beter sockets gebruiken in plaats van ze rechtstreeks op het bord te solderen. Het verdient de voorkeur om een ATMEGA328P met Arduino-bootloader te gebruiken, anders moet je deze uploaden met de ICSP-header (hier weergegeven).

Het enige onderdeel dat wat meer aandacht nodig heeft, is het lcd-scherm, aangezien deze schuin gemonteerd moet worden. Soldeer er enkele mannelijke schuine headers op, met het plastic stuk naar de onderkant van het scherm gericht. Dit zorgt voor een goede plaatsing van het scherm op de pcb. Daarna kan het op zijn plaats worden gesoldeerd, net als elk ander doorlopende component.

Het enige wat je nog hoeft te doen is om 2 draden toe te voegen, die zullen worden aangesloten op de banaanterminals op de voorplaat.

Stap 4: Case & Montage

Koffer & Montage
Koffer & Montage
Koffer & Montage
Koffer & Montage
Koffer & Montage
Koffer & Montage

Met de printplaat gemaakt, kunnen we verder met de zaak. Ik heb de PCB specifiek rond deze hammondbehuizing ontworpen, dus het wordt niet aanbevolen om een andere behuizing te gebruiken. U kunt echter altijd een hoesje met dezelfde afmetingen 3D-printen.

De eerste stap is het voorbereiden van het eindpaneel. We zullen wat gaten moeten boren voor schroeven, schakelaars, enz. Ik heb dit met de hand gedaan, maar als je toegang hebt tot een CNC, zou dat een nauwkeurigere optie zijn. Ik heb de gaten gemaakt volgens het schema en de schroefgaten getapt.

Het is een goed idee om nu wat zijdepads toe te voegen en ze op hun plaats te houden met een kleine druppel superlijm. Deze isoleren de LT3080 en TIP32 van de achterplaat, terwijl warmteoverdracht nog steeds mogelijk is. Vergeet ze niet! Gebruik bij het vastschroeven van de chips op het achterpaneel een mica-ring om voor isolatie te zorgen!

We kunnen ons nu concentreren op het voorpaneel, dat gewoon op zijn plaats schuift. We kunnen nu de banaanstekkers en de knoppen voor de roterende encoders toevoegen.

Met beide panelen op hun plaats kunnen we het geheel nu in de behuizing plaatsen, de batterijen toevoegen en alles sluiten. Zorg ervoor dat u beschermde batterijen gebruikt, u wilt niet dat de cellen ontploffen!

Op dit punt is de hardware klaar, het enige dat overblijft is om er wat leven in te blazen met de software!

Stap 5: Arduino-code

Arduino-code
Arduino-code

Het brein van dit project is de ATMEGA328P, die we gaan programmeren met de Arduino IDE. In deze sectie zal ik de basiswerking van de code doornemen, de details zijn te vinden als opmerkingen in de code.

De code doorloopt in principe deze stappen:

  1. Seriële gegevens uit java lezen
  2. Poll-knoppen
  3. Spanning meten:
  4. Stroom meten:
  5. Stroom meten met INA219
  6. Seriële gegevens naar java verzenden
  7. Boostconvertor configureren
  8. Batterij opladen
  9. Scherm bijwerken

De roterende encoders worden afgehandeld door een onderbrekingsserviceroutine om ze zo snel mogelijk te laten reageren.

De code kan nu via de micro-USB-poort naar het bord worden geüpload (als de chip een bootloader heeft). Bord: Arduino pro of pro mini Programmeur: AVR ISP / AVRISP MKII

Nu kunnen we kijken naar de interactie tussen de Arduino en de pc.

Stap 6: Java-code

Java-code
Java-code

Voor het loggen van data en het aansturen van de voeding via de PC heb ik een java applicatie gemaakt. Hierdoor kunnen we het bord eenvoudig bedienen via een GUI. Net als bij de Arduino-code zal ik niet op alle details ingaan, maar een overzicht geven.

We beginnen met het maken van een venster met knoppen, tekstvelden etc; basis GUI-dingen.

Nu komt het leuke gedeelte: het toevoegen van de USB-poorten, waarvoor ik de jSerialComm-bibliotheek heb gebruikt. Zodra een poort is geselecteerd, luistert java naar binnenkomende gegevens. We kunnen ook gegevens naar het apparaat sturen.

Bovendien worden alle binnenkomende gegevens opgeslagen in een csv-bestand, voor latere gegevensverwerking.

Bij het uitvoeren van het.jar-bestand moeten we eerst de juiste poort kiezen in het vervolgkeuzemenu. Na het aansluiten komen er gegevens binnen en kunnen we onze instellingen naar de voeding sturen.

Hoewel het programma vrij eenvoudig is, kan het erg handig zijn om het via een pc te besturen en de gegevens te loggen.

Stap 7: Succes

Succes!
Succes!
Succes!
Succes!
Succes!
Succes!

Na al dit werk hebben we nu een volledig functionele voeding!

Ik moet ook enkele mensen bedanken voor hun steun:

  • Het project was gebaseerd op het uSupply-project van EEVBLOG en zijn Rev C-schema. Dus een speciale dank aan David L. Jones voor het vrijgeven van zijn schema's onder een open source-licentie en het delen van al zijn kennis.
  • Een grote dank aan Johan Pattyn voor het produceren van de prototypes van dit project.
  • Ook Cedric Busschots en Hans Ingelberts verdienen lof voor de hulp bij het oplossen van problemen.

We kunnen nu genieten van onze eigen zelfgemaakte voeding, wat goed van pas zal komen tijdens het werken aan andere geweldige projecten! En het belangrijkste: we hebben onderweg veel geleerd.

Als je dit project leuk vond, stem dan op mij in de powersupply-wedstrijd, ik zou het erg op prijs stellen!https://www.instructables.com/contest/powersupply/

Voedingswedstrijd
Voedingswedstrijd
Voedingswedstrijd
Voedingswedstrijd

Tweede prijs in de Power Supply Contest

Aanbevolen: