Hallo, ich stehe gerade etwas auf dem Schlauch: Ich soll den Winkel eines BLDC-Motors bestimmen und habe hierzu nur die drei um jeweils 120° verschobenen Signale der integrierten Hallsensoren zur Verfügung. Wie kann ich hieraus möglichst einfach den Drehwinkel bestimmen? Ein Mikrocontroller mit ADC-Eingängen steht hierfür zur Verfügung. Wären die Sensoren um 90° zueinander versetzt, kann ich einfach den arctan(Signal1/Signal2) nehmen, aber bei 120°? Mark
Vielen Dank für die qualifizierte Aussage, nur hilft mir das nicht weiter. Ich komme wirklich gerade nicht weiter, wenn ich die beiden Messwerte habe und den resultierenden Winkel zwischen 1 und 360° bestimmen will.
die Hallsensoren sind doch digital, oder ? Dann kannst Du den Winkel nur in 30° Schritten bestimmen.
Nein, analoge Hallsensoren die ein Sinus-Signal ausgeben.
Soweit ich weiß, sind die Sensoren analog, doch das zu erfassende Signal wird mittels Interruptflanke an einem mC Pin erfasst, so dass man tatsächlich nur eine 30° zur Verfügung hat. Am besten schaust Du doch einfach mal in eine Application Note (es gibt unzählige, jeder mC Hersteller hat mind. eine mit Hall-Sensoren!!!)
Wenn es sich nicht um spezielle werksseitig kalibrierte Winkelgeber-Versionen handelt, wird es schwierig mit der Geanuigkeit. Ich denke, es wird ohne Look-Up-Table nicht oder nur mit erheblichem Aufwand klappen. Ansonsten: 2 Hall-Sensoren --> 2 ADC-Kanäle ergeben die zwei Koordinaten in einer großen Matrix, aus der du dann den zugehörigen WInkel ausliest. In der Firmware könnte man gleich einen Teach-In-Lernmodus einbauen. Frank
Das Problem ist, dass sie alle die Hallsignale digital erfassen (analoge halt über Komparator) und dann den Motor in Block-Kommutierung bestromen. Wird mit einem Sinus bestromt, werden die Zwischenschritte über die Zeit interpoliert. Dafür ist jedoch eine konstante Drehzahl nötig, die ich nicht haben werde.
@ Frank: Wie würdest du die Tabelle denn sinnvollerweise aufbauen? Die PWM später läuft mit ca. 10bit Auflösung, mehr Zwischenschritte machen also auch bei der Winkelbestimmung nicht Sinn.
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.
Hi Mark, Du könntest deine drei 120° phasenverschobenen Signale (a, b, c) in ein orthogonales Ersatzsystem (alpha, beta) umrechnen und dann mittels atan2 den Lagewinkel berechnen: alpha = a beta = 1/sqrt(3)(a + 2*b) phi = atan2(beta,alpha) Du benötigst also nur zwei AD-Signale da das dritte Signal redundant ist. (a+b+c=0) Hierzu kannst Du auch mal unter dem Stichwort Clarke Transformation googlen. Gruß, Ralf
viel zu kompliziert die antwort wahr schon da der Korrektur wert ist zum arctan = tan(30°) Dieser wird vor der berechnung von arctan aufadiert bzw abgezogen (Stich wort Offsetverschiebung). Und schön ist.
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.