Wenn der erste Sensor mit dem Messwert s1 am Winkel 0°, der zweite mit
dem Messwert s2 am Winkel 120° liegt und der Rotor 1 Polpaar hat, kann
der Winkel des Rotors folgendermaßen berechnet werden:
1 | winkel = atan2(s1+2*s2, s1*sqrt(3));
|
Die Konstante sqrt(3) braucht natürlich nur einmal berechnet werden.
Hat der Rotor n Polpaare, muss der Winkel noch durch n dividiert und
die Anzahl der Perioden mitgezählt und berücksichtigt werden, um ein
eindeutiges Ergebnis zu erhalten.
Bei zwei um 120° versetzten Sensoren wird das Ergebnis stärker von
Messfehlern beeinflusst als bei 90°. Wenn du damit leben kannst, ist
alles ok, wenn nicht, müsste man alle drei Messwerte bei der Messung
berücksichtigen. Dann wird aber die Berechnung komplizierter.
Das Ergebnis ist natürlich nur so genau wie die Messungen. Wichtig
hierbei ist, dass die Sensoren tatsächlich ein sauberes Sinussignal
liefern und beide Signale die gleiche Amplitude haben.
Wenn dies nicht der Fall ist und du lieber mit Tabellen arbeiten
möchtest, wie es Frank vorgeschlagen hat, würde ich evtl. so vorgehen,
dass abhängig von der Winkelstellung des Rotors immer nur einer der
drei Sensoren ausgwertet wird, nämlich derjenige, dessen Signal in
einem Bereich von ±30° um einen der beiden Nullpunkte des Sinussignals
liegt. Da dort die Steigung des Signals am größten ist, ist die
Genauigkeit höher als für die jeweils anderen beiden Sensoren. Jeder
der drei Sensoren bekommt also eine eindimensionale Umsetzungstabelle
für diesen ±-30°-Bereich. Läuft der Rotor aus diesem Bereich hinaus,
wird auf den nächsten Sensor umgeschaltet.
Dieses Vorgehen erspart ein nebenbei speicherintensives zwei- oder gar
dreidimensionales Array zur Umsetzung der Werte.