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
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
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.
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
Markus U. schrieb > Mehr Infos übrigens hier: > > http://arduino.cc/en/Reference/AnalogReference > http://arduino.cc/en/Reference/AnalogRead ja danke das habe ich mir auch schon angeschaut aber irgendwie keinen Überblick bekommen.. mfg exeo
Wie süß alle Arduino Voruteile bestätigt werden. Da freu ich mich :)
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.
Joachim ... schrieb: >>sensorwert = analogRead(sensor) / (VREF / 1024) > > Yep, das sollte stimmen. Aber nur, wenn er die Formel noch ein wenig umstellt Beitrag "Re: Arduino analoge Spannungsauslesung"
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.
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); }
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].
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)
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
ich habs ^^ sensorwert = (((analogRead(sensor) * 5.0) /1024) * 1024.0) / 5; danke dir nochmal Karl Heinz Buchegger für deine geduld und hilfreichen tipps.. 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?
Taschenrechnerrauskram... (1) sensorwert = analogRead(sensor) / (VREF / 1024) (2) sensorwert = (analogRead(sensor) * 1024.0) / 5.0; Beide sollen das gleiche ergeben mit Vref = 5.0V (1) 104857,6 V = 512 / (5.0 / 1024) (2) 104857,6 V = (512 * 1024.0) / 5.0 Hmmmm...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.