Spanningsbron met "Erg" hoge resolutie

blackdog

Golden Member

Hi!

Er zijn weer een aantal aanpassingen gedaan aan het schema, er is nog meer info geplaats, zodat het bouwen/begrijpen makkelijker word. (dat hoop ik)
De transistor die de energie levert aa nde uitgang heb ik iets degelijker gemaakt, dit is nu een BC337-40,
de hoge HFE versie van deze transistor en zover ik weet nog voldoende geproduceert, maar de BC550C mag ook als jullie dit willen.
Q1, de BC560C het liest zo houden, maar een BC327-40 mag hier ook, en dan nog Q3, deze is niet kritisch, ik heb de 2N3904 gebruikt met testenm een BC550C of BC337-40 mag hier ook.
Ik vind het prettiger vooral bij het bouwen en storing zoeken dat de transistoren een verschillend type nummer hebben.
Zoals het nu in het schema staat werkt het goed en geeft geen verwarring, win win dus :-)
Ik bouw er twee stuks van, dus de hoeveelheid van verschillende componenten op mijn "bom" lijst zal mij aan mijn kont roesten ;-)

Bij de relais is aangegeven hoe de contacten zijn gebruikt, en het uitgangspunt is zoals ook al in het schema staat dat van alle relais de "reset" spoel is aangestuurd geweest.
De relaisspoelen blijven nooit onder spanning staan, dit scheelt energie, maar dit is vooral gedaan om geen extra thermokoppels te creëren.
Bij sommige relaiscontacten staat b.v. dit: RE-4 ab dit beteken dat van Relais-4 de twee wisselcontacten parallel staan, dit is gedaan voor het verlagen van de contactweerstand.

Om de 10Ω weerstanden te beschermen op het 20mV bereik, heb ik over deze 10Ω weerstand 2x een 1N4007 geplaatst.
Ik ben begonnen met het testen van Schottky dioden over deze weerstand, ik dacht, de spanning is zo laag op dit punt (max20,1mV) dat het met de lekstromen wel mee zou valllen, NEE dus!!!
Niet alleen gaf dit bij het 20mV bereik 15 tot 30uV fout door de lekstroom, maar deze was ook vrij temperatuur gevoelig.
De 1N4007 had dit probleem in het geheel niet, en tijdens het typen schiet mij te binnen dat ik wel 0,1uF over de 10Ω
weerstand moet zetten i.v.m. eventueel HF storingen en die staat er nu dan ook in.
Ook is in dit schema een extra condensator van u47 geplaatst over de -2,1V voeding naar massa, deze was ik ook vergeten.

Het plaatje is weer klikbaar voor een hoge resolutie versie.
http://www.bramcam.nl/NA/LowCostCal/Variabel-Ref-55-Klein.png

Verder gaf benleentje al aan dat hij het in een groter kastje zou bouwen, ik volg hem hierin.
Ik had nog één kastje in de blauwe serie die iets breder was en ook iets langer, wat niet nodig is, maar het zij zo.
http://www.bramcam.nl/NA/LowCostCal/Variabel-Ref-56.png

Deze foto geeft de afmetingen weer aan t.o.v. een CD doosje.
http://www.bramcam.nl/NA/LowCostCal/Variabel-Ref-57.png

Er is nu wat meer ruimte tussen de knoppen mogelijk en ook de drukknopjes hoeven niet zo dicht bij elkaar te zitten, zelfs voor de LEDS's is er nu genoeg plaats.
Er zijn misschien CO'ers die zich afvragen waar de 230V schakelaar zit, nou... achterop gaat die komen, ik wil alle stoorbronnen zoveel mogelijk bij de electronica vandaan houden.
De gebruikte trafo is een kleintje met een in verhouding laag nullast vermogen, mijn trafo is niet meer te koop, deze is nog in de 220V versie gewikkeld.
Het trafo'tje daar ik mee teste is 2,8VA en 2x 18V.

Maar er zijn er verchillende te koop die goed bruikbaar zijn ondermeer van HAHN, dit is er één die ik op mijn bestel lijstje heb staan bij TME: HAHN BV EI 304 2843
Deze trafo is 21V vol belast, maar 33,4V onbelast, dus de elco moet van voldoende hoge spanning zijn.
Ook de HAHN BV EI 304 2084 is denk ik goed bruikbaar, deze is 18V onder vollast met 30V onbelast en ook deze heeft het lage nullast verbruik.
Waarom heb ik dit type gekozen, omdat de "No Load Powerloss" kleiner is dan 0,7-Watt.
Hoe minder warmte er in het kastje gegenereerd wordt hoe stabieler de uitgangsspanning blijft en het opwarmen ook minder tijd in beslag neeemt.

Al mijn werk om goede compoenten uit te kiezen gooi je natuurlijk weg als je het kastje dan alsnog tussen andere warmte bronnen plaatst!
De mijne is bedoel om te gebruiken op tafel, dat de 230V schakelaar dan achterop zit en ook de DVM aansluiting achterop, is dan geen enkel probleem.
Dat is ook de rede dat ik een niet te groot kastje wil hebben, het is meestal al vol goenoeg op mijn tafel :-)

Zoals meestal: Shooooooot @ IT!

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
benleentje

Golden Member

l mijn werk om goede componenten uit te kiezen gooi je natuurlijk weg als je het kastje dan alsnog tussen andere warmte bronnen plaatst!

IS een goed punt.

Maar stel het kastje staat wel tussen allerlei apparatuur die bv altijd aanstaat en de temp daar redelijk constant is dan maakt het toch ook weer niet zo veel uit. Deze apparatuur is dan voornamelijk diverse DMM's. Het gaan neem ik aan toch om temperatuur schommelingen tijdens het meten maar niet over de temperatuur verandering over een dag.

Wat zijn nu de huidige afmetingen van je frontje en minimale iepte die nodig is? Dan kan ik alvast naar een kastje gaan zoeken.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.
blackdog

Golden Member

Hi Leendert,

Hier de link van de behuizing die ik ook ga gebruiken maar dan in het rood, de behuizing is van HAMMOND en dus vrij prijzig.

Hieronder de link naar Conrad.
https://www.conrad.nl/nl/hammond-electronics-1455t1601rd-profielbehuiz…

De link naar Digikey.
https://www.digikey.com/products/en?mpart=1455T1601RD&v=164

En als laatste een link naar een pagina bij Mouser Nederland.
http://nl.mouser.com/Hammond/Enclosures/Enclosures-Boxes-Cases/_/N-5g3…

Maar kies vooral en kastje wat je zelf leuk vind, ik doe het met wat ik hier op voorraad heb.

Kijk ook hier eens, de Nederlandse importeur van de MODU kastjes waarvan ik een klein testkastje had besteld, maar dat was jemmer genoeg te klein voor dit project.
Het kleine zwarte kastje is dus een MODU Galaxy.
https://eltim.eu/index.php?action=page&group_id=10000130&lang=en

