PWM SIGNAL

Hallo Leute

Bin neuling im Arduino bereich tüftl aber schon ein paar tage damit rum. Meine Frage kann ich mit Arduino ein PWM signal erzeugen das 1 mal bei anschalten von 0HZ bis 500Hz und wieder zurück läuft. Möchte damit einen Tacho ansteuern und so ne Art selbststest bauen. MANUEL kann ich das Tacho schon mal ansteuern dass sich meine Nadeln zu dem ausgegebenen wert bewegen.

Ich müsste zeitgleich 2 verschiedenen signaldurchläufe erzeugen
Wenn möchlich mit 1 board .

1 signal 0Hz-500Hz
2 signal 0Hz-220Hz

Ist dies überhaubt möglich ?

Lg aus Südtirol

Johnny

Brauchst Du ein PWM Signal oder nur eine Rechtecksignal mit einer bestimmten Frequenz?
Welches Signal (Spannung Strom) braucht der Tacho?

Als Anfäger würde ich da nur den kleineren auf den größeren Bereich mappen und mit einem Delay ein wenig verzögern.

Ausgangsbasis analogWrite() - Arduino Reference

Aber eh alles egal, wenn die TO nicht bei der Sache bleiben und nicht zeitnah auf Fragen antworten.

// PWM Ausgabe auf zwei Pins
// Der TO antwortet nicht.
// https://forum.arduino.cc/index.php?topic=638275.0

const int outPin1 = 9;     // Ausgabe Pin LED Uno, Nano, Mini 3, 5, 6, 9, 10, 11
const int outPin2 = 10;    //
const int analogPin = 3;   // potentiometer connected to analog pin 3
uint16_t  val = 0;         // variable to store the read value

void setup() {
  Serial.begin(115200);
  Serial.println(F("Einfache PWM Ausgabe auf zwei Pins"));
  pinMode(outPin1, OUTPUT);
  pinMode(outPin2, OUTPUT);
  selftest();
}

void loop() {
  val = analogRead(analogPin);  // read the input pin
  analogWrite(outPin1, val / 4); // analogRead values go from 0 to 1023, analogWrite values from 0 to 255

}

void selftest()
{
  const uint16_t steps = 500;      // Wie viele Steps macht der größere Bereich aus
  const uint16_t stepsSlow = 220;  // wie viele Steps macht der kleinere Bereich aus
  const uint16_t delayMillis = 4;  // Verzögerung in Millisekunden
  //uint16_t pwm1 = 0;             // brauchen wir nicht, übernehmen wir 1:1
  uint16_t pwm2 = 0;               // ermittelte PWM für Ausgang 2
  uint32_t start = millis();       // Startzeit merken
  for (uint16_t i = 0; i <= steps; i++)
  {
    pwm2 = map(i, 0, steps, 0, stepsSlow);   // den kleineren Bereich auf den größeren Mappen
    //Serial.print(i); Serial.print(F(" "));Serial.println(pwm2); // nur testausgabe, verlangsamt natürlich den Ablauf
    analogWrite(outPin1, i);
    analogWrite(outPin2, pwm2);
    delay(delayMillis);    // Verzögern bevor wir den nächsten Schritt machen mit dirty delay, ist mir hier aber wurscht.
  }
  for (uint16_t i = steps; i == 0; i--)
  {
    pwm2 = map(i, 0, steps, 0, stepsSlow);
    //Serial.print(i); Serial.print(F(" "));Serial.println(pwm2); // nur testausgabe, verlangsamt natürlich den Ablauf
    analogWrite(outPin1, i);
    analogWrite(outPin2, pwm2);
    delay(delayMillis);
  }
  uint32_t end = millis();  // Endzeit ermitteln
  Serial.print(F("Der Vorgang dauerte gesamt ")); Serial.println(end - start); // nur zum Anpassen der Zeiten notenwendig
}

Ist dies überhaubt möglich ?

Entzieht sich meiner Kenntnis!
Da sowohl Board als auch Tastgrad geheim sind.

noiasca:
dann zeigst mal einen sketch wie du es schon manuell machst und definierst noch wie "schnell" von 0 bis 500 gedreht werden soll (und wie schnell runter auf 0)

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

