mit rechtecksignal schalten

hallo,

habe folgendes Problem.

ich möchte bei 100 hz (Pin1) das Pin 3 High wird und Pin 2 Low

und bei 50 hz Pin 2 High wird und Pin 3 Low

ich krieg das einfach nicht gebacken.

Kann mir da bitte jemand helfen

LG
Mark

Hallo,
mit einem Interrupt-Pin kannst Du auf- steigende und fallende Flanken abfragen.
Gruß und Spaß
Andreas

Das sieht eher so als als ob die Frequenz messen will und je nach Frequenz die Pins schalten

Dafür gibt es das:
https://www.pjrc.com/teensy/td_libs_FreqMeasure.html

Bei 10 bzw. 20 ms kann man einfach die Zeit zwischen 2 Pegelwechseln messen.

erstmal Danke

das blööde ist nur ich habe absolut keine Ahnung von der Programmiersprache.

Mit ner SPS in FUP habe ich keine Probleme das zu machen, die ist aber zu groß.

Könnte mir bitte einer einen Sketch schreiben.

LG
Mark

const byte pinIn = 4;
const byte pinLed1 = 5;
const byte pinLed2 = 6;
byte freq = 150;

void setup() {
  Serial.begin(250000);
  pinMode(pinLed1, OUTPUT);
  pinMode(pinLed2, OUTPUT);
  tone(pinIn, freq);
}

void loop() {
  static unsigned long lastPrint;
  unsigned long halfCycle = pulseIn(pinIn, HIGH, 40000);
  if (millis() - lastPrint >= 1000) {
    lastPrint = millis();
    Serial.print(F("Freq "));
    Serial.print(freq);
    Serial.print(F(", pulseIn "));
    Serial.println(halfCycle);
    freq += 50;
    if (freq > 150) {
      freq = 50;
    }
    tone(pinIn, freq);
  }
  if (halfCycle > 9900 && halfCycle < 9930) {
    digitalWrite(pinLed1, LOW);
    digitalWrite(pinLed2, HIGH);
  } else if (halfCycle > 4940 && halfCycle < 4970) {
    digitalWrite(pinLed1, HIGH);
    digitalWrite(pinLed2, LOW);
  } else {
    digitalWrite(pinLed1, LOW);
    digitalWrite(pinLed2, LOW);
  }
}

Hallo,
"Mit ner SPS in FUP habe ich keine Probleme das zu machen"

Dann schaffst Du das auch mit einem Arduino. Du kannst doch in einen Funktionsbaustein schauen.
So "siehst" Du was er macht. Dann rüber damit in den Arduino.
Gruß und Spaß
Andreas
P.S. zu langsam...
Jetzt brauchst Du nur noch C&P und das Ding läuft

Vielen vielen lieben Dank

ihr seit absolut super.

ich mach da schon seit Wochen rum.

LG
Mark

Du solltest dennoch die Möglichkeit ergreifen um mit Arduino ein wenig C zu lernen.
Grüße Uwe

SkobyMobil:
Hallo,
"Mit ner SPS in FUP habe ich keine Probleme das zu machen"

Dann schaffst Du das auch mit einem Arduino. Du kannst doch in einen Funktionsbaustein schauen.
So "siehst" Du was er macht. Dann rüber damit in den Arduino.
Gruß und Spaß
Andreas
P.S. zu langsam...
Jetzt brauchst Du nur noch C&P und das Ding läuft

Ne, kann man nicht wirklich.

Ich kenne beide Sprachen, daher glaub mir: wenn du SPS Step7 kannst, fängst du bei C von vorne an. Und umgedreht. Die Sprachen haben fast keine Gemeinsamkeit. Ausser den Grundbegriffen wie And, Or, Xor.

Man kann also hervoragend Maschinen programmieren und versteht nichts von C.

chefin:
Ne, kann man nicht wirklich.

Ich kenne beide Sprachen, daher glaub mir: wenn du SPS Step7 kannst, fängst du bei C von vorne an. Und umgedreht. Die Sprachen haben fast keine Gemeinsamkeit. Ausser den Grundbegriffen wie And, Or, Xor.

Man kann also hervoragend Maschinen programmieren und versteht nichts von C.

Da haste vollkommen recht leider, ich würds ja gern verstehen.

Aber ich versteh ja nicht mal was in diesem Programm passiert

z.B.