Maar ik hou je niet tegen om een kastje te kiezen uit de Economica series.
https://eltim.eu/index.php?item=&action=page&group_id=10000132&lang=en

Ik hoop dat je hier iets aan hebt.

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
benleentje

Golden Member

Ik heb daar zeker iets aan.

Ik was ook al van plan om zelf naar eigen smaak te gaan kijken vandaar ik even de maten wou hebben.

Toch wel bizar dat mouser 60% goedkoper is dan conrad Conrad. Of Conrad 250% Duurder is, het is maar hoe je er naar kijken wil.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.

Op 10 september 2017 22:31:53 schreef benleentje:

Toch wel bizar dat mouser 60% goedkoper is dan conrad Conrad. Of Conrad 250% Duurder is, het is maar hoe je er naar kijken wil.

Conrad heeft dat met meeste producten. Je moet de verschillen maar eens nemen bij een volgend project tussen Farnell, Mouser, Digi Key en Conrad. De verschillen zullen duidelijk zijn :)

Ha benleentje,

Dat zijn mooie kastjes ik had het printje klaar maar nu zijn de relais iets groter uitgevallen.
Op zich niet zo'n probleem kan opschuiven ga je de relais van @blackdog bestellen?
En de trafo doe je dat op de zelfde manier dus de spanning rail opschuiven (virtuele nul) om negatief te maken of heb je ruimte in je kastje om ook de negatieve spanning uit de trafo te halen.

@blackdog,

Ik had even problemen met de laptop maar heb je vraag gezien.
Dat heb ik even aan de kant gelegd was een brainstorm tussen door en dit gaat niet goed met dat type opamp maar een opamp erachter geen probleem het ruisgetal is dan toch al gemaakt.
Maar voor de uitleg kan een ieder verwijzen naar het Miller theorema hierin (goed tot je nemen) wordt het behandeld.
Het is je opamp voor de gek houden :) maar let op niet elke opamp is een dezelfde opamp dus kijk hoe een en ander inwendig is opgebouwd.

Ik heb voor mijn low noise versterker ook een referentie nodig daarom leek mij dit wel aardig om een en ander te combineren aan de andere kant dan lopen er twee zaken door elkaar heen en dat maakt het er ook niet duidelijker op.

Groet Henk.

Everything should be as simple as possible, but not simpler.
benleentje

Golden Member

Ik wil alles maar precies hetzelfde houden als blackdog qua componenten.
Ik heb een transformator gevonden van 2x18V @45mA18. dat is dus 1,6W.
Of nog 1 van 18,5V @ 0.6VA dat is 32mA

Is 1 van deze bruikbaar of net te klein?

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.
blackdog

Golden Member

Hi benleentje,

Ik ben nog aan het meten met trafo's dioden en elco's met de LM317HV...
Het voedingschema heb ik nog niet gepresenteerd, dus wacht nog even.

Omdat ik heb besloten een Arduino te gebruiken voor de relais sturing, komt er nog zo'n 10mA bij aan belasting van de voeding.
Die Arduino moet dan ook de meest simpel zijn, om het stroomverbruik te dimmen.
(nee ik heb het niet over software matige instellingen)
Dit wordt dan een Arduino op waarschijnlijk 8MHz, geen serial converter on board, en de LED's gaan er ook af.
De Arduino gaat BS170 Fet's aansturen die een puls naar de spoelen van de relais stuurt voor zeg 0,2 seconde.
De voeding voor de relais wordt via een serie weerstand en een dikke elco gescheiden van de hoofdvoeding.
Hierdoor komt de energie voor de relais uit een aparte buffer elco en door de korte pulstijd merk je daar dan niets van op de hoofdvoeding.

Het schema dat ik ga plaatsen van het voedingsdeel maakt het geheel duidelijker.
De aansturing van de BS170 kost geen enkele energie, de signaal LEDS die de status aangeven zijn LED's die minder dan 1mA verbruiken voor Laser helderheid :-)

Ik denk dat het uit gaat komen op een trafo die 3-Watt, dit met de electronische sturing d.m.v. relais.
De simpele versie met de 4 voudige thumbler vebruikt minder stroom en heeft geen ledjes voor signalering.

18,5V bij 32mA is in ieder geval veel te klein.
Als je het trafo'tje in handen hebt, knoop er een brugcel aan en een 1000uF elco, belast hem dan met 25mA en meet de spanning over de elco,
deze moet dan bij 220V Netspanning minimaal 31V DC zijn.

Ik ben dus bezig de omstandigheden voor mijn trafo'tje dat ik heb, bij 220V Netspanning nog goed te laten werken.
Er is niets mis mee om een 24V 3 a 4VA trafo te gebruiken, dan zit je niet zo krap met je dropout spanning zoals bij mijn trafo.

Er zijn hier een aantal van die kleine trafo's door mijn handen gegaan en ik heb er aan gemeten.
Er zijn grote verschillen tussen HAHN, Block en wat andere merken transformatoren.
Dat is ondermeer de DC weerstand van de wikkelingen, de inductie van de Netkant, nullast vermogen, ga zo maar door...
Ik doe dit ook om meer inzicht te krijgen in die kleine trafo's waar ik er een stuk of 20 van heb liggen in verschillende vermogens en spanningen.

Een 24V trafo is dus OK, dat zal je dan iets meer warmte in het kastje gaan geven, maar ik weet niet of die iets grotere trafo
veel afdoet aan de stabiliteit, want... het is geen 6,5 digit calibrator, die 5 uur binnen 1PPM moet blijven :-)

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
benleentje

Golden Member

Ok prima dan wacht ik het wel even af. Deze trafo lagen toevallig in een lade dus heb er niet speciaal naar gezocht.

Ik heb nog wel een 24V 3fase 11kVA liggen, zou genoeg moeten zijn.

[Bericht gewijzigd door benleentje op maandag 11 september 2017 21:06:20 (23%)

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.
blackdog

Golden Member

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
blackdog

Golden Member

Hi,

Omdat Henk even iets anders aan het doen is, zal ik jullie maar proberen geestelijk te verrijken met wat info over het boorstrappen van de voedingsspanningen van een opamp. :-)

Het eerste document:
www.bramcam.nl/NA/LowCostCal/Bootstrapping_Your_Op_Amp_Yields_Wide_Vol…

En het tweede document, kijk bij figuur 14, dat is ook een manier om de voeding van een opamp te bootstrappen.
www.bramcam.nl/NA/LowCostCal/AN106.pdf

Happy Reading!

Groet,
Blackdog

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
blackdog

Golden Member

Hi,

Hier is een lijstje dat ik gebruik om later de code te schrijven in de Arduino en het voor mijzelf op een rijtje te krijgen
hoeveel toets'jes/ relais / LED's ik nodig heb voor de bediening, dit is de eerste opset!

c code:


Druktoetsjes
A
Functie:	Output Enable / Disable      : Processor Controled,	Processor Pin:

B
Functie:	20V Range                    : Processor Controled,	Processor Pin:

C
Functie:	2V Range                     : Processor Controled,	Processor Pin:

D
Functie:	20mV Range                   : Processor Controled,	Processor Pin:


LED's
Power:		Rood / Groene LED            : Processor Controled,	Processor Pin:
Led is eerst Rood en na X seconde wordt de LED Groen, en de schakeling gaat in de 20mV stand staan.


Current Limit:	Groene LED High Efficiency Low Level.

20V Range:	Rode Low Current LED         :Processor Controled,	Processor Pin:

2V Range:	Rode Low Current LED         : Processor Controled,	Processor Pin:

20mV:		Rode Low Current LED         : Processor Controled,	Processor Pin:


Relais
1
Functie:	Output Enable                : Processor Controled,	Processor Pin:
		Output Disable               : Processor Controled,	Processor Pin:

2
Functie:	20V / 2V Range - Set         : Processor Controled,	Processor Pin:
		20V / 2V Range - Reset       : Processor Controled,	Processor Pin:

3
Functie:	Sense 20V /2V Range - Set    : Processor Controled,	Processor Pin:
		Sense 20V /2V Range - Reset  : Processor Controled,	Processor Pin:

4
Functie:	20mV Range - Set             : Processor Controled,	Processor Pin:
		20mV Range - Reset           : Processor Controled,	Processor Pin:

Trafo
Dan nog even een PDF over de kleine trafo's, en deze is van de fabrikant HAHN.
Kijk op de volgende pagina's pagina 29 t/m 32 van het onderstaande document.
Kijk naar het vermogen van de trafo, kijk naar het "No Load Power Loss" de nominale trafo spanning en de onbelaste trafo spanning.
Er is dan ook nog het gegeven of de trafo wel of niet kortsluitvast is, lekker veel variabelen :-)
www.bramcam.nl/NA/LowCostCal/Hahn-E.pdf

Relais
Ik had de datasheet van het gebruikte relais nog niet laten zien, bij deze...
www.bramcam.nl/NA/LowCostCal/az832p.pdf

Arduino
Verder ben ik nog aan het uitzoeken hoe ik een kleine Arduino zo zuinig mogelijk kan maken.
Als ik hier meer van weet, zal ik hier laten zien hoe ik het gedaan heb,
natuurlijk eerste zoals ik al eerder aangaf de LED's die op het printje zit te verwijderen.

Eerst nog even een kleine interface maken zodat ik goed de stroom kan meten zonder de Ri van de voeding te veel te vergroten.
Dus de "Burden Voltage" klein te houden, zoiets dus als de "Micro Curent" van Dave.
Mijn USB stroom metertje heeft een resolutie van 10ma en dat is niet genoeg.

Laters dus weer meer (als het werk het toelaat)

Groet,
Blackdog

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
blackdog

Golden Member

Hi,

Vandaag wat wezen testen met een Arduino Pro Mini om het stroomverbruik te achterhalen en te verlagen.
Na wat demolition *grin* op de print en wat software settings zit ik nu op ongeveer 3,5mA verbruik.
Dit kan trouwens nog veel lager met verdere software settings.
Dit is echter niet nodig daar ander verbruik het verbruik van de Arduino zullen overtreffen, zoals wat LED'jes ondanks dat dit "low Power" type zijn.

Om de relais goed te kunnen aansturen moet ik de eigenschappen van deze relais goed kennen.
Hiervoor heb ik een simpele test setup gemaakt die bestaat uit het ZETTLER Bipolaire relais, twee transistoren en een moderne functie generator.
De generator staat voor de test op 10Hz Puls met 10% duty cycle, er worden twee uitgangen gebruikt die uit fase zijn geplaatst.
Door deze testopset kan ik uitzoeken of de relais binnen specs zijn en hoeveel marge er is betreffende de minimale pulsbreedte voor het schakelen.

Uitleg Hameg Screenshot
Gele trace is de Reset puls uit de generator.
De blauwe trace is de Setpuls uit de generator.
De Lila trace is het Normal Open contact, het P contact hangt aan de +24V en er is te zien dat als de Set puls voorbij komt er 24V op de uitgang komt te staan.
http://www.bramcam.nl/NA/LowCostCal/ZETTLER-AZ832P-Dual-Coil-05.png

We zijn nu de Reset puls kwijt omdat er ingezoomd is, maar het gaat nu ook om de blauwe Setpuls en de Lila uitgangspuls.
Op dit plaatje is te zien dat na ongeveer 2,4mSec het relais is omgeschakeld, ook is er wat dender te zien wat nog iets meer meer is dan op dit plaatje.
De gene met een scherp oog, ziet dat ik de middeling op 16x heb staan :-)
De blauwe puls is hier 5mSec en rond de 2,5mSec begint het relais te haperen, wat trouwens ruim binnen de 3mSec typical waarde is.
De andere relais zal ik ook testen in deze opstelling zodat ik niet alles laat afhangen van dit eene relais wat natuurlijk een beetje dom zou zijn.
http://www.bramcam.nl/NA/LowCostCal/ZETTLER-AZ832P-Dual-Coil-06.png

Ik weet nu vrij zeker welke tijden er minimaal nodig zijn voor de pulsen die de Arduino uitgangen moeten leveren voor het betrouwbaar schakelen van dit bipolaire relais.
Nu gaan nadenken over hoe ik de software ga schrijven, waarschijnlijk erg simpel omdat de relais snel schakelen en ik het hierdoor simpel kan houden en minder tijd nodig heb.
Als ik het eerste stukje software klaar heb, zal ik het hier laten zien.

Dit is het weer voor nu.

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
benleentje

Golden Member

Net even wat zitten spelen met een 16bit AD converter. En heb met mijn stomme kop er per ongelijk 8V op de ingang gezet. En Ingang A0 is overleden gelukkig doen de andere 3 het nog wel. De chip kan max 10mA over zijn protectie dioden hebben.

Volgens mij levert deze spanningsbron deze stroom net niet. Dus als ik hiermee getest had was de ingang nog heel.

Is dat eventueel nog instelbaar te maken naar nog een lagere waarde of ga je dan stabiliteit problemen krijgen.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.
blackdog

Golden Member

Hi Leendert, :-)

De stroom kan natuurlijk nog lager, kijk naar R10 en R11, deze bepalen ondermeer het kantelpunt en de stroombegrensing.
Als je deze twee weerstaden omdraait wordt de maximale stroom 50% lager.

Ik ga nog wat metingen doen aan de filter opset, dit bestaat uit de twee 10K weerstanden C6 van 0,47uF, R10 en R11 samen met C7 van 10uF.
Zoals het nu is, is er een mooi laag kantelpunt en wordt zelfs ruis rond de 10 Hz al een beetje gefilterd.
Het liefst had ik dit kantelpunt nog lager gehad, maar ik heb dit al een deel terug geschaald en de rede is b.v. jouw opblaas actie. :-)