void loop() {
// put your main code here, to run repeatedly:
digitalWrite (speedo, HIGH);
//delay(23);//=20KmH
//delay(17);//=30KmH
//delay(15);//=40Kmh
//delay(10);//=50Kmh
//delay(8);//=80Kmh
//delayMicroseconds(4900);//=90Kmh
//delayMicroseconds(4200);//=100Kmh
//delayMicroseconds(3900);//=110Kmh
//delayMicroseconds(3400);//=120Kmh
//delayMicroseconds(3000);//=130Kmh
//delayMicroseconds(2500);//=140Kmh
//delayMicroseconds(2250);//=150Kmh
//delayMicroseconds(2100);//=160Kmh
//delayMicroseconds(2100);//=170Kmh
//delayMicroseconds(2050);//=180kmh
//delayMicroseconds(1900);//=190Kmh
//delayMicroseconds(1850);//=200Kmh
delayMicroseconds(1800);//=210Kmh

digitalWrite (speedo, LOW);
//delay(40);//=20Kmh
//delay(28);//=30Kmh
//delay(20);//=40Kmh
//delay(18);//=50Kmh
//delay(10);//=80Kmh
//delayMicroseconds(11200);//=90Kmh
//delayMicroseconds(10300);//=100Kmh
//delayMicroseconds(9350);//=110Kmh
//delayMicroseconds(8800);//=120Kmh
//delayMicroseconds(8200);//=130Kmh
//delayMicroseconds(7900);//=140Kmh
//delayMicroseconds(7500);//=150Kmh
//delayMicroseconds(7000);//=160Kmh
//delayMicroseconds(6500);//=170Kmh
//delayMicroseconds(6000);//=180Kmh
//delayMicroseconds(5230);//=190Kmh
//delayMicroseconds(5000);//=200Kmh
delayMicroseconds(4800);//=210Kmh

}

so muss ich jetzt jedes mal den wert freigeben aber möchte dass es automatisch durchläuft und wieder zurück auf null..

am besten mit Arduino NANO

danke für die schnellen Antworten

Programm bitte in Code-Tags, damit delay(8); vermieden wird!

Sorry

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

void loop() {
  // put your main code here, to run repeatedly:
digitalWrite (speedo, HIGH);
//delay(23);//=20KmH
//delay(17);//=30KmH
//delay(15);//=40Kmh
//delay(10);//=50Kmh
//delay(8);//=80Kmh
//delayMicroseconds(4900);//=90Kmh
//delayMicroseconds(4200);//=100Kmh
//delayMicroseconds(3900);//=110Kmh
//delayMicroseconds(3400);//=120Kmh
//delayMicroseconds(3000);//=130Kmh
//delayMicroseconds(2500);//=140Kmh
//delayMicroseconds(2250);//=150Kmh
//delayMicroseconds(2100);//=160Kmh
//delayMicroseconds(2100);//=170Kmh
//delayMicroseconds(2050);//=180kmh
//delayMicroseconds(1900);//=190Kmh
//delayMicroseconds(1850);//=200Kmh
delayMicroseconds(1800);//=210Kmh



digitalWrite (speedo, LOW);
//delay(40);//=20Kmh
//delay(28);//=30Kmh
//delay(20);//=40Kmh
//delay(18);//=50Kmh
//delay(10);//=80Kmh
//delayMicroseconds(11200);//=90Kmh
//delayMicroseconds(10300);//=100Kmh
//delayMicroseconds(9350);//=110Kmh
//delayMicroseconds(8800);//=120Kmh
//delayMicroseconds(8200);//=130Kmh
//delayMicroseconds(7900);//=140Kmh
//delayMicroseconds(7500);//=150Kmh
//delayMicroseconds(7000);//=160Kmh
//delayMicroseconds(6500);//=170Kmh
//delayMicroseconds(6000);//=180Kmh
//delayMicroseconds(5230);//=190Kmh
//delayMicroseconds(5000);//=200Kmh
delayMicroseconds(4800);//=210Kmh


}
//delayMicroseconds(4900);//=90Kmh

