Forum: Mikrocontroller und Digitale Elektronik Welche Spannungs Referenz?


von Bastler (Gast)


Lesenswert?

Guten Abend,

ich möchte gerne Spannungen mit dem ADC eines ATmega328P messen. Dieser 
ist auf einem Arduino Nano China Klon verbaut.

Mein Problem ist, dass ich nicht so recht verstehe, auf welches 
Potenzial sich die gewandelten 10 Bit beziehen.

Bei einer Internetrecherche bin ich darauf gestoßen, dass man die 
Referenzspannung des ADC mit der internen 1.1V Bandgap-Referenz 
zurückrechnen kann. Mit folgendem Code...
1
vref = analogRead(14);
2
vin = (1.1/vref)*1023;
...erhalte ich Ausgaben um 3.56V. Lege ich jedoch den Finger auf den 
Chip, so fängt die angegebene Spannung an zu schwanken und steigt auf 
Werte >4V.
Variiert die Bandgap-Spannung so stark mit der Temperatur des ICs?

Und warum komme ich auf 3.6V ohne Erwärmung? Auf der Unterseite des 
China Klons befindet sich ein AMS1117 5.0 Spannungsregler. Ich nehme 
also an, der ATmega sollte mit 5.0V laufen. Tut er alerdings scheinbar 
nicht, denn wenn ich den zu vermessenden Analogpin von außen mit einem 
Netzgerät versorge, messe ich bei eingestellten 3.6V bereits 1023.


Wenn möglich würde ich gerne Spannungen von 0...5V messen. Geht das mit 
diesem China Klon überhaupt, oder läuft er doch mit 3.3V?

Bereits im Voraus vielen Dank für sachdienliche Hinweise
einen schönen Abend

von foo (Gast)


Lesenswert?

Bastler schrieb:
> Mein Problem ist, dass ich nicht so recht verstehe, auf welches
> Potenzial sich die gewandelten 10 Bit beziehen.

Auf das, was mittels Fuses als Referenzspannung eingestellt wurde, also 
entweder 1.1V, AVcc-Pin, oder ARef-Pin.

> vref = analogRead(14);
> vin = (1.1/vref)*1023;

Was auch immer das berechnen soll... wenn du das Ergebnis von analogRead 
auf z.B. 1.1V beziehen möchtest würde ich eher "analogRead(14)/1023. * 
1.1" rechnen.

> Chip, so fängt die angegebene Spannung an zu schwanken und steigt auf
> Werte >4V.
> Variiert die Bandgap-Spannung so stark mit der Temperatur des ICs?

Vor allem kann, wenn die Referenzspannung 1.1V ist, kein Wert wie 4V 
rauskommen. Aber dass die Formel ausm Netz wohl falsch war, hatten wir 
oben schon

> Wenn möglich würde ich gerne Spannungen von 0...5V messen. Geht das mit
> diesem China Klon überhaupt, oder läuft er doch mit 3.3V?

Das kommt ganz darauf an, was für ein Chinaklon das ist, da würde ich 
gucken, was die Fuses sagen, ggf. auf AVcc umstellen, und dann lieber 
messen, auf welchem Potential das liegt.

von chris (Gast)


Lesenswert?

erstmal Datenblatt rauskramen und die Pins der VCC suchen und messen, 
denn dann bist du auf der ganz sicheren Seite mit wieviel V er arbeitet.

Bastler schrieb:
> dass ich nicht so recht verstehe, auf welches
> Potenzial sich die gewandelten 10 Bit beziehen.

normalerweise auf GND oder meinst du die UREF ??


> Wenn möglich würde ich gerne Spannungen von 0...5V messen. Geht das mit
> diesem China Klon überhaupt, oder läuft er doch mit 3.3V?

Spannungsteiler is da so dein Freund.

> Chip, so fängt die angegebene Spannung an zu schwanken und steigt auf
> Werte >4V.
> Variiert die Bandgap-Spannung so stark mit der Temperatur des ICs?

damit kann man sogar die Temperatur messen, zumindest gibs dazu im Netz 
den ein oder anderen Artikel aber ganz wichtig ist das "geheiligte 
Datenblatt" dort steht alles drin.

VIN wird normalerweise so berechnet:

Vin = Uref/1023 * ADCbits
Vin = 5V/1023 * 300Bits
Vin = 1,466...V

(Uref = 5V / 2,56V / 1,1V oder variabele Spannung durch Poti)

von Thomas E. (thomase)


Lesenswert?

foo schrieb:
>> vref = analogRead(14);
>> vin = (1.1/vref)*1023;
>
> Was auch immer das berechnen soll... wenn du das Ergebnis von analogRead
> auf z.B. 1.1V beziehen möchtest würde ich eher "analogRead(14)/1023. *
> 1.1" rechnen.

Auch wenn er vielleicht nicht weiss, was da gemessen und gerechnet wird, 
aber das passt schon.

Sinnvollerweise sollte man aber in Interger rechnen:
1
1023L * 1100L / analogRead(14);
Damit erhält man die Spannung in mV.

Setzt man Vcc als Referenz, kann man auf diese Weise Vcc messen.

mfg.

von foo (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> foo schrieb:
>> auf z.B. 1.1V beziehen möchtest würde ich eher "analogRead(14)/1023. *
>> 1.1" rechnen.
>
> Auch wenn er vielleicht nicht weiss, was da gemessen und gerechnet wird,
> aber das passt schon.

Kann man ja noch mal erklären ;)
gemessen wird zwischen 0 und 1,1V.
ADC bzw analogRead(14) gibt Wert von 0 ... 1023 zurück
-> teile ihn durch 1023, um Wert von 0 ... 1 zu erhalten
-> multipliziere mit 1,1 und erhalte Wert von 0 ... 1,1

