Arduino analoge Spannungsauslesung

Gast #2778845
Lesenswert?

Hey Leute

Ich habe mir ein Arduino UNO board zugelegt und gleich
angefangen Codes zu schreiben. Komme auch gut vorwärts!

Nun bin ich aber trotzdem über ein kleines Hindernis gestolpert den
man kann im Code für den Arduino folgendes schreiben:
analogReference(Type) DEFAULT, INTERNAL, EXTERNAL usw.

Hier zu meine frage..
Ich habe in meinen Codes analogReference nicht verwendet, was für
eine Spannung nimmt da der Arduino.?
Und wie muss man da die Auflösung rechnen (U/1024)??

sagen wir analogReference(DEFAULT);
da wir ja als Referenz die Speisespannung des Arduino gesetzt. Bei mir 
5V
dann
sensorwert = analogRead(sensor) / (5 / 1024)
stimmt das so??

oder sagen wir analogReference(INTERNAL);
da wir die interne Spannung des Arduino UNO gesetzt. UNO 1.1V
wie sieht es dann hier aus
sensorwert = analogRead(sensor) / (1.1 / 1024)
währe das so richtig??

als letztes analogReference(EXTERNAL);
da wir die Spannung des VREF Pins am Arduino UNO gesetzt. zB 3.3V
wie sieht es dann hier aus
sensorwert = analogRead(sensor) / (VREF / 1024)
oder bin ich auf dem Holzweg..??

Danke für eure Hilfe..

Gruss

Exeo
#2778888
Lesenswert?

Markus U. schrieb:
> Diese Diffamierungen, nur weil man einen Arduino benutzt, sind wirklich
> unnötig. Außerdem sieht man an seinem Post, dass er sich mit der Materie
> schon intensiver beschäftigt hat...
>
> Mehr Infos übrigens hier:
>
> http://arduino.cc/en/Reference/AnalogReference
> http://arduino.cc/en/Reference/AnalogRead

Na da haste ja brav für ihn gegoogelt. Ich meine wenns nichtmal dazu 
reicht.
Gast #2778891
Lesenswert?

cyblord ---- schrieb

> einfach mal in der Arduino Doku gucken.

ja danke die ist aber ewig lang hat weder sicher mal reinschauen...
und mir die passende Formel suchen..
oder weist du gerade welche kapitel.?

MfG

Exeo
#2778896
Lesenswert?

Exeo schrieb:

> sensorwert = analogRead(sensor) / (5 / 1024)
> stimmt das so??

Probiers aus.
Was ergibt  5/1024?
(Hinweis: es ergibt nicht das, was du denkst.
 Siehe: 
http://www.mikrocontroller.net/articles/FAQ#Datentypen_in_Operationen
)

Aber selbst wenn das so funktionieren würde, wäre 5.0 / 1024 gleich 
0.048..

Dein ADC liefert bei, sagen wir mal ca 2.5V einen Wert von 512.
512 / 0.048 ergibt 10666.66

Noch nicht einmal ansatzweise in der Nähe. Eigentlich hätte da ja jetzt 
2.5 rauskommen müssen.

1024 Äpfel kosten 5 Euro.
Wieviel kosten 512 Äpfel?

     1024    .....   5
      512    .....   x        (Zahl über x, mal Stumpf durch Spitz)
    -------------------
            5 * 512
       x = ----------  = 2.5
              1024


2.5 Euro, das kann stimmen. Denn wenn 1024 Äpfel 5 Euro kosten, dann 
kosten halb so viele Äpfel auch nur den halben Preis.

Wenn also der ADC bei 5V 1024(*) meldet, welche Spannung hatte man dann, 
wenn er 512 meldet? Welche Spannung hat man, wenn er nicht 512 sondern 
irgendeinen anderen Wert, nennen wir ihn mal 'adc', liefert?

(*) Ja, ich weiß schon, das geht technisch nicht.
#2778901
Lesenswert?