//delayMicroseconds(4200);//=100Kmh
//delayMicroseconds(3900);//=110Kmh
//delayMicroseconds(3400);//=120Kmh

A:
Packe die Daten in ein Array und interpoliere zwischen den Stützpunkten.

B:
Entwickle eine Funktion, welche über den gesamten gewünschten Datenbereich plausible Werte errechnet.

C:
Nutze die Hardwaretimer um Rechenzeit frei zu schaufeln

Schau Dir mal die Funktion tone() an.

noiasca:
Als Anfäger würde ich da nur den kleineren auf den größeren Bereich mappen und mit einem Delay ein wenig verzögern.

Ausgangsbasis analogWrite() - Arduino Reference

Aber eh alles egal, wenn die TO nicht bei der Sache bleiben und nicht zeitnah auf Fragen antworten.

// PWM Ausgabe auf zwei Pins

// Der TO antwortet nicht.
// PWM SIGNAL - Deutsch - Arduino Forum

const int outPin1 = 9;     // Ausgabe Pin LED Uno, Nano, Mini 3, 5, 6, 9, 10, 11
const int outPin2 = 10;    //
const int analogPin = 3;   // potentiometer connected to analog pin 3
uint16_t  val = 0;         // variable to store the read value

void setup() {
 Serial.begin(115200);
 Serial.println(F("Einfache PWM Ausgabe auf zwei Pins"));
 pinMode(outPin1, OUTPUT);
 pinMode(outPin2, OUTPUT);
 selftest();
}

void loop() {
 val = analogRead(analogPin);  // read the input pin
 analogWrite(outPin1, val / 4); // analogRead values go from 0 to 1023, analogWrite values from 0 to 255

}

void selftest()
{
 const uint16_t steps = 500;      // Wie viele Steps macht der größere Bereich aus
 const uint16_t stepsSlow = 220;  // wie viele Steps macht der kleinere Bereich aus
 const uint16_t delayMillis = 4;  // Verzögerung in Millisekunden
 //uint16_t pwm1 = 0;             // brauchen wir nicht, übernehmen wir 1:1
 uint16_t pwm2 = 0;               // ermittelte PWM für Ausgang 2
 uint32_t start = millis();       // Startzeit merken
 for (uint16_t i = 0; i <= steps; i++)
 {
   pwm2 = map(i, 0, steps, 0, stepsSlow);   // den kleineren Bereich auf den größeren Mappen
   //Serial.print(i); Serial.print(F(" "));Serial.println(pwm2); // nur testausgabe, verlangsamt natürlich den Ablauf
   analogWrite(outPin1, i);
   analogWrite(outPin2, pwm2);
   delay(delayMillis);    // Verzögern bevor wir den nächsten Schritt machen mit dirty delay, ist mir hier aber wurscht.
 }
 for (uint16_t i = steps; i == 0; i--)
 {
   pwm2 = map(i, 0, steps, 0, stepsSlow);
   //Serial.print(i); Serial.print(F(" "));Serial.println(pwm2); // nur testausgabe, verlangsamt natürlich den Ablauf
   analogWrite(outPin1, i);
   analogWrite(outPin2, pwm2);
   delay(delayMillis);
 }
 uint32_t end = millis();  // Endzeit ermitteln
 Serial.print(F("Der Vorgang dauerte gesamt ")); Serial.println(end - start); // nur zum Anpassen der Zeiten notenwendig
}

Keine Ahnung ob ich zu blöd bin für sowas aber krigs nicht gebacken dass es Läuft .. Nadeln schlagen schon mal aus aber eher wild durcheinander

Hallo,

grundsätzliche Frage die noch niemand gestellt hat.
Reagiert der Tacho wirklich auf Frequenzänderung oder doch lieber auf Pulsweitenänderung?

hey..

ich hab so n kleinen PWM generator von 1Hz bis 150Khz mit dem reagiert Tacho und Drehzahl. Tacho von 0Hz-220Hz da sind es dann die 320Kmh und beim Drehzahlmesser sind es 0hz-500Hz 10k Rpm..

ist ein Rechtecksinal soweit ich jetzt weiss...

uwefed:
Schau Dir mal die Funktion tone() an.

