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
Wenn du einfach mal ins Datenblatt deines Controllers guckst, da stehen
die Formeln drin. Aber wahrscheinlich hat man es als Arduino Nutzer
nicht nötig, sich in derartige Gefilde zu begeben. Darum würde ich
einfach mal in der Arduino Doku gucken.
gruß cyblord
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
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.
Exeo schrieb:> ja danke die ist aber ewig lang hat weder sicher mal reinschauen...> und mir die passende Formel suchen..
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?
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
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.
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
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.
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
Exeo schrieb:> ich werde jetzt mal eine Code schreiben und in dann hier posten..
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.
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
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.
Exeo schrieb:> float sensor = 0;
muss der float sein?
So wie ich das sehe, ist 'sensor' bei dir der ADC-Pin. Der ist aber
nicht float, das ist eine stink normale ganze Zahl. Eben die Pinnummer.
> sensorwert = (analogRead(sensor) * 1024) / 5.0;
Was soll denn der 'sensorwert' darstellen?
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
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.
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..
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
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].
[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)
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
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.
>>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...
Joachim ... schrieb:> ist das gleiche wie:>> sensorwert = (analogRead(sensor) * 1024.0) / 5.0;
Was willst du eigentlich ausrechnen?
Doch ja wohl die Spannung, die am ADC anliegt. Denn den Wert vom ADC
hast du ja ohne irgendwelche Umrechnerei.
(Lies bitte die restlichen Beiträge. Das ist mir jetzt zu mühsam nochmal
alle Gedanken erneut auszubreiten)
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.
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
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
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?
Joachim ... schrieb:> (1)> 104857,6 V = 512 / (5.0 / 1024)>> (2)> 104857,6 V = (512 * 1024.0) / 5.0>> Hmmmm...
Du sagst es.
Ich weigere mich zu glauben, dass der Arduino an der Überland
Hochspannungsleitung hängt.
Joachim ... schrieb:> Ey!> cyblord, jetzt vergraul mal den Buben nicht nur weil er nicht so viel> Erfahrung hat wie du.
Wenn er alles vorgekaut haben will, wirds das auch nicht so schnell mit
der Erfahrung, die muss man sich erarbeiten.
>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.
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