PWM zu Step-Dir - Ich komme nicht weiter

Für solche Fälle immer einen Kurzsketch zum testen nehmen.

// Forensketch
// https://forum.arduino.cc/

#include <Streaming.h>     // https://github.com/janelia-arduino/Streaming

const uint8_t pwmPin = 2;
uint8_t pwm;
const uint32_t intervall = 500;
uint32_t lastmillis;

void setup()
{
  Serial.begin(115200);
#if (defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2650)) // https://github.com/arduino/Arduino/issues/10764
  delay(300);
#endif
  Serial << (F("\r\nStart...\r\n")) << endl;
}

void  loop()
{
  if (millis() - lastmillis > intervall)
  {
    lastmillis += intervall;
    pwm++;
    analogWrite(pwmPin, pwm);
  }
}

Achtung: Da kommt es zu einem beabsichtigtem Überlauf von pwm.
Du kannst unter dem pwm++ auch gerne eine Ausgabe auf dem SerMon machen.

Nein. Ein RC Signal ist nicht PWM.

hast du wohl übersehen.

Ich bin da kein Experte, kann das jemand bestimmen worum es sich handelt?

Was es auch ist, es hat eine "Trägerfrequenz" von 50Hz (20ms) und einer Pulsdauer von 1,1ms bis 1,9ms.

Hast Du irgendwo eine Erklärung wie ich die Signale voneinander unterscheiden kann?

Ich finde nix gescheites.

Und bei Wikipedia wird es eher verwirrender.

Hier
https://www.elektronik-kompendium.de/sites/kom/0401111.htm

Und für das RC Signal PPM – RC-Network Wiki
Die Auswertung ist aufwendiger
Read PWM, Decode RC Receiver Input, and Apply Fail-Safe | Arduino Project Hub

Zumindest ist es ein sehr spezielles. Es ist ein PWM-Signal mit 50Hz Basisfrequenz, bei dem der duty-cycle nur zwischen (nominal) 5% und 10% schwankt. Das Besondere ist auch, dass die absolute Pulsweite ( 1ms...2ms ) und nicht der duty-cycle für die Steuerung entscheidend ist - zumindest in einem gewissen Bereich der Basisfrequenz. So gesehen ist der Name 'Pulsweitenmodulation' eigentlich schon richtig :wink: .
Es funktioniert letztendlich aber eben doch anders als ein 'übliches' PWM-Signal für Led's oder Motore, bei denen der duty-cycle entscheidend ist und nicht die absolute Pulsweite.

Das kannst du ändern.

Das ist keine Entschuldigung für nicht gemachte Hausaufgaben.

Tipp:
Es ist immer gut, wenn man weiß was man tut und damit anrichtet.
Ohne Wissen, kein Folgen abschätzen, kein verlässlicher Erfolg.

Das ist die Arduino Referenz!

Du findest es in der C++ Reference.
https://en.cppreference.com/w/cpp/types/integer

Darum heißt es ja auch PPM und nicht PWM.
Ähnlichkeiten mag es geben.
(Aber was ist schon ein Vergleich, wenn er nicht hinkt....)

So wie in dem Testcode von Dir hier, hab ich ein PWM-Signal erwartet. Was sich aber als nicht richtig erwiesen hat.

Man lernt nie aus..

Ich habe verstanden, beides ist ein PWM - Signal.

Alles klar, dankeschön! :ok_hand:

PPM ist aber wieder etwas anderes. Das ist das Signal aus dem Receiver, in dem alle Kanäle in einem Signal ( mit 0,4ms Impulsen ) übertragen werden. Daraus müssen dann erst die üblichen 1..2ms Signale für die einzelnen Servos/Kanäle erzeugt werden. Vielleicht hilft ja das hier.

habe noch'n Fehler beseitigt. Pin 3 mit Oszi prüfen, Pin 13 zeigt DIR Zustand.

#define PWM_Pin 2
#define DIR 4
#define STEP 5

volatile  uint32_t lastPulseTime = 0;
volatile  uint32_t pulse_Lenght;

void setup() {
  //Serial.begin(115200);
  attachInterrupt(digitalPinToInterrupt(PWM_Pin), Pulse, CHANGE);
  for (byte i = 3; i < 6; i++)pinMode(i, OUTPUT);
  pinMode(13, OUTPUT);
}

void Pulse() {
  if (digitalRead(PWM_Pin))lastPulseTime = micros();
  else pulse_Lenght = micros();
}

void loop() {
  const int Mitte = 1500;
  static int channelValue = 0;
  static unsigned long previousMotorTime = 0;
  static unsigned long MotorInterval = 0xFFFFFFFF;

  //Serial.print("channelValue");
  //Serial.println(channelValue);
  //Serial.print("MotorInterval:");
  //Serial.println(MotorInterval);
  noInterrupts();
  channelValue = int(pulse_Lenght - lastPulseTime) - Mitte ;
  interrupts();
  analogWrite(3, (channelValue / 4) + 127);
  digitalWrite(DIR, channelValue >= 0);
  digitalWrite(13, channelValue >= 0);

  if (abs(channelValue) > 5)MotorInterval = 6000000 / (channelValue* channelValue);
  else MotorInterval = 0xFFFFFFFF;
  if (micros() - previousMotorTime >= MotorInterval) {
    digitalWrite(STEP, !digitalRead(STEP));
    previousMotorTime = micros();
  }
  delay(10);
}

