Forum: Mikrocontroller und Digitale Elektronik Analoge Spannungen mit Arduino auswerten


von Johannis J. (lilo385i)


Angehängte Dateien:

Lesenswert?

Hallo Mikrocontrollergemeinde,

ich brauche mal eure Hilfe.
Ich habe einen Windrichtungsgeber und möchte diesen auswerten.
(Dokumentation ist nicht vorhanden)
An 2 Ausgängen bekomme ich jeweils ein Spannungswert bei einer 
bestimmten Gradzahl, wie auch auf dem Bild im Anhang zu sehen.

Wie lassen sich diese 2 Spannungen nun am besten auswerten, sodass ich 
eine ziemlich genau Gradzahlanzeige hinbekomme.

Habt ihr Ideen für einen Arduinosketch?

LG :)

von MaWin (Gast)


Lesenswert?

Sinus und Cosinus, da liefert atan2 den Winkel

von Christoph E. (stoppi)


Lesenswert?

Subtraktion und addition bringen in diesem Fall wenig, probiere es 
einmal mit division der beiden Spannungen. Du brauchst eine 
eineindeutige (injektive) Abbildung....

von Master-Jimmy (Gast)


Lesenswert?

Ich habe keinen Plan von Arduino. Aber du musst eigentlich bloss die 
Differenz (mit Vorzeichen) der beiden Werte berechnen.
Gut... bei 0°/360° und 180° hast du noch ein Problem. Aber da kannst du 
ja basierend auf dem letzten Messwert entscheiden, was der Wert 0 nun 
bedeutet.

von resolver (Gast)


Lesenswert?

Sieht nach einem Resolver (oder einem äquivalenten Interface) aus. Schau 
mal da: https://de.wikipedia.org/wiki/Resolver

Grundsätzlich kriegst du den Winkel mit atan((sin/cos)).

von Johannis J. (lilo385i)


Angehängte Dateien:

Lesenswert?

Danke schon mal für die schnellen antworten.

Habe die Werte nun multipliziert und erhalte eine neue Kurve.
Wie kann ich jetzt mit dieser Kurve mir dir Gradzahlen anzeigen lassen.

Gibt es da eine Übersetzungsmethode von der Spannung_min bis 
Spannung_max = Soviel Grad ?
Oder wie macht man das am besten?

von Wolfgang (Gast)


Lesenswert?

Master-Jimmy schrieb:
> Ich habe keinen Plan von Arduino. Aber du musst eigentlich bloss die
> Differenz (mit Vorzeichen) der beiden Werte berechnen.

Unsinn

Die Signale ergeben sich aus dem Winkel x und einem Offset x0 durch
1
Ch1 = U0 + U1 * sin(x+x0)
2
Ch2 = U0 + U1 * cos(x+x0)
Jetzt darfst du deine Mathekenntnisse mal hervorkramen und selber 
überlegen, wie man aus diesen beiden Gleichung den Winkel berechnet. 
Erstmal muss man U0 bestimmen und abziehen. Anschließend kann man U1 
durch Division der beiden Werte eleminieren und den Rest erledigt z.B. 
atan2(), wie schon geschrieben.

von Hannes (Gast)


Lesenswert?

Oliver R. schrieb:
> Habe die Werte nun multipliziert und erhalte eine neue Kurve.
> Wie kann ich jetzt mit dieser Kurve mir dir Gradzahlen anzeigen lassen.
>
> Gibt es da eine Übersetzungsmethode von der Spannung_min bis
> Spannung_max = Soviel Grad ?
> Oder wie macht man das am besten?

Ich verstehe deine Frage nicht:
MaWin (und auch resolver) haben's Dir doch vorgerechnet...

von PittyJ (Gast)


Lesenswert?

Ich habe nochmals gegoogelt.
In der Schule wird in Klasse 9 immer noch Trigonometrie unterrichtet, 
das wurde noch nicht eingespart.
sin, cos ... sollten also bekannt sein.

von MaWin (Gast)


Lesenswert?

Oliver R. schrieb:
> Habe die Werte nun multipliziert und erhalte eine neue Kurve.
> Wie kann ich jetzt mit dieser Kurve mir dir Gradzahlen anzeigen lassen

Gar nicht.

Du hast zwar alleine 3 nicht zum Ziel führende Antworten bekommen, aber 
multiplizieren wollte dir selbst von denen niemand empfehlen.

Keine Ahnung, wie du auf Multiplizieten kommst.

Erstmal solltest du die Nulllinie finden, eventuell bietet die 
Elektronik die als dritten Anschluss.

Und dann musst du noch wissen, welcher Faktor Bogenmass in Grad 
umrechnet.

von Johannis J. (lilo385i)


Lesenswert?

Verstehe nicht wie ich das berechnen soll.

Die beiden Spannungen von Pin2 und Pin3 kommen ja von 2 Hallsensoren die 
eine analoge Spannung ausgeben, je nachdem in welcher Stellung die Welle 
vom Windrichtungsgeber gerade steht.

Wie kann ich im Sketch implementieren das ich bei der z.B 1,8V und 2,12V 
= 10° angezeigt bekomme ?

Wie soll ich das mit atan((sin/cos)) berechnen?

von Johannis J. (lilo385i)


Lesenswert?

MaWin schrieb:

>
> Du hast zwar alleine 3 nicht zum Ziel führende Antworten bekommen, aber
> multiplizieren wollte dir selbst von denen niemand empfehlen.