Dat is ook de rede dat dit meet apparaatje maar zo'n lage uitgangsstroom heeft, want ik wil er b.v. ook rechtstreeks een basis van een kleine transistor mee kunnen aansturen zonder de basis naar de eeuwige jachtvelden te helpen, of zoals jij een AD ingang heel houden als je aan het testen bent.
De energie in C7 van nu nog 10uF, kan alsnog een ingang opblazen als de uitgang op een hogere spanning staat dan b.v. een ingang kan hebben.

Deze schakeling is niet perfect, maar dat was ook niet de bedoeling een uitgebreide stroombeveiliging te maken, maar ik zie geen bezwaar R10 en R11 om te draaien om de stroom nog wat te verlagen.

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Op 31 augustus 2017 21:20:59 schreef blackdog:
en ja daar is wat ruis opgepikt door het breadboard en de extra ruis van de DMM op de 100mV stand.

Ik volg je artikel nu even, ik heb zelf dit apparaat niet nodig maar vind het wel interessant.
Ik zag in je test opstelling een aantal koolfilmweerstanden zitten en toen dacht ik hieraan.
Misschien dat het op deze schakeling weinig invloed heeft, maar toch...

blackdog

Golden Member

Hi Jeronimooo, :-)

Dat klopt, er zijn een aantal koolweerstanden aanwezig, de meeste niet van belang wat ruis en stabiliteit betreft.
Er waren in de testopstelling ook twee weerstanden aanwezig van een hoge waarde die een lage waarde metaalfilm trimde.
Deze dragen wel bij aan de ruis, maar dat is weinig.

De koolweerstanden komen niet in de definitive opstelling, en als het goed is heb je ook kunnen zien dat de ruis die ik tot 22Khz meette 1,5uV was.
De ruis aan de uitgang is erg laag zoals het nu is, natuulijk zou ik ook graag ruis beneden de 1Hz filteren,
maar zoals ik al aan Benleentje vertelde, heeft dat weer andere vervelende bij effecten,
en dan nog maar niet te spreken van het lastiger instellen van de uitgangsspanning, door het dan traag reagerende filter.

Groet,
Blackdog

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
benleentje

Golden Member

De energie in C7 van nu nog 10uF, kan alsnog een ingang opblazen als de uitgang op een hogere spanning.

Dan is het gewoon aanleren om de spanningsbron eerst naar 0 te draaien alvorens iets aan te sluiten.
Want met spanning omhoog draaien kan C7 enkel maar energie opnemen.

Gelukkig kost het printje maar een paar Euro.
Nadeel is dat ik weet 3 weken moet wachten :).

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.

Ha benleentje,

Welke versie heb je op het oog? ik heb het printje gebaseerd op de low kost versie.
Zonder trafo en gelijkrichter aan boord wel de -2.1V dus je hoeft alleen de 27V aan te bieden.
Voor het relais ben ik van de Zettler uitgegaan i.p.v. de teledyne.

Groet Henk.

Everything should be as simple as possible, but not simpler.
benleentje

Golden Member

Ik wou wel voor de High end gaan. :). Ik weet nog niet wat voor interconnect ik gebruiken tussen de voeding en het kastje.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.
blackdog

Golden Member

Hi, :-)

Het is al weer een tijdje geleden, maar omdat ik nu weer wat tijd heb en ik er ook zin in had,
ben ik begonnen aan de Arduino software om de schakelaars uit te lezen en de relais aan te sturen.

Het is allemaal geen Rocket Sience, maar voor mij nog steeds erg lasting!
Het is me uiteindelijk gelukt om een toggle button te maken en drie buttons die de relais gaan sturen.
De code kan simpeler maar dit wat ik nu heb is overzichtelijk en verbruikt weinig ruimte, zodat ik makkelijk ook nog een display kan aansturen.

Eerst even de voorlopige code laten zien voor de basis werking:

c code:


#include <Button.h>
#include "Timer.h"
Timer t;

Button button2(3);          // RE-2 20V - 2V range
Button button3(4);          // RE-3 Sense Relais
Button button4(5);          // RE-4 20mV range


byte resetPuls = 100;       // Debounce Time Enable Button
byte wait_20 = 20;          // Relais Timing
byte wait_40 = 40;          // Relais Timing
byte wait_80 = 80;          // Relais Timing

byte on_puls_20 = 20;       // Relais Timing
byte on_Puls_40 = 40;       // Relais Timing
byte on_Puls_80 = 80;       // Relais Timing

// Toggle Relais Setup
byte Enable_In = 2;          // Toggle Button Pin Setup
byte Enable_Out = 6;         // Relais driver output Setup
byte state = LOW;            // Preset Enable Output "Off"
byte reading;                // the current reading from the input pin
int previous = LOW;          // the previous reading from the input pin
long time = 0;               // the last time the output pin was toggled
long debounce = 100;         // the debounce time, increase if the output flickers


void setup() {

  pinMode(Enable_In, INPUT);
  pinMode(Enable_Out, OUTPUT);

	button2.begin();          // 20V Range
	button3.begin();          // 2V Range
	button4.begin();          // 20mV Range

  pinMode(6,OUTPUT);        // Mute Toggle Relais
  pinMode(7,OUTPUT);        // RE-2 Driver
  pinMode(8,OUTPUT);        // RE-3 Driver
  pinMode(9,OUTPUT);        // RE-4 Driver
  pinMode(10,OUTPUT);       // ResetPuls Relay Driver
}



void loop() {

// Toggle Enable Button  
  reading = digitalRead(Enable_In);
    if (reading == HIGH && previous == LOW && millis() - time > debounce) {
    if (state == HIGH)
      state = LOW;
    else
      state = HIGH;
    time = millis();    
  }

  digitalWrite(Enable_Out, state);
  previous = reading;

  
// 20V Range Button
  if (button2.pressed()) {
  digitalWrite(10, HIGH);
  delay(resetPuls);                 // 0,1 Seconde Reset Puls
  digitalWrite(10, LOW);  
  digitalWrite(7, HIGH); 
  delay(on_Puls_40);                // 40mSec Setpuls Relais-2
  digitalWrite(7, LOW);   
  }


// 2V Range Button
  if (button3.pressed()) {
  digitalWrite(10, HIGH);
  delay(resetPuls);                 // 0,1 Seconde Reset Puls
  digitalWrite(10, LOW);  
  digitalWrite(8, HIGH);
  delay(on_Puls_40);                // 40mSec Setpuls Relais-2
  digitalWrite(8, LOW);   
  }


// 20mV Range Button
  if (button4.pressed()) {
  digitalWrite(10, HIGH);
  delay(resetPuls);                 // 0,1 Seconde Reset Puls
  digitalWrite(10, LOW);  
  digitalWrite(9, HIGH);
  delay(on_Puls_40);                // 40mSec Setpuls Relais-2
  digitalWrite(9, LOW);   
  }

  
}

