ESC + Motor regeln

hallo

versuche mich gerade zum ersten mal mit einem ESC + Motor (DX2207).

Habe diese Script hier genutzt für einen ersten Test

int ESCPin = 9;
int val = 0;
void setup() {
  // put your setup code here, to run once:
pinMode(ESCPin, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

for(val = 0; val <= 255; val += 5)
 {
   analogWrite(ESCPin, val);
   delay(100);
 }
}

Der Motor läuft damit hoch, denke 255 = Fullspeed (?)... soweit ok.

Unter 120 (zb: val <= 100) passiert nichts, >120 zuckt er, aber ca 150 läuft er...

Wie regeln ich den kompletten Drehzahlbereich? Also, er soll auch langsam drehen....

Hier mal Links, falls es benötigt ist.

Motor:
https://www.aliexpress.com/i/33050138793.html

ESC:

Datenblätter habe ich leider nicht gefunden.

ESC werden mittels eines Servosignals geregelt und nicht mittels eines PWM Signals. Ein Servosignal entspricht nur einem Teilbereich eines möglichen Tastverhältnisses eines PWM-Signals.
Siehe servo.h Bibliothek.

Grüße Uwe

danke.... ich muss hier diverse dingen durchprobieren

Hier ein weiteres Script was läuft, aber erst ab speed 25. darunter passiert nichts....

// this uses the Arduino servo library included with version 0012

// caution, this code sweeps the motor up to maximum speed !
// make sure the motor is mounted securily before running.

#include <Servo.h>

Servo myservo;

void arm(){
 // arm the speed controller, modify as necessary for your ESC 
 setSpeed(0);
 delay(1000); //delay 1 second,  some speed controllers may need longer
}

void setSpeed(int speed){
 // speed is from 0 to 100 where 0 is off and 100 is maximum speed
 //the following maps speed values of 0-100 to angles from 0-180,
 // some speed controllers may need different values, see the ESC instructions
 int angle = map(speed, 0, 100, 0, 180);
 myservo.write(angle);   
}

void setup()
{
 myservo.attach(9);
 arm(); 
}


void loop()
{
 int speed;

 // sweep up from 0 to to maximum speed in 20 seconds
 for(speed = 0; speed <= 25; speed += 5) {
   setSpeed(speed);
   delay(500);
 }
delay (2000);

 // sweep back down to 0 speed.
 for(speed = 25; speed > 0; speed -= 5) {
   setSpeed(speed);
   delay(500);
 }
 }

bei

 for(speed = 0; speed <= 10; speed += 5) {

passiert nichts.

oder

 for(speed = 0; speed <= 25; speed += 5) {
   setSpeed(speed);
   delay(500);
 }
delay (2000);
setspeed(10);
delay (2000);

nicht sauber, die speed (10) scheint er zu überspringen....

Habe gelesen, das

int angle = map(speed, 0, 100, 0, 180);

zum ESC passen muss. Wie bekomme ich die richtigen Werte raus,
sofern diese das nicht sind?

Hallo,

natürlich braucht der motor erst mal eine Spannung damit er anfängt sich zu drehen. wenn Du willst kannst Du mit map eine neue Skalierung machen.

wie das geht kannst Du hier lesen
.arduino.cc/reference/de/language/functions/math/map/

Heinz

Ein ESC Motor wird mit Impulsen von 1ms .. 2ms Länge gesteuert. Du solltest bei der Servolib nicht mit Winkelwerten steuern, sondern direkt die Impulslängen angeben. Also statt 0-180 Werte von 1000-2000 angeben.
Oder du gibst beim attach die Grenzwerte für die Winkel 0 und 180 mit an:

myservo.attach(9,1000,2000)

Mapt er dann die 0-180 auf die 1000-2000uS? Oder constraint er?

Wenn Du im attach die Grenzwerte angibst, wird begrenzt. Kleinere bzw. größere Werte können dann nicht vorkommen.
Gibst Du im attach keine Grenzwerte an, und steuerst statt mit Winkeln direkt in µs, kann Du auch größere/kleinere Werte vorgeben. Die Grenzen liegen dann bei min. 544µs und max. 2400µs. Das sind defaultmäßig dann auch die Werte für Winkel 0 bzw 180.

Danke

Ihr meint das so?

#include <Servo.h>

Servo myservo;

int pos = 0; 

void setup()
  { myservo.attach(9,1000,2000); }

void loop()
  {

    
  for(pos = 0; pos < 13; pos++)
    {
    myservo.write(pos);
    delay(15);
    }
delay(2000);

  for(pos = 13; pos > 0; pos--)
    {
    myservo.write(pos);
    delay(15);
    }
delay(2000);
  }

(pos < 13) ist der kleinstmögliche Wert, bei (pos < 12) dreht der Motor nicht an.
--> for(pos = 0; pos < 13; pos++)

Wäre (pos = 180) Fullspeed?

Gruß

noxx2:
Wäre (pos = 180) Fullspeed?

Ja
Wobei die Winkelgrade in dem Zusammenhang eigentlich nicht viel Sinn machen. Mit einer 'Position' hat das bei der ESC-Steuerung ja nichts zu tun. Ich würde deshalb direkt die Pulslänge vorgeben. Damit hast Du auch eine bessere Auflösung.

Danke, hättest du ein Beispiel für mich?

Na ja, statt der Werte 0...180 im write Aufurf verwendest Du eben 1000...2000. Z.B.

myServo.write(1500);

für 'halbes Tempo'

oder in einer for-Schleife

 for(int speed = 1000; speed<1500; speed+=5 )
    {
    myservo.write(speed);
    delay(15);
    }

Aufgrund der Größe des Wertes im write-Aufruf erkennt die lib selbständig, dass Du nicht Winkel, sondern Mikrosekunden meinst. Du kannst stattdessen auch myservo.writeMicroseconds(); nehmen. Das macht aber keinen Unterschied.
Der writeMicroseconds-Aufruf ist ein ein paar 100 ns schneller, weil er nicht prüfen muss, ob du Winkel oder µs meinst :wink: .

Supi, danke.

Ab

myServo.write(1060);

spring er erst an, da hat er aber schon ordentlich Drehzahl :slight_smile:

Ich probiere mal weiter rum....

Ist halt eine Frage, wie gut die Drehzahlregelung funktioniert. Kleine Drehzahlen scheint sie eher nicht zu können ...

Für wäre dann die Frage, liegt es am ESC oder am Motor?

Gruß

Hi

Sehr wahrscheinlich am ESC - der Motor folgt einfach nur dem anliegendem Magnetfeld - Das kann Der auch, wenn's schnarch lahm passiert.

MfG

In den technischen Daten steht ja nichts zur Minimaldrehzahl. Aber da das ganze ja für Quadrocopter und Hubschrauber ausgelegt ist, und die angegebenen Höchstdrehzahlen schon ganz ordentlich sind, dürften kleine Drehzahlen wohl eher nicht das Entwicklungsziel dieses ESC gewesen sein.

Wie verhält sich der ESC an einer normalen RC-Anlage bzw. Einem Servotester?