RC- Controller für Stepper Endstufe

Continuing the discussion from RC Controller für Stepper Motor - Config Frage:

Hallo Uwe, kannst Du ein Beispiel für die 10Zeilen code geben?

Ich habe ein ähnlich gelagertes Problem und komm auf keine brauchbare Lösung.

Die Aufgabe ist es, mittels Arduino Nano ein RC-PWM-Signal in ein 0-40kHz Step-Dir-Signal zu verwandeln um damit eine Motorendstufe per Fernbedienung zu steuern. Im Idealfall sind da auch zwei Eingänge zum stoppen der Bewegung in die eine oder andere Richtung bereits vorgesehen, soweit hab ich es aber noch nie geschafft.

Es gab dazu auch schonmal einen Thread, damit bin ich aber leider nicht weiter gekommen.
(Link zum alten Thread HIER. )

40 k Hz?

bei einem 200 Step Motor sind das 12000RPM.

Grüße Uwe

Ja, die Endstufe will mindestens 800Steps / Umdrehung. (JMC-Servo)

40000 Hz / 800 = 50 Impulse / Sekunde
50*60 = 3000 U/min

Um überhaupt eine so hohe Step-Pulse-Frequenz hinzubekommen brauchst du mindestens die FastStepper-library

Oder gleich einen Microcontroller Teensy 4.0 / 4.1
Der kann so hohe Schrittfrequenzen.

Ein Arduino Uno 40 kHz plus RC-signale erkennen das wird eng.

vgs

Danke für den Vorschlag, also deine Empfehlung wär, mal n Teensy zu testen?

Ich verstehe, der Nano ist da zu schwach auf der Brust für mein Vorhaben?

Sicher sagen ob der Arduino Nano das hinbekommt oder zu langsam ist kann ich nicht, weil ich es nicht getestet habe.

Im Titel steht RC-controller für Stepper-Endstufe.
Was genau bedeutet in deinem Fall RC-Controller?
Willst du das Servosignal von einem Standard-RC-Empfänger

  • wie man ihn in Modellflugzeugen verwendet -
    auswerten und danach die Drehzahl ändern?
    oder
    bedeutet RC-Controller etwas anderes?

vgs

Hab mir jetzt mal die technischen Daten vom Teensy 4.0 angesehen und n Bechmark Vergleich zwischen Arduino und Teensy angesehen :smile: da ist ja deutlich mehr Power da.

Was ein Problem zu sein scheint, ist die PWM - Spannung, die kommt mit 5V aus dem Cube (Klick).

Danke, ich teste das. :+1:

Cube-Click
ohlala eine eierlegende Wollmilchsau

Fliegt der Servomotor dann mit einer Hochleistungsdrohne herum?

Das ist das Produkt.
Aber welches Signal dieses Empfängers wird jetzt wirklich mit dem MIcrocontroller verbunden?
Standard-Servo? oder UART? oder I2C? oder CAN?

:slightly_smiling_face:. Das Teil kann so viel mehr als ich nutze.

Es sieht aktuell noch so aus:

Später sollen zwei davon die Räder eines kleinen, robust gebauten Rover antreiben.

Standard-Servo

Läuft der Rover mit Akkus?

Ist der Servomotor ein brushless DC-Motor mit encoder
oder
ein Schrittmotor mit Encoder?
Schrittmotoren haben einen vergleichsweise schlechten Wirkungsgrad.

Der Servomotor wenn er im stehen die genaue Position halten soll braucht dann auch Strom.

Jetzt kommt es natürlich darauf an was du mit dem Rover machen willst
mal ne halbe Stunde Feuer löschen und dann den Akku wechseln geht bestimmt.
Ne Doppelschicht ständig im Lager herumfahren wird einen sehr großen Akku benötigen.

Die FastStepper-library doku sagt

AVR ATMega 168/168P/328/328P

  • allows up to 50000 generated steps per second for single stepper operation, 37000 for dual stepper

Also bei zwei Motoren nur 37 kHz.

ein ESP32 kann bis zu 200 kHz. Die sind auch preiswert.

Jetzt kommt es darauf an ob die RC-Signal-Auswertung einen Timer verwendet und ob das der gleiche microcontroller-internen Timer ist wie den den FastStepper verwendet.