Exeo schrieb:
> cyblord ---- schrieb
>
>> einfach mal in der Arduino Doku gucken.
>
> ja danke die ist aber ewig lang hat weder sicher mal reinschauen...
> und mir die passende Formel suchen..
> oder weist du gerade welche kapitel.?
>
> MfG
>
> Exeo

Unglaublich, du lässt lieber andere für dich suchen? Wie dreist bist du 
eigentlich? Vorallem google bringt dich schnell an die richtige Stelle. 
Lerne Dokus lesen! OMG

Also die Formel laut AVR Datenblatt (und somit dürfte das bei der 
Arduino-Seuche ebenfalls so sein) lautet: x=(u*1024)/Vref. Wobei u deine 
Spannung am ADC ist, und x der Wert den dein ADC dir liefert. Das gilt 
allerdings nur für Single-Ended-Messungen ohne Verstärkung.

gruß cyblord
#2778923
Lesenswert?

Ey!
cyblord, jetzt vergraul mal den Buben nicht nur weil er nicht so viel 
Erfahrung hat wie du.


>Ich habe in meinen Codes analogReference nicht verwendet, was für
>eine Spannung nimmt da der Arduino.?
Eine Spannung "nehmen" tut er gar keine. Allenfalls nimmt er einen sehr 
kleinen Strom auf. Kannst 5V drauf geben, geht nix kaputt.

>sensorwert = analogRead(sensor) / (VREF / 1024)

Yep, das sollte stimmen. Der Atmega bezieht die Spannung immer auf sein 
nach innen durchgereichtes Vref, das kann laut Datenblatt über die REFS0 
und REFS1-Bits (im Register ADMUX)vorgewählt werden. Per default sollte 
das passen, ich meine, es sind auch min. ein Beispiel mit der 
Arduino-IED mit dabei; das direkt plug&play sein sollte.
Gast #2778948
Lesenswert?

Karl Heinz Buchegger schrieb

danke für die Tipps


> Dreisatz sollte aber jeder mit Mittelschulabschluss im Schlaf
> beherrschen. Was machst du denn, wenn du einkaufen gehst und einen Preis
> berechnen musst? Ein Dutzend Eier kosten 6 Euro. Wieviel kosten 7 Eier?


ja wiviel ein ei kostet nämlich 0.5 schweizerfranken ^^ * 7 =
3.5 CHF

mfg

exeo
#2778950
Lesenswert?

Exeo schrieb:

>> Dreisatz sollte aber jeder mit Mittelschulabschluss im Schlaf
>> beherrschen. Was machst du denn, wenn du einkaufen gehst und einen Preis
>> berechnen musst? Ein Dutzend Eier kosten 6 Euro. Wieviel kosten 7 Eier?
>
>
> ja wiviel ein ei kostet nämlich 0.5 schweizerfranken ^^ * 7 =
> 3.5 CHF

Das kann ich grad noch gelten lassen :-)


Klar wie man das rechnet?
Der Dreisatz wird dir in Zukunft noch oft begegnen. In vielen 
unterschiedlichen Zusammenhängen. Drum reite ich da auch so drauf rum. 
Ich hätt dir ja auch die Formel hinknallen können. Es ist aber besser, 
wenn du verstehst, was du da tust und wie man gewisse Dinge rechnet.
Gast #2778993
Lesenswert?

Karl Heinz Buchegger schrieb
>
> Das kann ich grad noch gelten lassen :-)
>
>
> Klar wie man das rechnet?
> Der Dreisatz wird dir in Zukunft noch oft begegnen. In vielen
> unterschiedlichen Zusammenhängen. Drum reite ich da auch so drauf rum.
> Ich hätt dir ja auch die Formel hinknallen können. Es ist aber besser,
> wenn du verstehst, was du da tust und wie man gewisse Dinge rechnet.

ja danke ist jetzt klar. auch schon vorher.. ^^

ich werde jetzt mal eine Code schreiben und in dann hier posten..

MfG

Exeo
Gast #2779006
Lesenswert?

Karl Heinz Buchegger schrieb