Wusste nicht ganz wie ich das machen soll. Dachte wenn ich das 
multipliziere hat man eine Kurve die man eventuell besser auswerten 
kann. (Wäre das gleiche wie bei der Subtraktion)

von MaWin (Gast)


Lesenswert?

Oliver R. schrieb:
> Dachte wenn ich das multipliziere hat man eine Kurve die man eventuell
> besser auswerten kann. (Wäre das gleiche wie bei der Subtraktion)

Wo wart ihr alle, als in der Schule rechnen dran war, auf dem Pausenhof 
am kiffen ?

Eklatantes Bildungsversagen. Kein Wunder, wenn uns China mit 
Siebenmeilenstiefeln überholt.

von Johannis J. (lilo385i)


Lesenswert?

MaWin schrieb:

> Wo wart ihr alle, als in der Schule rechnen dran war, auf dem Pausenhof
> am kiffen ?
>Eklatantes Bildungsversagen. Kein Wunder, wenn uns China mit
Siebenmeilenstiefeln überholt.

Mach mal lieber ein Rechnungsvorschlag wenn du es so besser weißt :D

Bin jetzt soweit das ich eine Kurve zur Auswertung der Gradzahl verwende 
würde und die andere für Nord, Ost, Süd und West. Kann man aus einer 
Kurve eine gerade bilden von Spannung_min zu Spannnung_max und das in 
eine Gradzahl umwandeln?

Jemand eine Idee wie man das umsetzen kann oder wie man es anders machen 
kann ?

von resolver (Gast)


Lesenswert?

Wenn wir eine Offsetspannung von ca. 1.75V annahmen, ist das Signal an 
Pin2 der Cosinus und das Signal an Pin3 der Sinus. Zieh den Offset von 
den Messwerten ab, dann kannst du den Winkel so ausrechnen:
Winkel = atan((Pin3-Offset)/(Pin2-Offset))

Da kommt auch deine gewünschte Gerade heraus: 
https://www.wolframalpha.com/input/?i=plot+sin%28x%29%2C+cos%28x%29%2C+atan%28sin%28x%29%2Fcos%28x%29%29+from+-4+to+4

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Oliver R. schrieb:
> Habe die Werte nun multipliziert und erhalte eine neue Kurve.
Richtig, wieder ein Sinus, nur halt ein wenig phasenverschoben.
> Wie kann ich jetzt mit dieser Kurve mir dir Gradzahlen anzeigen lassen.
Du mit dieser neuen Kurve eben auch wieder pro Spanungswert wieder 2 
mögliche Postitionen.

Master-Jimmy schrieb:
> Ich habe keinen Plan von Arduino. Aber du musst eigentlich bloss die
> Differenz (mit Vorzeichen) der beiden Werte berechnen.
Der Witz ist dabei natürlich, dass du dann letztlich einfach wieder 
eine Sinusfunktion, aber mit einer anderen Phase bekommst, dieser neue 
Sinus hat dann bei 170° und 350° seine Nulldurchgänge. Aber auch bei 
diesem neuen Sinus gibt es für jede Spannung 2 mögliche Positionen.

> Aber da kannst du ja basierend auf dem letzten Messwert entscheiden, was
> der Wert 0 nun bedeutet.
Dann muss man sich auf den "letzten" Messwert (der ja nicht gemessen, 
sondern berechnet wurde) sicher verlassen können. Und dazu darf der Wert 
darf nicht "zu alt" sein. Das ist viel zu wacklig, und unnötig, weil wir 
hier ja einen Absolutwertgeber haben, der immer konsistent die 
richtige Postition ausgibt.

resolver schrieb:
> Grundsätzlich kriegst du den Winkel mit atan((sin/cos)).
Das ist der einzig sinnvolle Weg.
Wobei man da neben der Normierung auch die Sache mit der Division durch 
0 im Auge behalten muss.

: Bearbeitet durch Moderator
von Adam P. (adamap)


Angehängte Dateien:

Lesenswert?

resolver schrieb:
> Winkel = atan((Pin3-Offset)/(Pin2-Offset))
>
> Da kommt auch deine gewünschte Gerade heraus:

Oliver R. schrieb:
> Bin jetzt soweit das ich eine Kurve zur Auswertung der Gradzahl verwende
> würde und die andere für Nord, Ost, Süd und West.

Ja, weil du die 4 Quadranten unterscheiden/betrachten musst.
Siehe Bild: atan(sin(x)/cos(x))

atan2 ist durch 4 Bedingungen definiert:
https://en.wikipedia.org/wiki/Atan2

Du kannst atan(sin(x)/cos(x)) nehmen und musst dann bedingt durch die 
Phasenlage noch wissen in welchem Quadranten du dich befindest...schon 
hast du dein Winkel.

: Bearbeitet durch User
von Adam P. (adamap)


Lesenswert?

Aber wie ist das nach einem "Restart"?
Da kann man ja unmöglich wissen in welchem der 4 Bereiche der Geber sich 
befindet...mh.

von N. M. (mani)


Angehängte Dateien:

Lesenswert?

Oliver R. schrieb:
> Jemand eine Idee wie man das umsetzen kann oder wie man es anders machen
> kann ?