Das konnte ich auf die schnelle aus der Doku nicht finden.

vgs

Ja

Soweit ich das weiß, ja.

Das muss er nicht :sweat_smile:

Wenn ich das richtig interpretiere, läuft ein Nano da wirklich am oberen Ende.

Hier mal der letzte Stand vom code:


#define PWM_Pin 2
//#define DIR 4                                                        Auskommentiert  - Matt_Hias
#define STEP 5

volatile  uint32_t lastPulseTime = 0;
volatile  uint32_t pulse_Lenght = 0;
volatile  uint32_t PulseTime = 0;
static long temp = 0;                                                   // Verschoben ausserhalb Loop - Matt_Hias

void setup() {
  //  Serial.begin(250000);
  attachInterrupt(digitalPinToInterrupt(PWM_Pin), Pulse, CHANGE);
  //pinMode(DIR , OUTPUT);                                                  Auskommentiert  - Matt_Hias
  pinMode(STEP , OUTPUT);
}

void Pulse() {
  if (digitalRead(PWM_Pin))lastPulseTime = micros();
  else {
    PulseTime = micros();
    if (lastPulseTime < PulseTime)pulse_Lenght = PulseTime - lastPulseTime;
    if (!(pulse_Lenght > 1000 && pulse_Lenght < 2000))pulse_Lenght = 0;
  }
}

void loop() {
  const int Mitte = 1500;
  static int channelValue = 0;
  static unsigned long previousMotorTime = 0;
  static unsigned long MotorInterval = 0xFFFFFFFF;
  //static long temp = 0;                                                   Verschoben ausserhalb Loop - Matt_Hias
  //Serial.print("channelValue");
  //Serial.println(channelValue);
  //Serial.print("MotorInterval ");
  noInterrupts();
  if (pulse_Lenght)temp = pulse_Lenght - Mitte;
  interrupts();
  //  Serial.print(" ");
  //  Serial.print(pulse_Lenght);
  //   Serial.print(" ");
  // Serial.print(temp);

  //digitalWrite(DIR, temp >= 0);                                               Auskommentiert  - Matt_Hias
  channelValue = constrain(abs(int(temp)), 0, 400);
  //  Serial.print(" ");
  //  Serial.print(channelValue);

  if (channelValue > 5)MotorInterval = (405 - channelValue) * 5;
  else MotorInterval = 0x0FFFFFFF;
  //  Serial.print(" ");
  //  Serial.println(MotorInterval);
  if (micros() - previousMotorTime >= MotorInterval) {
    digitalWrite(STEP, !digitalRead(STEP));
    previousMotorTime += MotorInterval;
  }
  //  delay(10);
}

Der Code wurde im laufe des oben verlinkten Threads geformt, vielen Dank nochmal an alle beteiligte @my_xy_projekt, @MicroBahner, @Tommy56, @fony, @combie, @michael_x und ganz besonders @kolaha, der den code immer wieder mit mir getestet und dabei gefühlt sehr viel Zeit verbracht hat. :pray:

hab mich grad gewundert, was ich damit zu tun habe....
Aber ja, wenn man sich die Historie des ganzen ansieht...

Na bitte....

Was hat das dann denn mit dem Titel "RC-Controller für Stepper Endstufe" zu tun?

Grüße Uwe

Laut technischen Daten der Motoren nehmen die Endstufen 5-24V als Signalspannung.

Wie kommt man von den 3.3V des Teensy auf die min. 5V vom Motor? Gibt es da fertige Bausteine bzw. hat da jemand einen Tipp für mich, welcher Chip das erfüllen könnt?

Noch lieber wäre mir allerdings, wenn es sowas wie den esp32 mit 5V geben würde. Falls da jemand einen Tipp hat?

Pegelwandler

3.3V auf 5V wandeln mit einem Pegelwandler / Voltage-levelshifter.
So was hier

vgs

Ob das Funktioniert, ist ja ein MOSFET mit zwei PullUP
image

Also du bist am überlegen ob evtl. der Widerstand des Pullups zu groß ist und der Eingang dann nicht richtig schaltet?

Jaaaa könnte was dran sein. Dazu müsste man mal im Datenblatt des Servomotors nachschauen.