> Und nicht vergessen.
> 5 / 1024 ergibt 0
>
>   5 ist ein int
>   1024 ist ein int
>
>   also wird da int-Zahl durch int-Zahl dividiert und das Ergebnis
>   ist wieder eine int-Zahl. int haben aber keine Nachkommastellen.

danke das werde ich mir merken.. und so wie es du geschrieben hast 
klingt das logisch.. nur 5.0/1024 ist gut so oder lieber 5.0/1024.0.

mfg

exeo
#2779021
Lesenswert?

Exeo schrieb:

> danke das werde ich mir merken.. und so wie es du geschrieben hast
> klingt das logisch.. nur 5.0/1024 ist gut so

ist gut so.
Es zählt immer der 'höchste' vorkommende Datentyp. Der andere Operand 
wird automatisch auf diesen Datentyp gebracht.

http://www.mikrocontroller.net/articles/FAQ#Datentypen_in_Operationen

> oder lieber 5.0/1024.0

notwendig an sich ist es nicht. Aber wenn du es übersichtlicher findest, 
ist es ok. Beide Formen sind sowieso gleichwertig und werden gleich 
gerechnet.
Gast #2779022
Lesenswert?

Hier der Code..
Hoffe das ich mich damit nicht all-zudumm darstelle... ^^




float sensor = 0;
int sensorwert = 0;
float sensorspannung = 0;

void setup() {

 Serial.begin(9600);
 analogReference(DEFAULT);
 pinMode(sensor = A0, INPUT);

}

void loop() {

 sensorwert = (analogRead(sensor) * 1024) / 5.0;
 sensorspannung = (sensorwert * 5.0) / 1024;

 Serial.println(sensorwert), DEC;
 Serial.println(sensorspannung) + (" V"), DEC;
 delay(50);
}
Gast #2779030
Lesenswert?

Karl Heinz Buchegger schrieb
> ist gut so.
> Es zählt immer der 'höchste' vorkommende Datentyp. Der andere Operand
> wird automatisch auf diesen Datentyp gebracht.

Ok das ist gut zu wissen. Muss der Datentyp der Variable dementsprechend 
float sein..?

> notwendig an sich ist es nicht. Aber wenn du es übersichtlicher findest,
> ist es ok. Beide Formen sind sowieso gleichwertig und werden gleich
> gerechnet.

Also ist das dann eher Schönheits-sache im Code.. :-)

danke

MfG

Exeo
#2779034
Lesenswert?

Exeo schrieb:
> Karl Heinz Buchegger schrieb
>> ist gut so.
>> Es zählt immer der 'höchste' vorkommende Datentyp. Der andere Operand
>> wird automatisch auf diesen Datentyp gebracht.
>
> Ok das ist gut zu wissen. Muss der Datentyp der Variable dementsprechend
> float sein..?

Welche Variable?
In 5 / 1024 kommt keine Variable vor.


Wenn du schon kein C-Buch hast (was du dringend ändern solltest), dann 
lies wenigstens den Link, den ich dir jetzt schon 2 mal gepostet habe.
Gast #2779054
Lesenswert?

Karl Heinz Buchegger schrieb:
> Exeo schrieb:
>
>> float sensor = 0;
>
> muss der float sein?

das ist ja die Sensorspannung die hat ja Kommastellen.

> So wie ich das sehe, ist 'sensor' bei dir der ADC-Pin.
ja genau.

> Der ist aber
> nicht float, das ist eine stink normale ganze Zahl. Eben die Pinnummer.

also (int sensor = A0) ich hab es nämlich unter pinMode deklariert..


>>  sensorwert = (analogRead(sensor) * 1024) / 5.0;
>
> Was soll denn der 'sensorwert' darstellen?

den wert der Spannung nach der auflösung zb 2.5V == 512..
Gast #2779065
Lesenswert?

Karl Heinz Buchegger schrieb^

>> Ok das ist gut zu wissen. Muss der Datentyp der Variable dementsprechend
>> float sein..?
>
> Welche Variable?
> In 5 / 1024 kommt keine Variable vor.

ja das ist eine Funktion...