void loop() {
static unsigned long lastPrint; ???
unsigned long halfCycle = pulseIn(pinIn, HIGH, 40000); warum half Cycle ?
if (millis() - lastPrint >= 1000) {
lastPrint = millis();
Serial.print(F("Freq “));
Serial.print(freq);
Serial.print(F(”, pulseIn "));
Serial.println(halfCycle);
freq += 50; +50 ?
if (freq > 150) { > 150 ?
freq = 50;
}
tone(pinIn, freq);
}
if (halfCycle > 9900 && halfCycle < 9930) { und wo kommen diese Werte her 9900 9930 ?

Bei einem 50% Dutycycle Signal ergibt das Messen der einen Hälfte (HIGH) die Dauer der Hälfte des Zyklus.

Das Ändern der Fequenz von 50 auf 100 auf 150 testet alle drei Betriebsarten nacheinander.

Die Zahlen wurden empirisch ermittelt, durch eben dieses Programm.
D.h. ich habe es erst mit groben Schätzungen geschrieben und dann an die Messwerte angepasst.

Wie lange braucht denn bei dir der halbe Zyklus eines 50 bzw 100 Hz Signals?

Whandall:
Wie lange braucht denn bei dir der halbe Zyklus eines 50 bzw 100 Hz Signals?

25 50 wird aber wahrscheinlich nicht stimmen.

ich hätte auch nicht gefragt wenn ichs wüßte.

Kannste mirs Bitte erklären

Ganz genau wären es 10000 µs für 50 Hz und 5000 µs 100 Hz.

Die tone() Funktion erzeugt wohl nicht ganz genau die gewünschte Frequenz,
oder ist nicht 50 / 50 was HIGH und LOW angeht.

pulseIn() ist dokumentiert,
ansonsten wird nur einmal pro Sekunde eine Ausgabe gemacht und die Frequenz geändert.

ok ich glaub ich habs verstanden

Frequenz von Hertz nach Mikrosekunde(Periode).

Und dann nur High ist die Hälfte.

9900 && halfCycle < 9930 und das ist dann der Bereich wo sie die LED schaltet

Heißt das jetzt wenn ich bei 80 Hz schalten will.

Reicht es dann aus wenn ich

diesen Wert > 9900 && halfCycle < 9930

durch diesen ersetze >6150 && halfCycle < 6180

Ich habe es nicht nachgerechnet, aber vom Prinzig ist das richtig.

Du kannst es ja mit dem Programm einfach testen...

Eine gewisse Varianz in den Messwerten +/- 4 µs muss man einkalkulieren,
wenn man es genauer haben will muss man mehrere Messungen machen und mitteln.

Bisher hast du nicht verraten worum es eigentlich geht.

Whandall:
Bisher hast du nicht verraten worum es eigentlich geht.

Stimmt hab ich vergessen.

Es soll ein Spoiler (Auto) bei einer bestimmten Geschwindigkeit ca. 10km/h ausfahren

und bei ca. 5 km/h einfahren.

Modellauto deswegen SPS zu groß

Und die Impulse werden von was geliefert?

Was für ein Tastverhältnis liegt vor?

Hast du eine Oszi/Logicanalyzer Darstellung des zu verarbeitenden Signals?

Das von mir gezeigte Prinzip funktioniert so nur bei 50% Tastverhältnis,
bei anderen Signalformen müsste man anders vorgehen.

das Signal kommt von einem Reedkontakt.

Hab ausserdem noch die beiden Endschalter vergessen mit einzuplanen.

Schalter Spoiler oben und Schalter Spoiler unten.

Und einen manuellen zum einfach so hoch fahren zum probieren ob die Mechanik funktioniert

Zum Testen der Interrupts habe ich die Frequenz mal auf Pin 2 gelegt,
ansonsten ist das Programm fast so wie das andere

const byte pinIn = 2;
const byte pinLed1 = 5;
const byte pinLed2 = 6;
byte freq = 150;

volatile unsigned long duration;

void setup() {
  Serial.begin(250000);
  pinMode(pinLed1, OUTPUT);
  pinMode(pinLed2, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(pinIn), getTiming, RISING);
  tone(pinIn, freq);
}

void getTiming() {
  static unsigned long lastEdge;
  unsigned long currentEdge = micros();
  duration = currentEdge - lastEdge;
  lastEdge = currentEdge;
}

void loop() {
  static unsigned long lastPrint;
  noInterrupts();
  unsigned long fullCycle = duration;
  interrupts();
  if (millis() - lastPrint >= 1000) {
    lastPrint = millis();
    Serial.print(F("Freq "));
    Serial.print(freq);
    Serial.print(F(", cycle "));
    Serial.println(fullCycle);
    freq += 50;
    if (freq > 150) {
      freq = 50;
    }
    tone(pinIn, freq);
  }
  if (fullCycle > 19900 && fullCycle < 20100) {
    digitalWrite(pinLed1, LOW);
    digitalWrite(pinLed2, HIGH);
  } else if (fullCycle > 9900 && fullCycle < 10100) {
    digitalWrite(pinLed1, HIGH);
    digitalWrite(pinLed2, LOW);
  } else {
    digitalWrite(pinLed1, LOW);
    digitalWrite(pinLed2, LOW);
  }
}

Das sollte mit dem Reedkontakt besser funktionieren, aber ein Hall würde nicht so prellen…
Teste mal ob das sinnvolle Ergebnisse liefert, oder ob noch debounced werden muss.