or even better

#define PWM_Pin 2
#define DIR 4
#define STEP 5

volatile  uint32_t lastPulseTime = 0;
volatile  uint32_t pulse_Lenght;

void setup() {
  Serial.begin(115200);
  for (byte i = 3; i < 6; i++)pinMode(i, OUTPUT);
  pinMode(13, OUTPUT);
}
void loop() {
  const int Mitte = 1500;
  static int channelValue = 0;
  static unsigned long previousMotorTime = 0;
  static unsigned long MotorInterval = 0xFFFFFFFF;

  channelValue = (int(pulseIn(PWM_Pin, HIGH)) - Mitte) ;
  Serial.print("channelValue ");
  Serial.println(channelValue);

  analogWrite(3, channelValue / 4  + 127);
  digitalWrite(DIR, channelValue >= 0);
  digitalWrite(13, channelValue >= 0);

  if (abs(channelValue) > 5)MotorInterval = 6000000 / (#define PWM_Pin 2
#define DIR 4
#define STEP 5

volatile  uint32_t lastPulseTime = 0;
volatile  uint32_t pulse_Lenght;

void setup() {
  Serial.begin(115200);
  for (byte i = 3; i < 6; i++)pinMode(i, OUTPUT);
  pinMode(13, OUTPUT);
}
void loop() {
  const int Mitte = 1500;
  static int channelValue = 0;
  static unsigned long previousMotorTime = 0;
  static unsigned long MotorInterval = 0xFFFFFFFF;

  channelValue = (int(pulseIn(PWM_Pin, HIGH)) - Mitte) ;
  Serial.print("channelValue ");
  Serial.print(channelValue);

  digitalWrite(DIR, channelValue >= 0);


  if (abs(channelValue) > 5)MotorInterval = 6000000 / (channelValue * #define PWM_Pin 2
#define DIR 4
#define STEP 5

volatile  uint32_t lastPulseTime = 0;
volatile  uint32_t pulse_Lenght;

void setup() {
  Serial.begin(115200);
  for (byte i = 3; i < 6; i++)pinMode(i, OUTPUT);
  pinMode(13, OUTPUT);
}
void loop() {
  const int Mitte = 1500;
  static int channelValue = 0;
  static unsigned long previousMotorTime = 0;
  static unsigned long MotorInterval = 0xFFFFFFFF;

  channelValue = (int(pulseIn(PWM_Pin, HIGH)) - Mitte) ;
  Serial.print("channelValue ");
  Serial.print(channelValue);

  digitalWrite(DIR, channelValue >= 0);


  if (abs(channelValue) > 5)MotorInterval = 6000000 / (channelValue * channelValue);
  else MotorInterval = 0xFFFFFFFF;
  Serial.print("\tMotorInterval:");
  Serial.println(MotorInterval);
  if (micros() - previousMotorTime >= MotorInterval) {
    digitalWrite(STEP, !digitalRead(STEP));
    previousMotorTime = micros();
  }
  delay(10);
});
  else MotorInterval = 0xFFFFFFFF;
  Serial.print("\tMotorInterval:");
  Serial.println(MotorInterval);
  if (micros() - previousMotorTime >= MotorInterval) {
    digitalWrite(STEP, !digitalRead(STEP));
    previousMotorTime = micros();
  }
  delay(10);
}* MotorInterval);
  else MotorInterval = 0xFFFFFFFF;
  Serial.print("MotorInterval:");
  Serial.println(MotorInterval);
  if (micros() - previousMotorTime >= MotorInterval) {
    digitalWrite(STEP, !digitalRead(STEP));
    previousMotorTime = micros();
  }
  delay(10);
}

???

Und warum sehe ich da soviele magische Zahlen?

Da kommt auf Pin A3 ein PWM-Signal mit 2ms Periodendauer raus. Das Signal reagiert recht flott auf Eingaben allerdings ist es falsch "formatiert", da ich eine variable Periodenfrequenz (bis 40kHz) benötige.

meinste Pin D3? da soll nur PWM zum Anschauen, ob Input richtig ist.
40kHz sollen am STEP Pin, Pin D5 erzeugt werden. ist da was?

Auf A3 kann ich das Eingangssignal sehen, auf D3 sehe ich kein Signal, auf D5 kommt das im Anhang raus.

Anfang des Videos:
Mittelstellung, dann maximaler Linksausschlag (RC-Funke); bis Signal vollständiger Bildschirm, dann nochmal Mittelstellung; dann Maximal Rechtsausschlag . - Hoffe das ist verständlich :see_no_evil:

ich versteh nicht was hat A3 damit zu tun und auch nicht wieso Step Pin(D5) zeigt das was eigentlich am "PWM_Pin"(D2) sein soll. Sketch von welchem Post hast du gerade drin?
ist das das alte Video von Post#34 ?

Am D5 „STEP“ Pin kommt das Signal im Anhang von Post58 raus.

A3 spiegelt in etwa DI2 und D3 macht nichts.