Spanningsmeting met ADC

Dag iedereen, dit is mijn eerste project met een Arduino.

Ik gebruik een Arduino, type Uno R4.

Er wordt een externe voedingsspanning (referentie) van 0.3 VDC aangelegd op een aantal samples. De weerstand van deze samples zal na verloop van tijd beginnen te veranderen. De bedoeling is om gedurende bepaalde periodes de spanning over deze weerstanden te meten (en te loggen).
Om de gemeten spanning correct te kunnen uitlezen gebruik ik volgende lijn in mijn code:

float voltageA0 = (sensorValueA0/4096.0) * 0.3000;

Ik las in de technische documentatie dat er een minimale voedingsspanning van 1.4 V nodig is om een correcte meting uit te voeren. Klopt dit? Zijn er misschien andere manieren om deze spanningen alsnog te kunnen meten met deze referentiespanning?

Alvast bedankt voor jullie reactie!

Link a.u.b.

Ik ben niet bekend met de R4 familie. Je kunt een interne referentie gebruiken van 1.5V (zie https://docs.arduino.cc/language-reference/en/functions/analog-io/analogReference/) onder het kopje Arduino Renesas Boards.
Of je kunt een externe referentie spanning aanbieden op de Aref (als ik me niet vergis) pin


Als je een goede voeding hebt die 0.3V levert zal die spanning altijd 0.3V zijn en niet veranderen. Dus de manier die ik begrijp dat je wilt gebruiken zal niet werken.
Wat zal werken is een weerstandsdeler maken met een bekende weerstand en jouw onbekende weerstand; het knooppunt van die twee kun je dan meten met de Arduino.

Hoi janvda, en welkom.

Ik zie dat je je best hebt gedaan om te beschrijven wat je wil doen, maar ik begrijp het toch niet.
Ik zie wat waardes en wat opmerkingen voorbij komen, maar ik ben bang dat je bepaalde zaken door elkaar haalt.
De externe voedingsspanning van 0.3 volt bijvoorbeeld.
Die noem je referentie, maar wat bedoel je daarmee.
Verder zeg je (nou ja ik lees dat zo) dat die voedingsspanning een variërende weerstand voedt.
En dat je de spanning over de weerstand wil meten.
Wanneer je de spanning over een weerstand wil meten, moet je dus 2 punten aansluiten.
Meestal wordt er gemeten ten opzichte van GND oftewel nul volt.
Kun je aangeven hoe je dit aansluit, met een tekening en / of een duidelijke foto ?
En de referentie van 0.3 volt, sluit je dat aan op de referentie aansluiting van je Arduino, of is dat niet wat je bedoelt ?

Ik was misschien wat snel met het posten van mijn bericht.
Hieronder een schema wat momenteel gebruikt wordt:

Ik heb enerzijds de interne 5 VDC spanning gebruikt om een spanningsmeting uit te voeren met A0. Deze AI lijkt de spanning correct te meten (hoewel niet heel nauwkeurig), berekend 0.3125 V, gemeten met V-meter 0.2952 V, arduino meet 0.3462 V.

Anderzijds heb ik een externe 0.3 VDC spanning gebruikt om een spanningsmeting uit te voeren met A1. De berekende spanning op A1 zou 0.1000 V moeten zijn, gemeten met V-meter 0.1203 V, maar de arduino meet 0.0078 V.

Deze externe 0.3 VDC spanning zal in de praktijk met een referentie-electrode gegenereerd worden en aangelegd worden op samples met weerstandswaarden van ongeveer 5 kOhm.

De vraag blijft waarom de arduino een verkeerde spanning meet op A1?
Gebruik ik een verkeerd meetprincipe?
Is de aangelegde spanning te klein/weerstandswaarden te hoog?

In jouw schema staan een weerstand van 10K en een van 5K in serie en meet je aan het knooppunt tussen deze weerstanden.
Daarmee gooi je van de 0.3 volt, dus al 0.2 volt weg wanneer deze weerstanden inderdaad aan deze waardes zitten.
Een weerstand heeft bepaalde toleranties, standaard is dat 10 %, een goede is 2 % en hele goede zijn 1 % (als je veel geld gaat uitgeven zal er vast nog iets zijn dat nog beter is).
1% van 10K is 100 Ohm.

De Arduino meet ten opzichte van diens voedingsspanning, tenzij er een referentie wordt ingesteld / aangesloten op de daarvoor bestemde pin.
De Arduino (afhankelijk van welke controller er aan boord zit) heeft dan een resolutie, bij de eerste Arduino's was dat 10 bits, het kan zijn dat dat voor jouw Arduino hoger is.
Je krijgt bij 10 bits dan 5 volt die in 1023 stappen kan worden onderverdeeld.
Dat zijn dan stappen van ongeveer 0.0049 volt.
Daarbij moet je wel rekening houden met fouten.
Het lijkt mij dat je met 0.005 volt resolutie wel dichter in de buurt van je andere methodes moet kunnen komen, maar je hebt jezelf wel tot maar 20 mogelijke waardes beperkt (zie eerste alinea in dit antwoord).
Maar analoge metingen moet je een paar keer herhalen als je echt goede waardes wil kunnen verwerken.
De meeste Arduino controllers hebben wel meerdere aansluitingen voor analoge metingen, maar maar 1 intern circuit dat deze meting in werkelijkheid verricht.
Wanneer je meerdere ingangen wil meten, kun je 2 dingen doen om deze nauwkeuriger te krijgen.
De tweede is voor elke meting, een meting aan een niet gebruikte ingang, die je dan aan GND hebt verbonden.
Daarmee doe je eigenlijk een reset van dat interne circuit.
Maar ik heb geen idee of je een een ingang over hebt waar je dit mee kan doen.
De andere manier is de meting een aantal keer te herhalen, de hoogste en de laagste resultaten weg te gooien, en dan alle andere resultaten bij elkaar op te tellen en te delen door het aantal resultaten dat je nu gebruikt hebt.
Dus als je 10 metingen doet, gooi je er 2 weg, tel je er 8 bij elkaar op en deel je dat resultaat weer door 8.
Dan heb je nog steeds mogelijke fouten, bijvoorbeeld door afronding, maar deze worden wel veel kleiner.
Wanneer je meerdere ingangen gebruikt, meet je in bovengenoemd voorbeeld dus A0 10 keer, daarna A1 10 keer enzovoorts.
Je moet je dan ook realiseren dat deze metingen tijd kosten (en het is afhankelijk van de aangeboden waarde hoe groot die tijd is want zo werkt deze meting uiteindelijk).

Terugkomend op de 20 mogelijke meetwaardes:
Wanneer je met deze hardware een hogere resolutie wil bereiken, kun je overwegen wat hardware toe te voegen; een meetversterker die de meting aan het knooppunt van de weerstanden versterkt zodat deze beter uitkomen binnen het meetbereik van je Arduino.
Als je de waardes uit het knooppunt vermenigvuldigt met 40, krijg je een meetbereik van 0 tot ongeveer 4 volt (bij een Arduino op 5 volt bruikbaar), met 25 in plaats van 40 is dan beter voor een 3 volt Arduino.
Deze versterking kan wel weer tot meetfouten leiden, das dan weer het nadeel er van.

Bedankt voor je reactie.

De spanningsmeting met de interne 5 VDC van de arduino was gewoon even om te checken dat mijn programma wel degelijk op de juiste manier meet, normaal gezien ga ik deze niet verder gebruiken.

Wat ik wel verder ga uittesten is metingen met de externe 0.3 VDC.
Ik besluit hieruit dat de externe spanning laag is, maar niet onmogelijk is om spanningsmetingen mee uit te voeren op de analoge ingangen?
Ik zou misschien al kunnen starten met weerstandswaarde van R3 te verlagen naar b.v. 100 Ohm. De waarde van R4 kan ik niet veranderen en zal steeds rond de 4.5 - 5 kOhm bedragen.
Ik heb trouwens een 12-bits ADC.

Indien ik dan een aantal metingen uitvoer en de metingen die het dichtst bij elkaar liggen uitmiddel zou ik al meer in de buurt moeten komen van mijn gewenste spanning.

Een volgende stap zou dan inderdaad kunnen zijn om te kiezen voor een meetversterker.

Ik zal starten met de eerste twee stappen, ik hou je op de hoogte!

Er staat een foutje in mijn laatste toegevoegde commentaar:
Ik heb een 14-bits ADC en geen 12-bits.

Ik heb R3 verlaagt naar 100 Ohm en de externe voedingsspanning gemeten, deze bedraagt om correct te zijn 0.3595 V.
Ik gebruik de regel float voltageA1 = (sensorValueA1/16384.0) * 0.3595 om mijn integerwaarde om te zetten naar spanning. Ik krijg echter bizarre metingen op mijn analoge ingang, n.m. 0.0270 V.
Doe ik iets fout met mijn conversiefactor?

Kun je uitleggen hoe je tot deze formule bent gekomen ?

Je deelt de waarde die je krijgt door de maximale waarde die je uit kunt lezen (+1).
Ik vermoed dat je dat eerst maar eens moet omdraaien.
Dan vermenigvuldig je dat met de maximale voeding / referentie (die je nooit zou mogen halen vanwege R3, maar dat is OK).
Je krijgt dan iets anders dan wat je wil weten, omdat de referentie van de gedane meting (5 volt) heel ergens anders ligt dan die van wat jouw referentie is (0.3595 volt).

Als ik tegen zo'n probleem zou aanlopen, zou ik mijn code tijdelijk gaan aanpassen zodat deze (bijvoorbeeld via de seriële verbinding) ook de ruwe waarde die uit A1 komt, krijg te zien.

Mogelijk gaat je dat helpen in de richting van de juiste formule.
Je hebt dan een aantal waardes, de waarde die uit A1 komt, de 2 referenties (die je in het oog moet houden maar waar ik eerst nog even niets mee zou doen), en de waarde die je meet met de multimeter.
Er van uit gaande dat die multimeter nauwkeurig genoeg is (deed jij eerder ook meen ik), kun je dat gebruiken om vast te stellen wat er met de A1 waarde moet gebeuren om tot datzelfde resultaat te komen.

[edit]
De formule die je dus nodig hebt om tot de werkelijke spanning te komen, is ((5 / 16384)*sensorValueA1).
Met de eerste stap reken je uit welke spanning staat voor 1 bit.
Dat is in deze tekst een berekening, maar die berekening levert altijd hetzelfde resultaat op.
Daarom kun je dat net zo goed een constante maken.
5 / 16384 = 0.00030517578125.
Dus je meetwaarde naar een spanning converteren is dan 0,00030517578125 * sensorValueA1
Ik ben benieuwd of je dan beter in de buurt komt van wat je verwacht.
Dit levert dus een spanning op, dat is niet gelijk aan een weerstand.
Voor de weerstand moet er nog wat meer berekend worden.
[/edit]

We zijn nu bijna 2 weken verder.
Heb je al wat vooruitgang geboekt ?

Ja hoor, alles lijkt ondertussen goed te werken. Bedankt voor de hulp!