PWM zu Step-Dir - Ich komme nicht weiter

Das weiss ich. :wink:
Der TO möchte aber eine Eingrenzung auf den Bereich. Damit funktioniert das aber nicht.

Hat er das nicht vorher schon gemacht ( wo er & und && verwechselt hat) ?
Ansonsten wäre dann evtl. constrain() das Mittel der Wahl - funktioniert aber etwas anders, da Werte außerhalb des Bereiches nicht ignoriert, sondern auf die Bereichsgrenzen gezogen werden. Ob das dann passt kann nur er entscheiden.

Klingt schon viel sympathischer, :slight_smile: - Danke für den Buchtipp!

Hab ich befürchtet, leider beherrsche ich STRG+C / STRG-P auch nicht richtig. :baby_chick:

Also verstehe ich das richtig, es hätte so wie folgt aussehen sollen?

    else if (channelValue < 1450) {
    [...]
    MotorInterval = map(channelValue, 1150, 1445, 100, 1000);

Gerne, keine Eile, ich schlag mich schon länger mit der Thematik rum und lerne gerade in großen Schritten. :grinning:

1449
Sonst würdest Du ab 1446 einen nicht definierten Wert auf MotorInterval bekommen.
Ich mach das aber eh nicht mit if....

Wieso nicht definiert? Vielleicht nicht das was er will, weil etwas größer als 1000, aber sehr wohl definiert.

Das Ende ist mit 1045 definiert.
Das map darüber hinaus auch funktioniert ist unbestritten. Ob es in einer späteren Version noch genau das gleiche macht, oder ob constrain implementiert wird, kannst Du nicht voraus sagen.

Nein, definitiv nicht. Die Arduino-Referenz sagt eindeutig, dass map auch darüber hinaus funktioniert. Mit deiner Annahme kannst Du die gesamte Referenz in die Tonne treten und man könnte nichts mehr als sicher annehmen. Dann kannst Du gleich das Programmieren aufhören.

Den las ich so stehen.

Wen ich das richtig verstehe würde bei

MotorInterval = map(channelValue, 1150, 1445, 100, 1000);

und

MotorIntervall = 1449  

ein Rückgabewert um 1012* herauskommen? // *wurde von 89 auf 1012 korrigiert

Verstehe ich da den Punkt von @MicroBahner richtig?

Das würde aber nicht zustande kommen, da ich in der if-Abfrage nur Werte durchlasse, die unter 1450 liegen.

Ist das einigermaßen korrekt?

Schau doch einfach mal in den Code WMath.cpp

long map(long x, long in_min, long in_max, long out_min, long out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

Da gibt es weder da drin, noch beim Prototyp in Arduino.h einen Hinweis auf eine Begrenzung.
Wieso sollte da jemand plötzlich auf die Idee kommen, ein constrain einbauen zu wollen?

Gruß Tommy

Ja

Doch.
Da 1449 < als 1450 und die Bedingung auf <1450 abfragt.


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

volatile int channelValue = 0;

void setup() {
  //Serial.begin(115200);
  attachInterrupt(digitalPinToInterrupt(PWM_Pin), Pulse, CHANGE);
}
void Pulse() {
  const uint16_t Tausend = 1000;
  static uint32_t lastPulseTime = 0;
  static uint32_t pulse_Lenght;

  if (digitalRead(PWM_Pin))lastPulseTime = micros();
  else pulse_Lenght = micros() - lastPulseTime - Tausend;

  if (pulse_Lenght < Tausend)channelValue = (int)pulse_Lenght - 500;
}
void loop() {
  static unsigned long previousMotorTime = 0;
  static unsigned long MotorInterval = 0xFFFFFFFF;

  //Serial.print("channelValue");
  //Serial.println(channelValue);
  //Serial.print("MotorInterval:");
  //Serial.println(MotorInterval);
  noInterrupts();
  digitalWrite(DIR, channelValue >= 0);

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

Danke für den Code, hier läuft die PWM - Abfrage wohl noch flüssiger... Leider kommt hier nichts auf dem Step - Kanal raus. Hab extra mit dem Oszy nochmal nachgesehen.

So sieht das Eingangssignal aus:
2023-08-06 13-38-29.zip (4.2 MB)

Man sieht den Ausschlag zwischen 1100 und 1900, mittelstellung ist bei 1500.

und wo mit die mp4 öffnen?
Ist doch Mediadatei Screenshot ist besser :wink:

Macht der VLC-Player. (Ansicht - Erweiterte Steuerung)

Ok, Danke habe VLC habe nicht, brauchte noch nicht :wink:

OT: Best Mediaplayer ever.
No tracking, No monetarisierung, over and over media

Ja, genau.

Ich hab n Video gemacht, weil ich zeigen wollte wie sich das Signal von "0-100%" verhält. Ich dachte nämlich, dass ein PWM - Signal bei 100% duty-cycle immer 1 ist und bei 0% immer 0 ist.

Das ist aber wohl nicht so? :person_shrugging:

Ja ist so je nach wert ändert sich das Signal, sollte "Voller" sein