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
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.
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)
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.
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 :[
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.
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. :)
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.
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?
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.
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