De eerste druktoets die "Enable_In" heet en aan pin-2 zit heeft een toggle functie, klik aan, klik uit.
De andere drie druktoetsjes heten: button2, button3 en button4.
Als één van deze drukknoppen wordt gebruikt, dan word eerst uitgang-10 Hoog "digitalWrite(10, HIGH)" en dit genereerd in de eerste opset van deze code een reset puls, die alle drie de relais in de ruststand brengt.

Daarna volgt de code die de uitgangen die bij de drukknop hoort hoog gemaakt.
Zoals het nu in de code staat, is echt recht toe recht aan...

Als ik de tabel heb opgetekend voor de drie bipolaire relais welke contacten in welke modes open of dicht staan,
pas ik de code zo aan, dat er zo min mogelijk relais omgeschakeld hoeven worden.
Het is namelijk niet altijd nodig dat er b.v. een reset puls wordt gegeven.
De timing in de code hierboven is voor de LED's die ik nu als indicatie gebruik.
De relais zelf minder dan 5mSec nodig hebben en dat is lastig testen.

De bedoeling is dat ik er een Nokia display aan hang die de status aangeeft van de keuzes die gemaakt zijn met de drukknoppen.

Dan heb ik ook nog één plaatje van mijn testsetup, deze laat zien dat ik de tweede button bedien en de foto is net gemaakt op het moment
dat uitgang-10 hoog is, de witte LED geeft de reset puls aan.
Een korte tijd later gaat de rode LED voor 40mSec aan.
De meest linker LED (groen) is de toggle LED die door de eerste button bediend wordt.
http://www.bramcam.nl/NA/LowCostCal/LowCostCal-60.png

Laters meer, nu gaar :-)

Groet,
Blackog

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
blackdog

Golden Member

Hi,

Er is weer een beetje voortgang geweest aan mijn hoge resolutie spanningsbron.
Het schema is wat aangepast, er is nu geen verwijzing meer betreffende "normaly Open" en "Normaly Closed" contacten.
De rede is dat die er eigenlijk niet zijn, je kan beter spreken bij deze bipolaire relais van "Set" en "Reset" contacten.
De contactnummer staan nu ook in het schema vermeld om duidelijker te maken welke contacten nu wel of niet doorverbonden zijn.

De contact positie in dit schema is de 20V stand, het schema heeft echter ook nog een 2V stand en een 20mV stand.
Strak bij de software bespreking leg ik uit waarom ik voor een andere bereik kies na het inschakelen.

Voor de gene die het vergeten zijn of geen zin hebben om terug te lezen, de rede van de bipolaire relais is dat deze niet warm worden als ze bekrachtigt zijn.
Hierdoor heb je niet de drift door het Seebeck effect in de relais, vooral van belang bij kleine uitgangsspanningen.
Verder heb ik ook hiervoor gekozen om de aansturing te leren programmeren.
Daarom ben ik ondermeer met de Arduino typen controlers gestart om de aansturing van de bipolaire relais te vermakkelijken.

Nog even terug naar het schema, er is nog één weerstand bij gekomen en deze zit aan RE-2 ab.
Als dit relais omklapt, dat is bij de 2V en de 20mV stand, dan veranderd de belasting voor de LT1021, hierdoor veranderd de interne dissipatie en dat geeft weer extra dift.
Die extra weerstand R15 zorgt dus voor een constante belasting van de LT1021, dit onafhankelijk van de stand van RE-2 ab.
Het plaatje is klikbaar.
http://www.bramcam.nl/NA/LowCostCal/LowCostCal-70-Klein.png

Dan eerst even het lijstje dat nodig was voor wat overzicht, het is gemaakt in excel.
De bovenste balk geeft de relais status aan, helmaal links zie je RE-2, RE-3 en RE-4, daarna aan de rechter zijde bij wel bereik welke spoel van de relais bekrachtigt word.

Als we bij het 20mV bereik kijken zien jullie alleen rode kruisjes bij de RESET staan.
Dat houd dus in, als ik het 20mV bereik kies, dat ik alleen de reset spoelen hoef aan te sturen, van RE-3 t/m RE-4 hangen de reset spoelen aan elkaar.
Hierdoor is er ook maar één pin nodig voor deze functie en daar heb ik D5 van de Arduino voor gekozen.

Dit is een plaatje van de excel file, net als de code hieronder, is dit natuurlijk niet definitief, maar ter informatie hoe het verloop gaat van de ontwikkeling van dit meetinstrument.
Het plaatje is klikbaar voor een grote versie.
http://www.bramcam.nl/NA/LowCostCal/LowCostCal-71-Klein.png

En dan heb ik ook hieronder de voorlopige benaming van de Arduino pinnen.
http://www.bramcam.nl/NA/LowCostCal/LowCostCal-72.png

En dan de de code in de huidige toestand, het laatste stukje onderaan is wat testcode voor error afhandeling waarmee ik aan het testen was.
Dit reset de Arduino als ik een fout tegenkom in de status van de relais.
Eerst even de code...

c code:


#include <Button.h>
#include "Timer.h"
Timer t;

// Define Range Buttons
Button button2(A1);               // 20mV range
Button button3(A2);               // 2V range
Button button4(A3);               // 20V range

// Range State and enable state variable, used fore Display
byte rangeState = 1;             // RangeState 1 = 20mV Range, 2 = 2V Range, 3 = 20V Range, used for error detection and Display, Power On Preset = 1 (20mV range)
byte enable = 0;                 //  0 = Output Off, 1 = Output On, Power On Preset = 0

// Timing Relais Driver Puls
byte resetPuls = 15;            // Time In mSec For Reset Puls
byte wait_4 = 4;                // Relais Timing 4mSec (Wait Time before Set Pulse is given)

byte on_puls_5 = 5;             // Relais Timing 5mSec (Set Time after Reset Pulse is given)
byte on_Puls_8 = 8;             // Relais Timing 8mSec (Set Time after Reset Pulse is given)
byte on_Puls_10 = 10;           // Relais Timing 10mSec (Set Time after Reset Pulse is given)

// Toggle Relais Setup
byte Enable_In = A0;            // Toggle Button Pin Setup
byte Enable_Out = 6;            // Relais driver output Setup
byte state = LOW;               // Preset Enable Output Set To "Off"
byte reading;                   // the current reading from the input pin
int previous = LOW;             // the previous reading from the input pin
long time = 0;                  // the last time the output pin was toggled
long debounce = 150;            // the debounce time, increase if the output flickers

void(* resetFunc) (void) = 0;   //declare reset function at address 0