Wurde dir ja eigentlich schon gesagt. atan bzw. atan2 heißt die 
Funktion.
Du hast dabei nur 4 Schritte:
1) Deine Spannungsmessungen sind ziemlich schlecht. Zumindest je nach 
dem wie genau man auflösen möchte. Hier könnte evtl. eine Mittelung über 
mehrere Messwerte (getrennt für a und b) etwas bringen.
Außerdem solltest du a und b absolut Zeitgleich erfassen. Zwei Messungen 
hintereinander anzustoßen reicht je nach Genauigkeitsanforderungen evtl. 
nicht aus da du dann a(t-1) und b(t-2) hast. Sprich sie sind nicht 
konsistent. Gerade wenn es ein "dynamischer" Tag mit stürmischem Wind 
ist, ist eine gleichzeitige Erfassung evtl. nötig.

2) Du hast einen Offset in deinen Signalen, der muss weg. Je nach Sensor 
könnte man das entweder über geschickte Verschaltung von RefOut-Sensor 
und ADC_Ref machen. Oder Du ziehst einfach in Software einen 
berechneten/festen Wert ab.

3) Du rechnest auf die Signale den Arkustangens (z.B. über ATAN2 oder 
eine eigene ATAN2 Tabelle).

4) Du hast evtl. noch einen Offset im Winkel zu deinem Erwartungswert. 
Den musst du am Schluss noch abziehen.

von Adam P. (adamap)


Lesenswert?

Adam P. schrieb:
> Aber wie ist das nach einem "Restart"?
> Da kann man ja unmöglich wissen in welchem der 4 Bereiche der Geber sich
> befindet...mh.

Ah, vergisst es :) hatte grad ein Brett vor dem Kopf.
zu laut gedacht

von N. M. (mani)


Lesenswert?

Adam P. schrieb:
> Aber wie ist das nach einem "Restart"?
> Da kann man ja unmöglich wissen in welchem der 4 Bereiche der Geber sich
> befindet...mh.

Doch kann man. Alleine durch das Vorzeichen der Signale ist der Quadrant 
definiert.

Nimm ATAN2, der macht diese Fallunterscheidung bereits für dich.
Deshalb werden bei ATAN2 die Signale a und b als getrennte Parameter 
übergeben (Vorzeichenunterscheidung) und nicht als Quotient wie bei ATAN 
(a/b).

Edit: Mein Beitrag überschneidet sich mit dem Brett.

: Bearbeitet durch User
von MaWin (Gast)


Lesenswert?

Oliver R. schrieb:
> Mach mal lieber ein Rechnungsvorschlag

Der stand da schon:

atan2

also einfach mal nachschlagen, was diese auf deinem Arduino verfügbare 
Funktion tut.

atan2(x-1.75,y-1.75)*(180/3.1415926)

wobei die 1.75 die angenommene Nulllinie sind, also (max(x)-min(x))/2.

von Johannis J. (lilo385i)


Lesenswert?

resolver schrieb:
> Wenn wir eine Offsetspannung von ca. 1.75V annahmen, ist das Signal an
> Pin2 der Cosinus und das Signal an Pin3 der Sinus. Zieh den Offset von
> den Messwerten ab, dann kannst du den Winkel so ausrechnen:
> Winkel = atan((Pin3-Offset)/(Pin2-Offset))

Warum muss ich denn eine Offsetspannung abziehen? Und woher kommt diese 
bzw. wie kommt diese zustande?

Wenn ich die 10°,20°,30° und 40° Stellung berechne kommt folgendes raus.

bei den Werten bei 10° also 2,12V und 1.8V  =  82,3°
                bei 20° also 2,16V und 1,7V  = -83,0°
                bei 30° also 2,16V und 1,64V = -74,98°
                bei 40° also 2,16 und 1,56V  = -62,87°

Was soll ich mit den Werten anfangen und wie kann ich sie auswerten?

Weiß da wirklich nicht weiter. Hätte gedacht man nimmt einen von den 
beiden Sinuswellen und wenn der Arduino eine Spannung misst, wandelt er 
es eventuell mit einem map Befehl in eine Gradzahl um.

von zonk (Gast)


Lesenswert?

N. M. schrieb:
> Wurde dir ja eigentlich schon gesagt. atan bzw. atan2 heißt die
> Funktion.
> Du hast dabei nur 4 Schritte:

Ich befürchte das reicht dem TO nicht, er benötigt das fertige 
Arduinoprogramm um erfolgreich sein zu können

von N. M. (mani)


Lesenswert?

MaWin schrieb:
> also (max(x)-min(x))/2

Das wäre dann aber nur Vpp/2 bzw. die Amplitude.

Über min(x) + (max(x)-min(x))/2 kommt man mit den Messwerten des TOs auf 
1,67V.
Mit einer Mittelwertberechnung über alle Werte sind es 1,66V.
Ich hätte eigentlich 1,65V erwartet da der Sensor wahrscheinlich 3,3V/2 
als Nulllinie verwendet.
Aber das kann auch an der Versorgungsspannung des Sensors liegen.
Deshalb wäre evtl. auch eine radiometrische Messung nicht schlecht.

von Adam P. (adamap)


Lesenswert?

MaWin schrieb:
> wobei die 1.75 die angenommene Nulllinie sind, also (max(x)-min(x))/2.

Wäre es nicht einfacher, wenn er den DC Offset herausfiltert:
https://github.com/openenergymonitor/learn/blob/master/view/electricity-monitoring/ctac/digital-filters-for-offset-removal.md

Weiterhin habe ich noch gelesen, dass die 2 Ausgangsspannungen max. 
70,7% der Vref Amplitude betragen können, ist da was dran?
Damit könnte man ja dann die Werte normieren.

von Johannis J. (lilo385i)


Lesenswert?

zonk schrieb:
> Ich befürchte das reicht dem TO nicht, er benötigt das fertige
> Arduinoprogramm um erfolgreich sein zu können

Ein Ansatz auf ein Programm wäre schon sehr hilfreich.

von N. M. (mani)


Lesenswert?

Oliver R. schrieb:
> Warum muss ich denn eine Offsetspannung abziehen? Und woher kommt diese
> bzw. wie kommt diese zustande?

Sag uns mal die Bezeichnung des Sensors. In seinem Datenblatt wird man 
wahrscheinlich eine Beschreibung finden dass Vcc/2 Null entspricht.
Und das ist eben die Offsetspannung.

von N. M. (mani)


Lesenswert?

Oliver R. schrieb:
> Ein Ansatz auf ein Programm wäre schon sehr hilfreich.

Junge, du willst uns allen ernstes sagen dass Du die Zeile von MaWin 
nicht abtippen kannst? Mehr ist es nämlich nicht.

MaWin schrieb:
> atan2(x-1.75,y-1.75)*(180/3.1415926)

Wie gesagt kann man über die 1.75V evtl. noch streiten. Aber ansonsten 
steht da dein Quellcode 1 zu 1 da.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Oliver R. schrieb:
> Weiß da wirklich nicht weiter.

Dann solltest Du noch einmal zurück auf die Baumschule und Dich mit 
Trigonometrie befassen. Das sind absolute Grundlagen. Solche Typen wie 
Du gehörten doch damals in der Schule bestimmt zu denjenigen, die den 
Mathematikunterricht sinnlos fanden und sich womöglich über die 
angeblichen "Streber" lustig gemacht haben. Und das rächt sich nun eben 
genau an dieser Stelle. Mein Mitleid hält sich sehr in Grenzen.

von MaWin (Gast)


Lesenswert?

N. M. schrieb:
> Das wäre dann aber nur Vpp/2 bzw. die Amplitude.

Uuups, ein +  muss hinein.

von resolver (Gast)


Lesenswert?

Die 1.75V habe ich nur so pi*Daumen aus dem ersten Bild geschätzt, die 
sind sicher nicht ganz richtig...
Dokumentation gibt es anscheinend keine.

von weiter weg (Gast)


Lesenswert?

Oliver R. schrieb:
> Habt ihr Ideen für einen Arduinosketch?

Ich übersetze mal diesen Satz:

"Ich bin zu faul mein Hirn anzuwerfen, ich hab auch keine
Lust mich mit dieser Arduino-Programmierung auseinander-
zusetzen. Ausserdem finden sich ja sowieso im Internet
ein paar Leute die mir die Arbeit abnehmen und mir das
Ergebnis auf dem Silbertablett servieren. Ich liebe es
mir gebratene Tauben in den Mund fliegen zu lassen."

von Wolfgang (Gast)


Lesenswert?

Oliver R. schrieb:
> Wie kann ich im Sketch implementieren das ich bei der z.B 1,8V und 2,12V
> = 10° angezeigt bekomme ?

Bevor du irgendwas in einem Sketch implementieren, musst du dir erstmal 
die dahinter stehende Mathematik klar machen.

Wenn du verrätst, wie dein geheimer Hallsensor heißt, ergibt sich daraus 
vielleicht sogar Hinweise, wie der Offset festgelegt wird.

Sonst musst du den Windmesser ein paar Trainingsrunden drehen lassen und 
daraus die Skalierung der Signale bestimmen (Min, Max -> Mittelwert, 
Amplitude).

von Adam P. (adamap)


Lesenswert?

weiter weg schrieb:
> Oliver R. schrieb:
>> Habt ihr Ideen für einen Arduinosketch?
>
> Ich übersetze mal diesen Satz:
>
> "Ich bin zu faul mein Hirn anzuwerfen, ich hab auch keine
> Lust mich mit dieser Arduino-Programmierung auseinander-
> zusetzen. Ausserdem finden sich ja sowieso im Internet
> ein paar Leute die mir die Arbeit abnehmen und mir das
> Ergebnis auf dem Silbertablett servieren. Ich liebe es
> mir gebratene Tauben in den Mund fliegen zu lassen."

Ja, soll es auch geben.
Ich glaube jedoch, der TO versteht die Herangehensweise wirklich nicht.

Hätte man ein Datenblatt und evtl. auch seine verwendeten Spannungen 
etc.
könnte man ihm evtl. erklären, warum es ist wie es ist und warum man 
dies und das machen muss um zu einem Ergebnis zu kommen...tja.

von Sebastian (Gast)


Lesenswert?

Oliver R. schrieb:
> bei den Werten bei 10° also 2,12V und 1.8V  =  82,3°
>                 bei 20° also 2,16V und 1,7V  = -83,0°
>                 bei 30° also 2,16V und 1,64V = -74,98°
>                 bei 40° also 2,16 und 1,56V  = -62,87°

swangnic@tgs-dev-160> python3
>>> import math
>>> math.atan2(2.12-1.65,1.8-1.65)*180/math.pi
72.2995722113328
>>> math.atan2(2.16-1.65,1.7-1.65)*180/math.pi
84.40066066347943
>>> math.atan2(2.16-1.65,1.64-1.65)*180/math.pi
91.12330271407544
>>> math.atan2(2.16-1.65,1.56-1.65)*180/math.pi
100.00797980144131

LG, Sebastian

von Wolfgang (Gast)


Lesenswert?

Adam P. schrieb:
> Hätte man ein Datenblatt und evtl. auch seine verwendeten Spannungen
> etc.
> könnte man ihm evtl. erklären, warum es ist wie es ist und warum man
> dies und das machen muss um zu einem Ergebnis zu kommen...tja.

Wenigstens könnte er seine Daten in maschinenlesbarer Form hochladen, 
damit man ihm die Lösung ausrechnen kann.
Vielleicht begreift er dann, dass manche Dinge in der Schule durchaus 
einen Sinn haben.

von Wolfgang (Gast)


Lesenswert?

Oliver R. schrieb:
> Mach mal lieber ein Rechnungsvorschlag wenn du es so besser weißt :D

resolver schrieb:
> Grundsätzlich kriegst du den Winkel mit atan((sin/cos)).

MaWin schrieb:
> Und dann musst du noch wissen, welcher Faktor Bogenmass in Grad
> umrechnet.

von Johannis J. (lilo385i)


Lesenswert?

Wieso berechnet man das denn mit überhaupt mit 
math.atan2(2.12-1.65,1.8-1.65)*180/math.pi ?

Warum geht es nicht mit einer linearen Funktion das man die Pins 2 & 3 
misst und dann die Spannungen mit einem map Befehl auf Grad überträgt. 
Wäre für mich das einzige verständnisvolle und verstehe noch nicht den 
Sinn hinter der Berechnung mit den atan2.

Da ich kein Experte bin und ich hier im Forum nach Hilfe frage, bitte 
ich um hilfreiche Antworten. Genörgel kann sich gespart werden...
Das hilft bestimmt nicht bei einem freundlichen Austausch von Wissen.

Nach dem Hallsensor werde ich gleich mal schauen ob ich die Bezeichnung 
herausbekomme. Ansonsten gibt es leider keine Dokumentation, da der 
Windrichtungsgeber aus einer Wetterstation ausgebaut wurde.

von Adam P. (adamap)


Lesenswert?

Oliver R. schrieb:
> Warum geht es nicht mit einer linearen Funktion

Weil Sinus und Kosinus nun mal keine linearen Funktionen sind!

Klar du könntest dir eine Look-Up-Table basteln und dann da die Werte 
suchen und das Ergebnis ablesen. Jedoch um dir diese Table zu basteln, 
benötigst du wiederum eine Formel um dir die Werte einmal auszurechnen.

von Wolfgang (Gast)


Lesenswert?

Oliver R. schrieb:
> Warum geht es nicht mit einer linearen Funktion das man die Pins 2 & 3
> misst

Weil der Sensor die Komponenten eines rotierende Magnetfeldes misst.

von Sebastian (Gast)


Lesenswert?

Oliver R. schrieb:
> Warum geht es nicht mit einer linearen Funktion das man die Pins 2 & 3
> misst und dann die Spannungen mit einem map Befehl auf Grad überträgt.
> Wäre für mich das einzige verständnisvolle und verstehe noch nicht den
> Sinn hinter der Berechnung mit den atan2.

Na ja, bei atan2 steht der erste Wert steht für die Auslenkung in 
y-Richtung und der zweite für die Auslenkung in x-Richtung, mit 0 für 
keine Auslenkung, und genau das liefert dein Windrichtungssensor 
(allerdings nicht mit 0 sondern mit 1.65V für keine Auslenkung, darum 
die Subtraktion von 1.65). Und dann liefert atan2 die Richtung als 
Winkel zurück, und zwar als vollen Kreiswinkel in Bogenmass zwischen 0 
und 2*PI.

LG, Sebastian

von N. M. (mani)


Lesenswert?

Adam P. schrieb:
> Klar du könntest dir eine Look-Up-Table basteln und dann da die Werte
> suchen und das Ergebnis ablesen.

Was in vielen ATAN Funktionen auch so gemacht wird.
Letzten Endes wird der richtige Wert aus dem Quotienten aus dem Flash 
gezerrt.
Bei ATAN2 dann nochmal mit einer Fallunterscheidung bzgl Quadranten und 
einer Addition mit 90, 180 oder 270 Grad.

Also warum nicht die fertige Funktion nehmen die funktioniert?

: Bearbeitet durch User
von Adam P. (adamap)


Lesenswert?

N. M. schrieb:
> Also warum nicht die fertige Funktion nehmen die funktioniert?

Versteh ich auch nicht.

Aber nun wurden ja schon mehrere Wege aufgezeigt die zum Ziel führen.
...Qual der Wahl.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Das Problem ist doch, dass das Signal keine sauberen Sinus- und 
Cosinuswerte auf dem Einheitskreis sind, sondern unterschiedliche 
Offsets und unterschiedliche Amplituden haben. Man hat mehr Unbekannte 
als erwartet.

von Udo S. (urschmitt)


Lesenswert?

Oliver R. schrieb:
> Wäre für mich das einzige verständnisvolle

Du lernst gerade schmerzhaft warum die blöden Lehrer und die Idioten in 
den Kultusministerien immer noch darauf bestehen dass Mathematik ein 
Pflichtfach in der Schule ist.

von resolver (Gast)


Lesenswert?

Naja, wir wissen nicht, wie diese Werte aufgenommen wurden. Für einen 
ersten Gehversuch und ein grobes Ergebnis sollten sie aber verwendbar 
sein. Wenn das Prinzip einmal implementiert (oder vielleicht sogar 
verstanden) ist, kann man sich immer noch Gedanken machen, wie die 
Signalqualität verbessert werden kann.

von Wolfgang (Gast)


Lesenswert?

Christoph db1uq K. schrieb:
> Man hat mehr Unbekannte als erwartet.

Dann war die Erwartungshaltung halt falsch.

Ich korrigiere mich also und schreibe besser:
1
Ch1 = U01 + U11 * sin(x+x0)
2
Ch2 = U02 + U12 * cos(x+x0)

Bist du jetzt beruhigt. Messpunkte, um die Werte zu bestimmen, bekommt 
man genug, wenn man mindestens eine volle Umdrehung aufzeichnet. Als 
erster Ansatz dürfte das reichen. Wenn die Sensoren nicht ausreichend 
sauber senkrecht aufeinander stehen, ist die Phasenverschiebung x0 für 
die beiden Komponenten auch noch verschieden.

Jedes Smartphone mit Kompassfunktion bestimmt so die 
Sensorcharakteristik beim Kalibrieren, beim Beschleunigungssensor auch 
in 3D.

von LostInMusic (Gast)


Lesenswert?

Unter der Annahme, die beiden Kurven haben denselben Offset und dieselbe 
Amplitude, sind das die besten Näherungen (a = rote Kurve, b = blaue 
Kurve):

a(x) = 1.67 + 0.49·sin(x + pi/3)
b(x) = 1.67 + 0.49·cos(x + pi/3)

Daraus kann man auf den Winkel x (im Bogenmaß) zurückrechnen mit

x = arctan((a - 1.67)/(b - 1.67)) - pi/3

(Achtung: Schutz vor möglicher Division durch Null erforderlich!) 
beziehungsweise

x = atan2(a - 1.67, b - 1.67) - pi/3

(Schutz eingebaut).

x · 180/pi liefert die Maßzahl des Winkels in der Einheit Grad.

>Das Problem ist doch, dass das Signal keine sauberen Sinus- und
>Cosinuswerte auf dem Einheitskreis sind

Ja. Es ist kein Präzisionsinstrument und das ist völlig OK, weil eine 
Windrichtung an sich schon mit einer gewissen Ungenauigkeit behaftet 
ist. Deshalb wäre es in dieser Anwendung Nonsens, den Winkel auf 1° 
genau ausrechnen zu wollen. Der Fehler im Ergebnis wird sich als 
zweckentsprechend akzeptabel erweisen - nicht mehr, nicht weniger.

von Wolfgang (Gast)


Lesenswert?

Adam P. schrieb:
> Wäre es nicht einfacher, wenn er den DC Offset herausfiltert:

Du bist ja lustig. Was für ein Filter stellst du dir vor, wenn z.B. der 
Wind aus einer konstanten Richtung weht und die Werte sich innerhalb von 
ein paar Stunden nur minimal um den interessierenden Wert schwanken?

(Quasi) DC IST der Messwert, denn will man nicht rausfiltern.

von jo (Gast)


Angehängte Dateien:

Lesenswert?

Oliver R. schrieb:
> Wieso berechnet man das denn mit überhaupt mit
> math.atan2(2.12-1.65,1.8-1.65)*180/math.pi ?

Oliver - gib dir mal ein klein wenig Mühe!!!

https://www.studimup.de/abitur/geometrie/sinus-cosinus-und-tangens/

Dieser Seite habe ich das Bild in der Anlage entnommen.

Die ROTE und die BLAUE Linie, das sind die beiden Ausgänge deines 
Sensors (Offset mal raus gerechnet). Die dünne, schwarze Linie, das 
stellt deine Windfahne dar. Je nachdem, wo die hinzeigt, andert sich 
auch die rote und blaue Linie (übrigens: das kann man auf der www-Seite 
ausprobieren).

Die rote und blaue Linie, sowie die Winkelangabe hängen also voneinander 
ab. Wenn man den Winkel vorgibt, kann man daraus rot (Sinus) und blau 
(Cosinus) berechen.

Und ungekehrt: Wenn man rot und blau vorgegeben hat, kann man den Winkel 
berechen. Die mathematische Funktion hierzu nennt sich Arkus-Tangens - 
kurz ATAN.

Im Programm verwendet man aber besser atan2().

von Adam P. (adamap)


Angehängte Dateien:

Lesenswert?

Vielleicht sind die Berechnungen noch nicht ganz optimal,
aber evtl. versteht der TO anhand der Excel Datei:
wie, warum, weshalb.

Ihr könnt die Datei ruhig für andere Darstellungen verwenden.

Feierabend ;)

edit:
Hab aus normierten Werten seine Kurve versucht nachzustellen
und dann im 2ten Schritt den Offset abgezogen und im 3ten Schritt
den Winkel berechnet...
Ja die Grenzabfrage (DIV 0) fehlt und muss im Code natürlich abgefangen 
werden.

von Adam P. (adamap)


Lesenswert?

Wolfgang schrieb:
> (Quasi) DC IST der Messwert, denn will man nicht rausfiltern.

Ja da hast du recht...
Ich hatte noch ein Bild im Kopf, wo der Sensor mit einerm Sinus gespeißt 
wurde. Ich nehme alles zurück :)

von Wolfgang (Gast)


Lesenswert?

Adam P. schrieb:
> Ja die Grenzabfrage (DIV 0) fehlt und muss im Code natürlich abgefangen
> werden.

Abfrage auf "≠0" im Code ist bei float tödlich

von Rainer V. (a_zip)


Lesenswert?

Nicht nur heute gibt es die verkannten Mathegenies! Als ich vor langer 
Zeit mit ein Paar Studienkollegen die Vorbereitung aufs Vordiplom in 
Angriff nahm, gab's da tatsächlich auch Leute, die (immer noch) keine 
Ahnung von Trigonometrischen Funktionen hatten. Waren zwar zufällig alle 
Lehramtskandidaten, aber dennoch...
Hier denke ich, dass das ohne Angaben zum Sensor sicher nichts wird. 
Wenn man allerdings genau wüßte, was der TO da wie mißt, könnte man 
natürlich die Kurven gescheit aufnehmen und auswerten. Und auch wenn man 
in ein Datenblatt schauen könnte, wird dem TO kaum etwas zu vermitteln 
sein! Selbst wenn er es schaffen sollte, die Formel in sein Progrämmchen 
reinzuschreiben. Gibt es denn überhaupt ein Programm?? Das wird sicher 
eine gestandene Hängepartie, aber nun :-)
Gruß Rainer

von Master-Jimmy (Gast)


Lesenswert?

Rainer V. schrieb:
> Nicht nur heute gibt es die verkannten Mathegenies! Als ich vor
> langer
> Zeit mit ein Paar Studienkollegen die Vorbereitung aufs Vordiplom in
> Angriff nahm, gab's da tatsächlich auch Leute, die (immer noch) keine
> Ahnung von Trigonometrischen Funktionen hatten. Waren zwar zufällig alle
> Lehramtskandidaten, aber dennoch...
> Hier denke ich, dass das ohne Angaben zum Sensor sicher nichts wird.
> Wenn man allerdings genau wüßte, was der TO da wie mißt, könnte man
> natürlich die Kurven gescheit aufnehmen und auswerten. Und auch wenn man
> in ein Datenblatt schauen könnte, wird dem TO kaum etwas zu vermitteln
> sein! Selbst wenn er es schaffen sollte, die Formel in sein Progrämmchen
> reinzuschreiben. Gibt es denn überhaupt ein Programm?? Das wird sicher
> eine gestandene Hängepartie, aber nun :-)
> Gruß Rainer
Naja... für die gezeigten Kurven lässt sich das doch sehr einfach in 
Code giessen:
1
#define PI 3.141592654
2
3
float get_arc(const float* v2, const float* v3) {
4
    float a = 180.0 / PI * (atan2(*v3 - 1.67, *v2 - 1.67) - PI / 3.0);
5
    return a < 0.0 ? 360.0 + a : a;
6
}
Sind die Bedingungen anders, muss halt an der Formel "gedreht" werden.

von Wolfgang (Gast)


Angehängte Dateien:

Lesenswert?

Rainer V. schrieb:
> Wenn man allerdings genau wüßte, was der TO da wie mißt, könnte man
> natürlich die Kurven gescheit aufnehmen und auswerten.

Das könnte z.B. eine Windfahne mit einem Magneten auf der Achse sein, 
die sich über einem 2D-Hallsensor dreht. Aber wie die Daten erzeugt 
werden, ist für den Auswertealgorithmus ziemlich egal.

Oliver R. schrieb:
> Spannunsgwerte_Hallsensoren_Jpg.jpg

Die Kurven lassen sich ganz gut durch
1
Ch1 = U01 - U11 * sin(x+x0)
2
Ch2 = U02 + U12 * cos(x+x0)
3
mit
4
U01 = 1,665
5
U11 = 0,492
6
U02 = 1,684
7
U12 = 0,467
8
x0 = -27,9
 beschreiben.

Was fehlt dir noch?

Da der TO es nicht fertig bringt, seine Werte in maschinenlesbarer Form 
hochzuladen, habe ich sie mal aus dem JPG befreit ;-)

von weiter weg (Gast)


Lesenswert?

Wolfgang schrieb:
> Was fehlt dir noch?

Der TO lässt euch alle noch zappeln ... er will ja einen
fertigen Sketch.

*.ino!  Alles andere ist nur Gelabere!

von Wolfgang (Gast)


Lesenswert?

Ch2 scheint zwischen 30 und 60 Grad in einer Begrenzung zu hängen. Da 
ist der Magnet wohl etwas zu dicht am Sensor bzw. zu stark.

Da könnte man noch mal dran arbeiten und dann die Parameter noch mal 
optimieren.

von Wolfgang (Gast)


Lesenswert?

weiter weg schrieb:
> Der TO lässt euch alle noch zappeln ... er will ja einen
> fertigen Sketch.
+1   ;-)

von Master-Jimmy (Gast)


Lesenswert?

Lothar M. schrieb:
> Master-Jimmy schrieb:
>
>> Ich habe keinen Plan von Arduino. Aber du musst eigentlich bloss die
>> Differenz (mit Vorzeichen) der beiden Werte berechnen.
>
> Der Witz ist dabei natürlich, dass du dann letztlich einfach wieder eine
> Sinusfunktion, aber mit einer anderen Phase bekommst, dieser neue Sinus
> hat dann bei 170° und 350° seine Nulldurchgänge. Aber auch bei diesem
> neuen Sinus gibt es für jede Spannung 2 mögliche Positionen.

Das stimmt nicht. Ausser den Nulldurchgängen kann jedem Differenzwert 
ein Winkel zugeordnet werden. Denn die Differenzkurve schwingt ja um die 
Abszisse.

Die Methode mit atan2 ist sicherlich deutlich eleganter und einfacher 
aus math. Sicht. Aber für den uC wäre es wohl einfacher und effizienter 
die Differenz anhand einer simplen Lookup-Tabelle in einen Winkel 
umzurechnen.

von Wolfgang (Gast)


Lesenswert?

Master-Jimmy schrieb:
> Ausser den Nulldurchgängen kann jedem Differenzwert
> ein Winkel zugeordnet werden. Denn die Differenzkurve schwingt ja um die
> Abszisse.

Ja, nee is klar.
Hast du dir die Differenzwerte mal geplottet?
Prinzipbedingt bekommst die zu einem Winkel α genau bei 180°-α die selbe 
Differenz.

von Master-Jimmy (Gast)


Lesenswert?

Wolfgang schrieb:
> Master-Jimmy schrieb:
>
>> Ausser den Nulldurchgängen kann jedem Differenzwert
>> ein Winkel zugeordnet werden. Denn die Differenzkurve schwingt ja um die
>> Abszisse.
>
> Ja, nee is klar.
> Hast du dir die Differenzwerte mal geplottet?
> Prinzipbedingt bekommst die zu einem Winkel α genau bei 180°-α die selbe
> Differenz.

Nein. Der Betrag ist derselbe. Der Betrag ist sber nicht der Wert.

von Wolfgang (Gast)


Angehängte Dateien:

Lesenswert?

Master-Jimmy schrieb:
> Nein. Der Betrag ist derselbe. Der Betrag ist sber nicht der Wert.

Guck's dir an - oder was meinst du.
Mit Betrag hättest du vier mal den selben Wert.

von LostInMusic (Gast)


Lesenswert?

>... bloss die Differenz (mit Vorzeichen) der beiden Werte berechnen.

[ironie]
Das geht nur, wenn Du beide Differenzen berechnest, also Sensor1 - 
Sensor2 und dann auch noch Sensor2 - Sensor 1.
[/ironie]

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Master-Jimmy schrieb:
> Das stimmt nicht. Ausser den Nulldurchgängen kann jedem Differenzwert
> ein Winkel zugeordnet werden.
Für die Nulldurchgänge gibt es sozusagen eigentlich sogar 3 Winkel:
0°, 180° und 360°.
Denn von von 0,001° kommend über 0° ist der nächste Wert eben -0,001° 
und nicht 359,999°. Und genauso ginge es nach 359,999° eigentlich über 
360° und 360,001° weiter.

> Denn die Differenzkurve schwingt ja um die Abszisse.
Tut sie doch bei jedem einzelnen der beiden Originalsignale auch. Nur 
musst du dann die "Abszisse" eben um 1,7V nach oben verlegen. Ich habe 
das mal im Originalbild gemacht und das blaue signal hervorgehoben.

> Denn die Differenzkurve schwingt ja um die Abszisse.
Die neue Kurve bleibt aber wie bei jeder Addition oder Subtraktion 
zweier Sinusfunktionen mit gleicher Frequenz immer noch ein Sinus (mal 
von Grenzbetrachtungen wie z.B. 180° Phasenverschiebung bei gleicher 
Amplitude abgesehen). Nur eben mit einer neuen Amplitude und anderer 
Phasenlage.

: Bearbeitet durch Moderator
von Wolfgang (Gast)


Lesenswert?

Lothar M. schrieb:
> Für die Nulldurchgänge gibt es sozusagen eigentlich sogar 3 Winkel:
> 0°, 180° und 360°.

Die Kreisbewegung ist periodisch mit 360°. Ob du 0°±x oder 360°±x 
schreibst, ist egal. Der Unterschied ist, dass +0° nicht von -0° 
unterschieden wird. An den Nullstellen, die man in der Differenzkurve 
sieht, fallen +0° und -0° jeweils auf den selben Punkt - eben 0°.

von Johannis J. (lilo385i)


Lesenswert?

Adam P. schrieb:
> Vielleicht sind die Berechnungen noch nicht ganz optimal,
> aber evtl. versteht der TO anhand der Excel Datei:
> wie, warum, weshalb.
>
> Ihr könnt die Datei ruhig für andere Darstellungen verwenden.
>
> Feierabend ;)
>
> edit:
> Hab aus normierten Werten seine Kurve versucht nachzustellen
> und dann im 2ten Schritt den Offset abgezogen und im 3ten Schritt
> den Winkel berechnet...
> Ja die Grenzabfrage (DIV 0) fehlt und muss im Code natürlich abgefangen
> werden.

Vielen Dank für die Tabellen die sind echt Super!

Und danke auch den anderen hilfreichen Antworten,
hab es nun auch verstanden und müsste es hinbekommen.
Schönen Tag noch!:)

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.