Hallo Leute , ich bekomme 2 Hallspannungen, die ich mit einem AD unwandle, und will mit deren Werten den Winkel erkennen. Ich weiß es geht durch Arctanges, habe aber nicht viel Ahnung in C, da ganz Anfänger. Hat jemand eine idee wie ich es realisieren kann bzw. eine Code-Muster? Ich freue mich für jede baldige Antwort, da ich mit dem projekt Ende Mai fertig sein muß.
Ali Serbouti wrote: > Hallo Leute , > ich bekomme 2 Hallspannungen, die ich mit einem AD unwandle, und will > mit deren Werten den Winkel erkennen. Ich weiß es geht durch Arctanges, > habe aber nicht viel Ahnung in C, da ganz Anfänger. Die Arcus Tangens Funktion heist in C atan(). Meist benutzt man aber die atan2() Funktion, da sie * einfacher zu benutzen ist * den Quadranten auch richtig bestimmt. Details zu atan bzw atan2 findest du in jedem C-Buch bzw. mit google. Noch ein Hinweis: Du bekommst den Winkel in Radianten, nicht in Grad.
Wenn du einen Mikrocontroller dabei hast, dann würde ich den Winkel über eine LUT (look up table) aus den Sensordaten ermitteln. Wird genauer ... Frank
Frank Esselbach wrote: > Wenn du einen Mikrocontroller dabei hast, dann würde ich den Winkel über > eine LUT (look up table) aus den Sensordaten ermitteln. Wird genauer ... > Wie bitte sehr, soll denn eine Tabelle mit sagen wir mal 1024 Werten genauer sein, als eine Berechnung folgender Art: Winkel_in_grad = atan2(Sensor_x / Sensor_y) * 180 / PI; Auf die Tabelle zugreifen ist zwar schneller, aber der Zeitgewinn ist spätestens dann wieder verloren, wenn man interpolieren muss.
Sorry, muss natürlich (Sensor_y / Sensor_x) heissen!
hallo,
Danke für die schnelle Antwort,
ich benutze einen S08 von Motorola mit einer 10Bit Auflösung.
>dann würde ich den Winkel über eine LUT
meinst du etwa wie das Beispiel:
HAL_POS__Deg[2][180] =
{{ 0, 2, 4, 5, 7, 9, 11, 12,
14, 16, 17, 19, 21, 22, 24, 25,
27, 28, 29, 31, 32, 33, 35, 36,
37, 38, 39, 40, 41, 42, 43, 44,
45,...,180},
{ 0, -2, -4, -5, -7, -9,-11,-12,
-14,-16,-17,-19,-21,-22,-24,-25,
-27,-28,-29,-31,-32,-33,-35,-36,
-37,-38,-39,-40,-41,-42,-43,-44,
-45,...,-180}
};
Ich bekomme 2 u-werte in Form von Bytes(0..1023)
Wie kann ich diese mit der LUT verbinden?
Gruß
Hallo Peter X,
>der Zeitgewinn ist spätestens dann wieder verloren, wenn man >interpolieren muss.
Meinst du etwa die Mittelwertbildung von mehreren Werten durch ein
Filter?
Gruß
Welche Signale liefern die beiden Sensoren? Ich nehme an, es handelt sich um einen rotierenden Magnet, dessen Feld von zwei Hallsensoren gemessen wird. Bei geeigneter Form des Magnetfelds und geschickter Anordnung der Sensoren liefern diese bei einem zweipoligen Magnet Signale, die zum Sinus bzw. zum Cosinus des Drehwinkels proportional sind. Der Drehwinkel lässt sich dann leicht aus den Messwerten berechnen: winkel = atan2(hall_y, hall_x); Hat der Magnet 2*n Pole, so wiederholen sich die Signale periodisch nach einer Drehung um 2*pi/n, die Messwerte sind also mehrdeutig. Um den Winkel über eine Volldrehung zu bestimmen, müssen die Perioden der Signale gezählt werden. Der Winkelversatz innerhalb einer Periode ist winkelversatz = atan2(hall_y, hall_x) / n; Leider sind die von den Hallsensoren gelieferten Signale meist nicht exakt sinusförmig, sondern verzerrt. Um ein genaues Ergebnis zu erhalten, muss diese Verzerrung ermittelt und beim Einlesen der Messwerte herausgerechnet werden. Bevor du dich mit LUTs herumschlägst, würde ich es erst einmal mit der atan2-Funktion probieren, sofern die Laufzeitbibliothek deines C-Compilers diese unterstützt. Die geneuigkeit des Ergebnisses hängt dann praktisch nur von der Geneuigkeit der Messignale ab. Erst wenn du damit zufrieden bist, kannst du beginnen, eine rechenzeitoptimierte und genauigkeitsreduzierte Lösung mit LUTs zu suchen.
Hallo, es ist eigentlich kein rotierender magnet. Es sind 2 magnete und 2 Hallsensoren. Jeder Magnet bewegt sich horizontal um seinen Hallsensor in einem bereich von 3,2mm. Das heisst zB. bei x=0mm-->Ux=0,5V(Offset) x=3,2mm-->Ux=4,5V Jeder Magnet hat nur 2 Pole(N&S) . Hier hast was gesagt, das mich sehr stört, und finde noch nicht den Weg dafür: >Leider sind die von den Hallsensoren gelieferten Signale meist nicht >exakt sinusförmig, sondern verzerrt. Um ein genaues Ergebnis zu >erhalten, muss diese Verzerrung ermittelt und beim Einlesen der >Messwerte herausgerechnet werden. wie kann ich es dann ermitteln, soll ich eine "Soll-Kennline" erstellen und sie dann zu meinem Hall-x bzw. Hall-y betrachten?? Wie kann ich überhaupt die Nichtlinearität bestimmen? Danke nochmal für eure Zeit und Mühe! Gruß
> Es sind 2 magnete und 2 Hallsensoren. Jeder Magnet bewegt sich > horizontal > um seinen Hallsensor in einem bereich von 3,2mm. > Das heisst zB. bei x=0mm-->Ux=0,5V(Offset) > x=3,2mm-->Ux=4,5V Das habe ich jetzt nicht ganz verstanden: Was sind das für Magnete? Stabmagnete? Wie genau sieht die Bewegung aus? Sind die beiden Magnete miteinander verbunden, oder bewegen sie sich unabhängig voneinander? Wo taucht der zu messende Winkel auf? Gibt es vielleicht eine kleine Skizze zu der ganzen Geschichte?
Hallo das Stabmagnete mit 8x3x3mm. Bitte schau mal die Skizze
Wie kann ich eine Aussage über das Messsystem vorher darstellen? da bei mir Hardware(Mechanik) eine grosse Rolle spielt, das sich der Abstand zw. Magnet und Hallsensor mit der 3. Potenz auf die Ausgangsspannung einwirkt. Gruß
Wo ist denn der gesuchte Winkel im Bild?
Hallo, in der Skizze kannst du keine Winkel dargestellt sehen, es werden aber 360° durch den ganzen U-Änderungsbereich verteilt und berechnet.
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.