void setup() {
  Serial.begin(115200);
  
  pinMode(Enable_In, INPUT);
  pinMode(Enable_Out, OUTPUT);

  button2.begin();              // 20V Range
  button3.begin();              // 2V Range
  button4.begin();              // 20mV Range

  pinMode(2,OUTPUT);            // ResetPuls Relay Driver
  pinMode(3,OUTPUT);            // RE-2 Driver (20/2V)
  pinMode(4,OUTPUT);            // RE-3 Driver
  pinMode(5,OUTPUT);            // RE-4 Driver
  pinMode(6,OUTPUT);            // 
  pinMode(7,OUTPUT);            // 

// Power On reset puls to be shure of the relais state (This put the relais in status of the 20mV range)
  digitalWrite(5, HIGH);
  delay(resetPuls);                 // Reset Puls length
  digitalWrite(5, LOW);  
  delay(wait_4);                    // Wait a short wile
}


void loop() {

// Toggle Enable Button  
  reading = digitalRead(Enable_In);
    if (reading == HIGH && previous == LOW && millis() - time > debounce) {
    if (state == HIGH)
      state = LOW;
    else
    state = HIGH;
    time = millis();    
  }

  digitalWrite(Enable_Out, state);
  previous = reading;

  
// 20V Range
  if (button4.pressed()) {
  // Reset Relais-2, Relais-3, Relais-4
  digitalWrite(5, HIGH);
  delay(resetPuls);                 // Reset Puls length
  digitalWrite(5, LOW);  
  delay(wait_4);                    // Wait a short wile
  // Start On puls Relais-2, 3, 4
  digitalWrite(2, HIGH); 
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  delay(on_Puls_10);                // 10mSec Setpuls Relais-2, 3, 4
  // Stop On Puls Relais-2, 3, 4
  digitalWrite(2, LOW);   
  digitalWrite(3, LOW);   
  digitalWrite(4, LOW);
  rangeState = 8;                   // Set range state for Display
  }


// 2V Range
  if (button3.pressed()) {
  // Reset Puls Relais-2, Relais-3, Relais-4
  digitalWrite(5, HIGH);
  delay(resetPuls);                 // Reset Puls length
  digitalWrite(5, LOW);  
  delay(wait_4);                    // Wait a short wile
  // Set Puls Relais-3, Relais-4
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  delay(on_Puls_10);                // 10mSec Setpuls Relais-3, Relais-4
  digitalWrite(3, LOW);   
  digitalWrite(4, LOW); 
  rangeState = 2;                   // Set range state for Display
  }


// 20mV Range
  if (button2.pressed()) {
  // Reset Puls Relais-2, Relais-3, Relais-4
  digitalWrite(5, HIGH);
  delay(resetPuls);                 // Reset Puls length
  digitalWrite(5, LOW); 
  rangeState = 1;                   // Set range state for Display 
 }

// debug code 
  if(rangeState==1) {
    Serial.println("20mV Range");
  } else if(rangeState==2) {
    Serial.println("2V Range");
  } else if(rangeState==3) {
    Serial.println("20V Range");
  }
  
// Error code detection
  if( (rangeState <1) || (rangeState >3) ){ // range error detection, if error, reset controler!
//    Serial.println("Error in Range state");
delay(100);
    resetFunc(); //call reset
    }
  else {
    Serial.println("No Error");
}
   
}

Boven in de code staan de voorkeuren voor het opstarten, en ik het setup stukje geef ik ook een extra "reset puls" voorals bij het uitschakelen de relais in een toestand komen die niet gewenst is.

Het uitlezen van de toetsen en het aansturen werkt nu zonder problemen, de timing is nu wel al wat aangepast maar de delays die ik nu gebruik kunnen waarschijnlijk nog wat korter,
daar uit metingen aan de relais meestal ruim minder dan 5msec nodig was voor een stabiele relais omschakeling.

Deze variabele: rangeState = 8; welke bij alle drie de ranges staat met een andere waarde (de 8 die staat bij de code voor het 20V bereik is om een fout toestand te simuleren)
dient er ook voor om het goede bereik op het Display weer te geven.

Nu error detectie code onderaan, en dat is de testcode om te kijken of ik een "auto reset" kan doen als de "rangeState" buiten de waarde 1 t/m 3 komt.
Ik heb erg geworsteld met deze code, dit omdat is de functie && verkeert interpreteerde...
Ik dacht mooi! beide vergelijkingen moeten waar zijn, kleiner dan 1 en groter dan de waarde drie, en als dat waar is, dan is er iets fuct-up, en is er een reset nodig :-)
Dus dat stukje code lees ik af in de terminal als die fout conditie optrad, maar die kwam nooit natuurlijk in beeld...
Die foutconditie vergelijking kon gewoon niet optreden, nou behalve dan in de kwantummechanica *grin*
Ik had niet de (and) && nodig, maar de (or) || functie, tada! de reset functie werkte toen.

Er moet nog wat code bijkomen/aanpssen voor de output enable toets, nu is de code zo dat ik een normaal relais kan aansturen en dit moet ook met een bipolaire functie worden.
Met ook weer de zelfde soort codeopbouw als de range toetjes met ook een variabele die de toestand aangeeft om de goede tekst op het display weer te geven.

Ik denk nog na, of ik een 15/16 bit ADC via i2c aan de Arduino knoop om in ieder geval een indicatie te hebben van de uitgangsspanning...
Eerst maar eens wat testen met de opbouw van het Nokia display en kiezen welke library ik ga gebruiken.

Shoot @ it!

Groet,
Blackdog

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
benleentje

Golden Member

Ik heb ondertussen via marktplaats een Knick prazisions spannungsgeber gevonden. Die ik op 1µV kan installen en daar ook enegie tijd stabiel blijft.

Maar ik verlang ook nog steeds naar deze mooie spaningsbron.
Voor de rest ben jij met arduino code net een klein beetje verder dan ik.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.
blackdog

Golden Member

Hi,

Ik heb de code nu bijna helemaal af, de toetsen werken zoals ik het heb uitgedacht en ben daar blij mee, kan ik het ook mooi gebruiken voor een ander meetinstrument.
De relais sturing werkt en alleen de relais timing ga ik nog wat strakker maken.
Dit om de code zo snel mogelijk te laten werken en niet onnodig tijd weg te gooien met het "delay" commando's.
Ja, ik weet dat dit nog wat beter kan met timers, meer deze code is nu (voor mij altans) heel duidelijk van opbouw en de delays zijn uiteindelijk maar heel kort.
Dit door gebruik te maken van snel reagerende relais.

Voor de Display code ben ik uitgekomen bij de 5110 Library van Rinky-Dink.
Ik heb meerdere library's geprobeerd, maar ik kwam daarmee in de knel met de aansluit pinnen op de Arduino, ik heb het trouwens weer voor elkaar om alle aansluitingen te gebruiken van de Arduino Uno :-)
Dit dus als ik uiteindelijk de Arduino Uno ga gebruiken, met een Nano heb ik nog iets meer speelruimte.