Mit tone funktioniert es aber nur auf 1 pin.. Nicht auf 2 zugleich ?

Oder ?+

Hallo,

bin mir immer noch nicht sicher ob du wirklich PWM meinst oder doch eine Frequenzänderung.

Bei PWM bleibt die Frequenz konstant und man ändert nur die Pulsweite. Wenn man fälschlicherweise nur die Pulsweite betrachtet könnte man denken man ändert irgendwie eine Frequenz, was aber falsch gedacht ist. Wenn man den Anteil vom Highpegel ändert, ändert sich der Anteil vom Lowpegel automatisch mit. Pulsweite ändert sich, Frequenz bleibt konstant. Das wäre PWM.

Also, was änderst du wirklich? Die Pulsweite oder doch die Frequenz?
Laut meines Wissens sind moderne Tachos Frequenz gesteuert.

Mich irritiert der krumme Kurvenverlauf:

Tacho.png

Sonst könnte man eine mathematische Funktion verwenden.

Unabhängig davon und der Frage von Doc_Arduino ein Programmvorschlag:

const byte speedo = 9;
const uint32_t pulszeit[] = {23000, 17000, 15000, 10000, 8000, 4900, 4200, 3900, 3400, 3000, 2500, 2250, 2100, 2100, 2050, 1900, 1850, 1800};
const byte anzahlpulse = sizeof(pulszeit) / sizeof(pulszeit[0]);
uint32_t jetzt, levelvorhin, pulsvorhin, intervall = 100;
byte puls;
bool richtung = true, level;

void setup() {
  pinMode (speedo, OUTPUT);
}

void loop() {
  jetzt = micros();
  if (jetzt - levelvorhin >= pulszeit[puls]) {
    levelvorhin = jetzt;
    level = !level;
    digitalWrite (speedo, level);
    if (jetzt - pulsvorhin >= intervall) {
      pulsvorhin = jetzt;
      if (richtung) {
        if (puls < anzahlpulse - 1) {
          puls++;
        } else {
          richtung = false;
        }
      } else {
        if (puls > 0) {
          puls--;
        } else {
          richtung = true;
        }
      }
    }
  }
}

Wie gut die Zeiten eingehalten werden, mußt Du mal probieren, ebenso was Dein Tacho dazu meint.

Tacho.png

JOHNNY862:
Mit tone funktioniert es aber nur auf 1 pin.. Nicht auf 2 zugleich ?

Oder ?+

ja, Tone funktioniert nur auf einem Pin. Du hast aber nichts geschrieben daß Du es auf 2 Pins brauchst. Auch die Mehthode mit delay() funktioniert nur auf einem Pin.

Grüße Uwe

JOHNNY862:
hey..

ich hab so n kleinen PWM generator von 1Hz bis 150Khz mit dem reagiert Tacho und Drehzahl. Tacho von 0Hz-220Hz da sind es dann die 320Kmh und beim Drehzahlmesser sind es 0hz-500Hz 10k Rpm..

ist ein Rechtecksinal soweit ich jetzt weiss...

Glaube ich Dir nicht. Du hast keinen PWM-Generator.
Grüße Uwe

Wie heist mab dann diese.. SIGNAL GENERATOR ?
CHF 1.46 10%OFF | Signal Generator PWM Pulse Frequenz Duty Zyklus Einstellbare Module LCD Display 1Hz-150Khz 3,3 V-30 V PWM Bord Modul

Hallo,

das ist ein Frequenzgenerator mit der Möglichkeit die PWM dessen zu ändern. Soweit okay.
Also hast du 50% Duty Cycle eingestellt und änderst wirklich nur die Frequenz an dem Teil?
Das hättest du aber ehrlich gesagt schon längst auch ohne Link beantworten können.
Es ist für mich ein Unterschied ob jemand von Frequenz oder PWM spricht.
Weil du immer beide Begriffe verwendest ist das nicht klar.
Ich denke aktuell du änderst wirklich nur die Frequenz, dann lasse den Begriff PWM bitte weg.

Also hast du 50% Duty Cycle eingestellt

Von 50% ist bei "den" Testdaten wenig zu sehen.