Woher kommen diese Werte für BLDC Ansteuerung?

Hallo,
ich möchte einen Brushless-DC Motor mit einem Arduino ansteuern und einem Potentiometer regeln.
Dazu gibts im Internet ja viele Beispiele, die die Servo Bibliothek benutzen.

Nun stoße ich immer wieder auf folgende Codezeile in den Beispielen:

val = map(analogRead(A0), 0, 1023, 30, 110);
servo.write(val);

Wenn ich über die Servo Bibliothek lese, dann versteh ich das so, dass 0=1ms und 180=2ms sind.
Also 0 für Stillstand und 180 für 2ms, was "Vollgas" entspricht.
In manchen Beispielen findet man dann tatsächlich auch den Code

val = map(analogRead(A0), 0, 1023, 0, 180);
servo.write(val)

Das macht für mich sinn, aber was hat es mit den Werten 30 und 110 auf sich? Die werden sich ja auch dabei was gedacht haben :cold_sweat:

Liebe Grüße

Hallo,

die beiden Zeilen haben nichts miteinander zu tun. Schau mal in die Hilfe Referenz oder hier. link

servo.write(val) fährt den Servo auf die Position val. In der Regel ist das ein Wert zwischen 0 und bestenfalls 180 Grad.

was map ist kannst Du oben im link selber lesen.

in der von Dir angegeben Kombnation wird also lediglich der Analogwert z.B 0-5V =0-1023 auf eine andere Skala(30-110grad ) umgerechnet.

Ich glaube jetzt aber nicht das servo.write() der richtige Ansatz ist um den DC Motor laufen zu lassen.

Heinz

Viele Servos können nicht den vollen 180° Bereich abdecken, sondern nur weniger.

Gruß Tommy

Hallo zusammen,
was die Funktion map macht ist mir bewusst.
Mir geht es darum, dass manche auf 0-180 mappen, was ich nachvollziehen kann, und es aber auch Leute gibt, die auf 30-110 mappen. Für das selbe Ziel.
Diese 30-110 verstehe ich nicht, wo kommen die her? Wie kommt man auf genau diese Werte?

Es werden keine Servos, sondern der Electronic Speed Controller des Brushless-DC Motors angesteuert, mit beiden genannten Codevarianten.

Rentner:
Ich glaube jetzt aber nicht das servo.write() der richtige Ansatz ist um den DC Motor laufen zu lassen.

Welcher Ansatz würde sich besser anbieten?

Lg

Hallo Kristina,
das kommt auch immer auf den Anwendungsfall an.
Nicht immer benötigt (oder kan man aus z.B. mechanischen Gründen, wie maximaler weg den das Servo kann, oder auch wegen am Servo angeschlossenem Gestänge/oder bewegtem Teil, volle 180° nutzen, dann mapt man eben auf kleinere Werte.
Setzt man statt eines Servos einen ESC (Motorregler) ist es je nach regler auch nicht immer sinvoll, da ein Signal von 0 - 180° drauf zu geben, da dann evt. im oberen und unteren bereich ein grosser totpunkt entstehen kann, in dem Du zwar am Poti drehen kannst, sich aber die Drehzahl des angeschlossenen Motors nicht mehr ändert.

Gut wenn Du dann den Regler nach Anleitung des Regler-Herstellers korrekt auf dein Signal anlernst, basst das wieder. Ist in der Anleitung unter Anlernen des Gashebel (throttle)-Weges zu finden oder anlernen an den Empfänger.
Diese Einstellung ist bei den Meisten Reglern ein eigenes Einstell-Menu, die nicht in den normalen Rregler-Einstellungen, in denen das Regel-verhalten und die Motorparameter eingestellt werden enthalten ist.

Willst Du für deinen BLDC einen Regler aus dem Modellbau-Bereich einsetzen?

LG Stefan

Hallo Kristina

Kristina1999:
Wenn ich über die Servo Bibliothek lese, dann versteh ich das so, dass 0=1ms und 180=2ms sind.
Also 0 für Stillstand und 180 für 2ms, was "Vollgas" entspricht.

Hier liegt deine falsche Annahme. Es ist richtig, dass die Standardwerte für einen Servo von 1ms...2ms gehen, und das ist wohl auch das, was ein BLDC Antrieb erwartet.
Viele Servos können aber auch mit kleineren und größeren Impulslängen umgehen. Deshalb hat die ServoLib auch einen erweiterten Bereich: 0=0,544ms und 180=2,4ms. Will man das nun wieder auf 1ms...2ms begrenzen, kann man also mit einem Wert >0 anfangen und bei <180 aufhören.

Sinnvoller ist es aber aus meiner Sicht, gleich die Zeiten zu wählen, also das Poti auf 1000...2000 zu mappen. Ein 'servo.write(1000)' erzeugt z.B. einen Impuls von 1ms, unabhängig von irgendwelchen Winkel Umsetzungen. Du kannst auch servo.writeMicroseconds(1000) verwenden. Aber eigentlich ist das nicht notwendig. Beim write() Aufruf erkennt die Lib anhand des übergebenen Wertes automatisch ob Winkelwerte, oder Zeitwerte gemeint sind (0...180 = Winkelwerte, 544...2400 = Zeitwerte in µs).

Gerade bei der Ansteuerung eines BLDC-Motors machen die Winkelwerte übrhaupt keinen Sinn. Da würde ich immer direkt mit den Zeitwerten für die Impulslänge arbeiten.

Hi

Auch dürften Werte unter 1500µs eine andere Drehrichtung als Werte oberhalb haben - Knüppel-Mittelstellung=stehender Motor, was aber der Servo-Wert 1500->90° darstellen dürfte.

Nur, falls Du Dich wunderst, daß Dein Motor dich was ganz Anderes macht, als Du gedacht hast - Das könnte eine Begründung dafür sein.

MfG