>
> Wenn du schon kein C-Buch hast (was du dringend ändern solltest), dann
> lies wenigstens den Link, den ich dir jetzt schon 2 mal gepostet habe.

ja das hab ich jetzt. klar und deutlich erklärt..

ist es so besser

 sensorwert = (analogRead(sensor) * 1024.0) / 5.0;
 sensorspannung = (sensorwert * 5.0) / 1024.0;


MfG

Exeo
#2779076
Lesenswert?

Exeo schrieb:

>>>  sensorwert = (analogRead(sensor) * 1024) / 5.0;
>>
>> Was soll denn der 'sensorwert' darstellen?
>
> den wert der Spannung nach der auflösung zb 2.5V == 512..


Das kann keine Spannung sein.
Setz doch mal 512 ein und sieh nach ob da 2.5 rauskommt.

Wenden wir mal die "physikalische Technik" des dazuschreibens von 
Einheiten an. Den Werten vom ADC verpasse ich die hypotetische Einheit 
[Ticks].
1
  sensorwert[Volt] = analogRead(sensor)[Ticks] * 1024[Ticks] / 5.0[Volt]
In Einheiten geschrieben lautet deine Gleichung daher
1
  [Volt] = [Ticks]*[Ticks] / [Volt]
2

3
  [Volt] = [Ticks]^2 / [Volt]      // lies ^2 als 'Quadrat'
das kann nicht stimmen. Links und Rechts vom = stehen verschiedene 
Einheiten.

1
  sensorspannung = (analogRead(sensor) * 5.0) / 1024;
2

3
  sensorspannung[Volt] = (analogRead(sensor)[Ticks] * 5.0[Volt]) / 1024[Ticks];
wieder: reduziert auf die 'Einheiten'
1
    [Volt] = ([Ticks] * [Volt]) / [Ticks]      // Klammer auflösen
2
    [Volt] = [Ticks] * [Volt] / [Ticks]        // Umstellen
3
    [Volt] = [Ticks] / [Ticks] * [Volt]        // a / a ergibt immer 1
4
    [Volt] = 1 * [Volt]                        // 1 * irgendwas -> irgendwas
5
    [Volt] = [Volt]

passt. Links und rechts vom = stehen dieselben Einheiten.
Also ist
  sensorspannung = (analogRead(sensor) * 5.0) / 1024;
richtig.
(Wie sich auch aus dem Dreisatz ergibt)
Gast #2779110
Lesenswert?

Karl Heinz Buchegger schrieb


> passt. Links und rechts vom = stehen dieselben Einheiten.
> Also ist
>   sensorspannung = (analogRead(sensor) * 5.0) / 1024;
> richtig.
> (Wie sich auch aus dem Dreisatz ergibt)

hey danke dir beim Upload auf den Arduino hat es geklappt..
Ich will mir aber später ein Roboter bauen/programmieren dazu ist es 
dann sicherlich einfacher bzw. ganauer mit den werten der Auflösung zu 
arbeiten..??

mfg

Exeo
#2779131
Lesenswert?

Exeo schrieb:
> ich habs ^^
>
> sensorwert = (((analogRead(sensor) * 5.0) /1024) * 1024.0) / 5;


Ich rate dir dringend besser nachzudenken

   512  MAL 5 DURCH 5, ergibt wieder 512. Immer!

Was du willst, ist ganz einfach

   sensorwert = analogRead(sensor);

Passt. Fertig. Ende. Mehr brauchts nicht.
In der Variablen 'sensorwert' steht der Wert, den der ADC festgestellt 
hat.
#2779134
Lesenswert?

>>sensorwert = analogRead(sensor) / (VREF / 1024)
>
> Yep, das sollte stimmen.

Karl Heinz schrieb:
>Aber nur, wenn er die Formel noch ein wenig umstellt

Wieso?

sensorwert = analogRead(sensor) / (VREF / 1024)

ist das gleiche wie:

sensorwert = (analogRead(sensor) * 1024.0) / 5.0;

Auch wenn es auf den ersten Blick nicht so aussieht.