> Sinnvollerweise sollte man aber in Interger rechnen:

Ja kann man, wobei ich glaube, dass das für das konkrete Problem wenig 
Vorteile hat und den TE eher verwirrt

> 1023L * 1100L / analogRead(14);

Jetzt hast du schon wieder die falsche Formel vom Anfang :[

von Oliver R. (orb)


Lesenswert?

foo schrieb:
> Auf das, was mittels Fuses als Referenzspannung eingestellt wurde

In den Fuses? Wo denn da? Zeig mal.

Normal stellt man die Vref-Quelle mit den Bits REFS0 und REFS1 im 
ADMUX-Register ein.

von foo (Gast)


Lesenswert?

Oliver R. schrieb:
> foo schrieb:
>> Auf das, was mittels Fuses als Referenzspannung eingestellt wurde
>
> In den Fuses? Wo denn da? Zeig mal.
>
> Normal stellt man die Vref-Quelle mit den Bits REFS0 und REFS1 im
> ADMUX-Register ein.

Ich bin mir gerade auch nicht mehr sicher, wie ich jetzt darauf gekommen 
bin, aber du hast natürlich Recht. Guten Morgen. :)

von Thomas E. (thomase)


Lesenswert?

foo schrieb:
> Ja kann man
Das kann man nicht nur, das macht man so.

foo schrieb:
>> 1023L * 1100L / analogRead(14);
>
> Jetzt hast du schon wieder die falsche Formel vom Anfang

Die Formel ist goldrichtig. Du verstehst sie nur nicht. Du verstehst die 
Messung nicht.

Erstmal ist das, was er da zu messen versucht Unsinn. Die 
Referenzspannung des 328er beträgt 1,1V, die Bandgapspannung ebenfalls. 
Da braucht man gar nichts messen. Wenn nicht sogar die Bandgapspannung 
und die 1,1V-Referenz ohnehin dasselbe ist.

Bei Bandgap gegen Vcc oder eine andere, höhere Referenzspannung, wird 
die Bandgapspannung gemessen. Vcc ist die Referenz. Gemessen wird daher 
nicht der absolute Spannungswert, sondern das Verhältnis von Vcc(die 
unbekannte Referenz) zu Bandgap(1,1V). Daraus lässt sich dann Vcc 
errechnen. Oder eben die Referenzspannung.

Dafür ist diese Formel:
1
1023L * 1100L / analogRead(14);
Damit erhält man die Spannung in mV.

Für Vcc ist das wunderbar, für die Referenzspannung natürlich Quatsch.

Genau das versucht er auch mit Aref. Nur das wird eben nichts. Siehe 
oben. Ob er überhaupt eine Referenz eingestellt hat, ob der ADC-Takt 
richtig ist oder, oder, und, und, und, ist natürlich ohne Code nicht 
erkennbar. Und am China-Clone liegt es garantiert nicht. Das Problem 
sitzt, wie meistens, da, wo es immer sitzt.

Die ADC-Messung gibt natürlich immer das Verhältnis an. Aber von der zu 
messenden Grösse zur Referenz. In diesem Falle ist es umgekehrt. Oder 
soll es zumindest sein. Aber so ist das mit irgendwelchem Zeugs aus dem 
Internet, den man nicht versteht.

mfg.

von foo (Gast)


Lesenswert?

Thomas Eckmann schrieb:
>>> 1023L * 1100L / analogRead(14);
> Die Formel ist goldrichtig. Du verstehst sie nur nicht. Du verstehst die
> Messung nicht.

Mag sein. Was soll die denn berechnen?

Ich mach mal ein Beispiel. ARef sei weiterhin 1.1V. An Pin 14 (bzw. der 
Pin, der von analogRead(14) benutzt wird.. wissenschon) gebe ich 2.15 
mV. Die Funktion wird mir also den Wert 2 zurückgeben.

Welche Bedeutung hat nun die Zahl 562650 (1023*1100/2), die deine Formel 
zurückgibt?

von Thomas E. (thomase)


Lesenswert?

foo schrieb:
> Mag sein. Was soll die denn berechnen?

Das habe ich doch gerade beschrieben. Die angelegte Referenzspannung 
bzw. sinnvollerweise Vcc.

foo schrieb:
> An Pin 14 (bzw. der
> Pin, der von analogRead(14)

Der ADC-Kanal 14 ist kein Pin. Das ist die Bandgapspannung.

foo schrieb:
> Welche Bedeutung hat nun die Zahl 562650 (1023*1100/2), die deine Formel
> zurückgibt?

Folglich Unsinn.

mfg.

von foo (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Der ADC-Kanal 14 ist kein Pin. Das ist die Bandgapspannung.

Fehler erkannt und akzeptiert.

von Bastler (Gast)


Lesenswert?

Zu meiner Schande muss ich gestehen, dass ich beim Testen das Board an 
einem China USBasp hängen hatte. Wenn ich es über ein Netzteil versorge, 
liegen die gewünschten 5V an.


Die Formel aus dem ersten Beitrag zur Bestimmung von AREF ist unter der 
Annahme, dass die Bandgap-Spannung konstant 1.1V beträgt im übrigen 
korrekt.

analogRead(14) = 1.1[V] / AREF [V] * 1023

stellt man das nach AREF um, so erhält man

AREF [V] = 1.1[V] / analogRead(14) * 1023

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.