Maar ik denk ook aan een Pro Mini die op 3.3V werkt, dan heb ik geen serie weerstanden voor het Nokia display nodig of een "Level Translater" printje zoals op de foto hieronder.
Dit bepaal ik uiteindelijk later als mijn AD conversie werkt.
Om terug te komen op de Rinky-Dink Library voor het display, hiermee kon ik de aansluit pinnen om het display te sturen zo regelen,
dat pin-8 vrij bleef voor de aansturing van het lampje in de Enable schakelaar.
Bij andere drivers voor het Nokia display lukte mij het niet één van de pinnen boven D8 te gebruiken voor mijn lampstuur functie.
Dit zal waarschijnlijk te maken hebben met de SPI bus die ook aan deze pinnen zit.

Een nadeel van de Rinky-Dink library zijn de grafische mogelijkheden en vooral de weinige font typen die beschikbaar zijn.
Als voordeel heeft deze library dus de pinning en het display staat als een huis, veel andere library's doen hun best om continu de screenbuffer te updaten.
Leuk voor spelletjes en grote veel voorkomende pixel wisselingen, maar niet zoals voor mijn toepassing, je verlies er aardig wat contrast mee en het kijkt onrustig.

Weer een paar plaatjes en dan weer de toestand waarin de code nu is.
Dit is een testsetup van het bipolaire relais, daar ik de code niet schijf aan mijn LAB tafel waar voedingen zat staan maar aan mijn werkstation,
maak ik gebruik van drie 9V batterijen als voeding voor de 24V relais spoeltjes.
Er is ruim 30V voor handen in de voeding van het meetinstrument, en door gebruik te maken van relais met een hoge voedingspanning zijn de stroompulsjes die optreden laag.
En het is dan makkelijker te voorkomen dat het schakelen stoord op de gevoelige electronica.
Er zijn twee LED's op het breadboard, maar één valt net weg onder de bedrading op de foto, de twee 1N4148 diode's staan over de Set en Reset spoelen.
De linker 12K weerstand gaat van de + naar het moedercontact en daar het "Set" contact als laatste is aangestuurd geweest, brand nu de LED die is verbonden met het "Set" contact.
Rechtonder zijn nog net de tweemaal een BS170 MOSFET te zien, die de twee spoelen aansturen.
http://www.bramcam.nl/NA/LowCostCal/LowCostCal-74.png

Display
De weergave van de status is erg simpel gebleven, bovenin staat het uitgangsspanning bereik in een kader en
onderin ook in een kader, staat aangegeven of de uitgang wel of niet aan staat.
Ik wou het nog verder opleuken, maar uiteindelijk kwam ik toch weer hier op terug, waarschijnlijk door dit: KISS :-)
De ruimte tussen de cijfers is wel wat ruim bij dit Font, maar er zijn geen andere mogelijkheden in deze Nokia 5110 driver.
Het voordeel is dat het zo wel lekker makkelijk af te lezen is, en daardoor ben ik dus gestopt met dit verder te ontwikkelen.
De waarde die jullie hier nu zien, is voor nu alleen een stukje code die cijfers op het display plaatst, dit heeft voor nu niets met een AD conversie te maken.
http://www.bramcam.nl/NA/LowCostCal/LowCostCal-73.png

De toestand van vandaag betreffende de code.
Dit is alweer versie-12 en de meeste rommel is er al uitgehaald.

c code:


// NoiseAmp Amsterdam
// High Resolution voltage source
// Thanks to: Rinky-Dink, Arduino, Michael Adams (Buttons), Simon Monk (Timer.h)
// This software controls Bi-Polaire Relay's, Read Buttons and display information n a Nokia 5110 LCD Display
// 
//
// The part of the sortware i wrote, is free for personal use :-)

#include <TimeLib.h>
#include <Wire.h>
#include <Button.h>
#include "Timer.h"
#include <LCD5110_Graph.h>                // Start a instance LCD5110 class: 13-CLK, 11-DIN, 12-DC, 10-RST, 9-CE <= Nokia Display Connections

LCD5110 myGLCD(13,11,12,10,9);            // Setup Nodia Display
extern uint8_t SmallFont[];               // Load the "Small Font", it is used for the range and the output status
extern uint8_t MediumNumbers[];           // Load the "MediumNumbers", it is used for the "Output Voltage" on the center of the screen

Timer t;                                  // Setup the timer library

// Define Range Buttons
Button button2(A1);                       // 20mV range
Button button3(A2);                       // 2V range
Button button4(A3);                       // 20V range

// Range RangeState and enable RangeState variable, used fore Display
byte rangeState = 1;                      // RangeState 1 = 20mV Range, 2 = 2V Range, 3 = 20V Range, used for error detection and Display, Power On Preset = 1 (20mV range)
byte enable = 0;                          //  0 = Output Off, 1 = Output On, Power On Preset = 0

// Timing Relais Driver Puls
byte resetPuls = 10;                      // Time in mSec for Reset Puls
byte wait_4 = 4;                          // Get Stable Delay

byte on_puls_5 = 5;                       // Relais timing 5mSec (Set Time after Reset Pulse is given)
byte on_Puls_8 = 8;                       // Relais timing 8mSec (Set Time after Reset Pulse is given)
byte on_Puls_10 = 10;                     // Relais timing 10mSec (Set Time after Reset Pulse is given)

// Toggle Relais Setup (Output On/Off)
byte Enable_In = A0;                      // Toggle Button Pin Setup (see beginning of Setup)
byte Enable_Out = 8;                      // Relais driver output setup, used for indicator light (see beginning of Setup)
byte ToggleState = LOW;                   // Preset Enable Output Set To "Off"
byte reading;                             // the current reading from the input pin
int previous = LOW;                       // the previous reading from the input pin
long time = 0;                            // the last time the output pin was toggled
long debounce = 150;                      // the debounce time, increase if the output flickers



void setup() {
  Serial.begin(115200);                   // Remove if code is finnisd

  myGLCD.InitLCD(60);                     // Set Display contrast and also clears the display  
  myGLCD.setFont(SmallFont);              // Set default font size

// Reset puls "Power On" enable relais
  digitalWrite(7, HIGH);
  delay(resetPuls);                       // reset Pulse defines the time how long the relay "reset coil" gets current
  digitalWrite(7, LOW); 

// Output Enable function setup
  pinMode(Enable_In, INPUT);
  pinMode(Enable_Out, OUTPUT);

  button2.begin();                        // 20V Range
  button3.begin();                        // 2V Range
  button4.begin();                        // 20mV Range

  pinMode(2,OUTPUT);                      // ResetPuls Relay Driver
  pinMode(3,OUTPUT);                      // RE-2 Driver (20/2V)
  pinMode(4,OUTPUT);                      // RE-3 Driver
  pinMode(5,OUTPUT);                      // RE-4 Driver
  pinMode(6,OUTPUT);                      // RE-1 Set driver
  pinMode(7,OUTPUT);                      // RE-1 Reset driver
  pinMode(8,OUTPUT);                      // RE-1 Reset driver (Toggle voor lampje)

// Power On reset puls to be shure of the relais state. (makes the default 20mV range for shure)
  digitalWrite(5, HIGH);
  delay(resetPuls);                       // Reset Puls length
  digitalWrite(5, LOW);  
  delay(wait_4);                          // Wait a short wile

  myGLCD.clrScr();                        // Clears Display
  myGLCD.print("Output = OFF", 5, 39);    // Place default text on display after reboot for the Output state
  myGLCD.print("Range = 20mV", 5, 2);     // Place default text on display after reboot for the Range state
  myGLCD.update();                        // Copy screenbuffer to the screen (update the screen)
}