Nur auf die Datentypen muß man natürlich aufpassen...
#2779142
Lesenswert?

Joachim ... schrieb:
> Genau. Aus den Teilchen machen wir eine Spannung.


Na dann setz mal ein

sensorwert = (analogRead(sensor) * 1024.0) / 5.0;

der ADC liefere den Wert 512. D.h. am ADC liegt welche Spannung (laut 
deiner Rechnerei) an?

  sensorwert = 512 * 1024 / 5

Taschenrechner raus. tipp, tipp, tipp

  sensorwert = 104857 Volt

Du wirst vielleicht verstehen, wenn ich behaupte: Das glaub ich nicht, 
dass an deinem AVR rund 100 Kilovolt anliegen und der das überlebt.

Ansers rum

sensorwert = analogRead(sensor) * 5.0 / 1024.0;

Wieder

  sensorwert = 512 * 5 / 1024

Taschenrechner raus

  sensorwert = 2.5 Volt

Ja, doch. Das sieht plausibel aus.
Gast #2779146
Lesenswert?

hmm...

Dann kann ich mir die ganze Rechnerei ersparen wenn ich den wert des ADC 
auswerten will

sensorwert1 = analogRead(sensor1);
sensorwert2 = analogRead(sensor2);
sensorwert3 = analogRead(sensor3);
sensorwert4 = analogRead(sensor4); usw..

das probiere ich gleich..

ja zurzeit möchte ich die Spannung was ja schon hergeleitet wurde..

später in meinem Projekt werde ich die werte des ADC benutzen..

MfG

Exeo
Gast #2779149
Lesenswert?

Exeo schrieb:
> hmm...
>
> Dann kann ich mir die ganze Rechnerei ersparen wenn ich den wert des ADC
> auswerten will
>
> sensorwert1 = analogRead(sensor1);
> sensorwert2 = analogRead(sensor2);
> sensorwert3 = analogRead(sensor3);
> sensorwert4 = analogRead(sensor4); usw..

krass das geht ja wirklich und ich wollte diese ausrechnen...  Ich -> 
Blöd^^

MfG

Exeo

danke nochmal
#2779153
Lesenswert?

Exeo schrieb:
> Exeo schrieb:
>> hmm...
>>
>> Dann kann ich mir die ganze Rechnerei ersparen wenn ich den wert des ADC
>> auswerten will
>>
>> sensorwert1 = analogRead(sensor1);
>> sensorwert2 = analogRead(sensor2);
>> sensorwert3 = analogRead(sensor3);
>> sensorwert4 = analogRead(sensor4); usw..
>
> krass das geht ja wirklich und ich wollte diese ausrechnen...

Ich versteh nicht.
Steht doch in der Doku!

http://arduino.cc/en/Reference/AnalogRead
1
Returns:
2
  int(0 to 1023)

Lest ihr keine Doku?
Gibt es irgendeinen Hinweis in der Doku, dass da irgendwas anderes als 
direkt der Wert vom ADC rauskommt?
#2779168
Lesenswert?

>Wenn er alles vorgekaut haben will, wirds das auch nicht so schnell mit
>der Erfahrung, die muss man sich erarbeiten.

Da ist allerdings was Wahres dran.

Wie auch immer... ich geh jetzt ins Bett, ihr Transistorschlümpfe. Muß 
morgen eine Escritura compraventa unterschreiben, da muß man 
ausgeschlafen sein.
Gast #2779169
Lesenswert?

Hey Leute

Danke euch für die Tipps ich wahr ein bisschen verwirt.
Wahr echt hilfreich.

Obwohl ich die Doku gelesen habe wurde es mir nicht ersichtlich
das direkt die ADC werte ausgegeben werden.. Nun jetzt weis ichs :-)

Um auf die gelesen Spannung Rückschließen zu können muss man rechnen
nämlich so:

sensorspannung = (analogRead(sensor) * 5.0) / 1024;

oder

sensorwert = analogRead(sensor);
sebsorspannung = (sensorwert * 5) / 1024;

danke euch

MfG

Exeo

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren