www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Software zur Erkennung des Winkels durch 2 hallsensoren


Autor: Pad Semos (padesmos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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ß.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Frank Esselbach (Firma: Q3) (qualidat)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Peter X. (vielfrass)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Peter X. (vielfrass)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, muss natürlich (Sensor_y / Sensor_x) heissen!

Autor: Pad Semos (padesmos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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ß

Autor: Pad Semos (padesmos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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ß

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Pad Semos (padesmos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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ß

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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?

Autor: Pad Semos (padesmos)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
das Stabmagnete mit 8x3x3mm.
Bitte schau mal die Skizze

Autor: Pad Semos (padesmos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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ß

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo ist denn der gesuchte Winkel im Bild?

Autor: Pad Semos (padesmos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
in der Skizze kannst du keine Winkel dargestellt sehen,
es werden aber 360° durch den ganzen U-Änderungsbereich
verteilt und berechnet.

Autor: Pedro Pafit (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
kapier nix xD

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.