void loop() {

// Toggle Enable/Disable Button code 
    reading = digitalRead(Enable_In);
    if (reading == HIGH && previous == LOW && millis() - time > debounce) {
    if (ToggleState == HIGH)
    ToggleState = LOW;
    else
    ToggleState = HIGH;
    time = millis();    

// Toggle RE-1 comparator start
    if(ToggleState==1) {

    myGLCD.print("Output = ON  ", 5, 39); // Place "Output = ON" to the sceen buffer if "ToggleState=1"
    digitalWrite(6, HIGH);
    delay(on_Puls_10);
    digitalWrite(6, LOW);   
  } else if(ToggleState==0) {
    myGLCD.print("Output = OFF", 5, 39);  // Place "Output = Off" to the sceen buffer if "ToggleState=0"
    digitalWrite(7, HIGH);
    delay(on_Puls_10);
    digitalWrite(7, LOW);   
    myGLCD.update();                      // Copy screenbuffer to the screen (update the screen)        
  } 
  
  }
  digitalWrite(Enable_Out, ToggleState);
  previous = reading;

  
// 20V Range
  if (button4.pressed()) {
  myGLCD.print("Range = 20V  ", 5, 2);    // Place "Range = 20V" in the screen buffer if "20V" range button is pressed
  myGLCD.update();                        // Copy screenbuffer to the screen (update the screen) 

// Reset Relais-2, Relais-3, Relais-4
  digitalWrite(5, HIGH);
  delay(resetPuls);                       // reset Pulse defines the time how long the relay "reset coil" gets current
  digitalWrite(5, LOW);  
  delay(wait_4);                          // Wait a short wile

// Start On puls Relais-2, 3, 4
  digitalWrite(2, HIGH); 
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  delay(on_Puls_10);                      // 10mSec Setpuls Relais-2, 3, 4
// Stop On Puls Relais-2, 3, 4
  digitalWrite(2, LOW);   
  digitalWrite(3, LOW);   
  digitalWrite(4, LOW);
  rangeState = 3;                         // Set range state for Display
  }


// 2V Range
  if (button3.pressed()) {
  myGLCD.print("Range = 2V  ", 5, 2);     // Place "Range = 2V" in the screen buffer if "2V" range button is pressed
  myGLCD.update();                        // Copy screenbuffer to the screen (update the screen)
  
// Reset Puls Relais-2, Relais-3, Relais-4
  digitalWrite(5, HIGH);
  delay(resetPuls);                       // reset Pulse defines the time how long the relay "reset coil" gets current
  digitalWrite(5, LOW);  
  delay(wait_4);                          // Wait a short wile
  // Set Puls Relais-3, Relais-4
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  delay(on_Puls_10);                      // 10mSec Setpuls Relais-3, Relais-4
  digitalWrite(3, LOW);   
  digitalWrite(4, LOW); 
  rangeState = 2;                         // Set range state for Display
  }


// 20mV Range
  if (button2.pressed()) {
  myGLCD.print("Range = 20mV", 5, 2);     // Place "Range = 20mV" in the screen buffer if "20mV" range button is pressed
  myGLCD.update();                        // Copy screenbuffer to the screen (update the screen)
  
// Reset Puls Relais-2, Relais-3, Relais-4
  digitalWrite(5, HIGH);
  delay(resetPuls);                       // reset Pulse defines the time how long the relay "reset coil" gets current
  digitalWrite(5, LOW); 
  rangeState = 1;                         // Set range state for Display 
 }


// Draw Lines On Display
  myGLCD.drawRect(0, 0, 83, 47);          // Place rectangle in the screenbuffer
  myGLCD.drawLine(0, 10, 84, 10);         // Draw horizontal line at 10 pixels from the top
  myGLCD.drawLine(0, 37, 84, 37);         // Draw horizontal line at 37 pixels from the top
  myGLCD.setFont(MediumNumbers);          // Set FontSize for Output Volgage Display in center of the screen
  myGLCD.printNumF(19.3747, 3, 1, 16);    // test string
  myGLCD.setFont(SmallFont);              // Reset the FontSize to the default value
  myGLCD.update();                        // Copy screenbuffer to the screen (update the screen)

 delay(1);  
}

benleentje, een flink deel van de code die ik gebruik, komt uit voorbeelden die vaak bij de library's zitten.
Verder weet ik meestal goed wat ik "wil" maar ben ook redelijk soepel als ik ergens vast loop om het eens op een andere manier te proberen.
Verder zie je in mijn code ook dat ik duidelijkheid wil, veel omschrijving wat de code doet, en dit pas ik steeds verder aan zodat het duidelijker wordt.
Dat is geen luxe, maar pure noodzaak voor mij en de gene die het misschien ook gaat gebruiken.
Neem alleen al het stukje waarbij wordt omschreven hoe het Nokia display moet worden aangesloten, wat je hierover kan vinden is meestal een drama...
Vele manieren om de pinning in de library en de opdruk van het display te omschrijven, dat geeftwel erg veel variabelen met 5 touwtjes!

c code:


#include <LCD5110_Graph.h>                // Start a instance LCD5110 class: 13-CLK, 11-DIN, 12-DC, 10-RST, 9-CE <= Nokia Display Connections
LCD5110 myGLCD(13,11,12,10,9);            // Setup Nodia Display

Zoals ik het hier doe is het meestal goed te begrijpen en later komt in dit topic ook nog een plaatje hoe mijn display er uitziet wat pinning opdruk betreft.

ADC voor weergave uitgangs spanning
De volgende stap is frutten met de ADC1115 converter en hoe ik de rangeswitching hiermee ga doen.
Er zijn geen uitgangspinnen meer over, dus waarschijnlijk ga ik meerdere spannings delers gebruiken aan de ingangen van de ADS1115 en d goede ingang kiezen
samen met de programmerbare versterker die ook in het IC zitten., voor een optimaal gebruik van de dynamische ruimte van de ADC.
Verder ook kijken of ik wat middeling kan doen als dit tenminste de code niet te veel vertraagd.

Gaarne hoor ik weer jullie opmerkingen,

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.