PWM-Signal erzeugen

Hallo zusammen,

ich möchte aus einem 0-3,3V Spannungssignal ein PWM-Signal 0-100% erzeugen.

Zur Verfügung habe ich einen WEMOS D1 Mini.

Da ich absoluter Beginner bin, würde ich mich sehr freuen, wenn mir jemand den Code dazu geben könnte.

Vielen lieben Dank vorab,

Viele Grüße

Hallo ow1000,
ich bin auch neu hier....

Ich lese das Signal meiner RC Fernsteuerung aus und wandle es mit der Funktion "map" in Werte von 0 bis 255 um.

speed = map(pwmin, 1550, 1900, 0, 255);

speed ist die Variable die ich mit analogwrite an den PWM Eingang meiner H Brücke L298N gebe.
pwmin ist der Wert den ich vom Empfänger der Fernsteuerung auslese.

1550 ist der untere Wert der umgewandelt werden soll
1900 ist der obere Wert der umgewandelt werden soll
Daraus folgt 1550 = 0 ansteigend bis 1900 = 255

Eine konkrete Lösung für dein Problem habe ich nicht vorliegen.

Ich vermute, dass du das analoge Signal mit A0 einlesen musst:

ESP8266 ADC Resolution

The ADC pin has a 10-bit resolution, which means you’ll get values between 0 and 1023.

und die Werte dann wie oben beschrieben mit der map Funktion umwandeln musst.

VG

Menion

Am PIN A0 kannst Du Deine 3,3V anlegen.
Der ADC hat eine Auflösung von 10bit.
Die Genauigkeit ist nicht berauschend, aber wohl ausreichend.
Du liest mit analogRead(A0) den dort anliegenden Wert aus.
Bei 0V ist der Rückgabewert 0 und bei 3,3V bekommst Du 1024.
Das kannst jetzt mit map(analogRead(A0), 0, 1024, 0, 255); auf den PWM-Pin schreiben.

Besten Dank für die Antworten. Ich habe jetzt folgenden Code:

int sensorPin = A0; // select the input pin for the variable voltage from UVR16X2
int PWMPin = 5; // select the pin for the PWM output signal
int UVR16X2Value = 0; // variable to store the value coming from the UVR16X2

void setup() {
// declare the PWMPin as an OUTPUT:
pinMode(PWMPin, OUTPUT);
}

void loop() {
// read the value from the UVR16X2:
UVR16X2Value = analogRead(sensorPin);
map(UVR16X2Value,0,1023,0,100);
digitalWrite(PWMPin,map);

}

Beim Kompilieren bekomme ich noch eine Fehlermeldung. Ich vermute an der Stelle, an der das berechnete PWM-Signal dem Ausgangspin (PWMPin) zugewiesen wird.

Mit map wird ja die Umwandlong des Analogsignals nach PWM gemacht. Aber wie kann ich auf das Ergebnis zugreifen?

Nochmals Besten Dank!

Ich sehe keine? Warum postest Du sie nicht?

/* Map an analog value to 8 bits (0 to 255) */
void setup() {}

void loop() {
  int val = analogRead(0);
  val = map(val, 0, 1023, 0, 255);
  analogWrite(9, val);
}

Vergleich das mit Deinen Code und du findest evtl den Fehler.

Das soll wohl heißen:

int mapped = map(...);
analogWrite(PWMPin, mapped);
const byte  sensorPin = A0; // select the input pin for the variable voltage from UVR16X2
const byte  PWMPin = 5; // select the pin for the PWM output signal

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

void loop()
{
// [edit] #8
  analogWrite(PWMPin, map(analogRead(sensorPin), 0, 1023, 0, 100));
}

Es wurde schon desöfteren moniert, daß für PWM nur analogWrite() zuständig ist. digitalWrite() schaltet PWM ab. Wie lange wird es wohl noch dauern, bis das durchgesickert ist?

Das schlimme ist, das es bereits vergesickert ist. :wink:
Thx.

Es gibt verschiedenste Verweigerungshaltungen!

Hier eine kleine Auswahl:

  • Manche ärgern sich so sehr über Fehlermeldungen, dass sie keine Ruhe haben sie sorgfältig zu lesen.
  • Manche meinen, man könnte sich im Forum bedienen lassen.
  • Manche meinen, sie bräuchten nicht die Sprache zu lernen, welche sie verwenden wollen, hier C++.
  • Manche ignorieren die Arduino Doku
  • Manche stochern lieber tagelang/jahrelang ohne jedes Wissen im Nebel, anstatt sich hinzusetzen und ab und zu ein Stündchen zu lesen und zu experimentieren.

Alles total menschlich, aber leider keineswegs zielführend.

Was fehlt in @combie's Liste war das unbewusste verweigern, digitale PWM-Ausgaben mit analogWrite zu erzeugen.

Sobald man draufgestupst wird, fällt es einem natürlich selbst auch sofort auf, da will ich mal @my_xy_projekt in Schutz nehmen.

Hallo zusammen,

zunächst einmal Besten Dank für die vielen Hinweise.

Inzwischen bin ich ein gutes Stück weiter, aus meiner Sicht war es hilfreich den Serial Monitor zur Überprüfung der Berechnungen zu verwenden.

Folgendes fehlt noch: ich lege den PWM-Ausgang auf Pin4, nun überprüfe ich dort mit einem Oszi, ob ein PWM-Signal anliegt, wenn ich den Analogeingang mit 1,5V anspreche. Dies ist jedoch nicht der Fall.

Ich dachte mir, ob evtl. die PIN-Zuweisung falsch ist? Ich nutze einen WEMOS D1 MINI. Wird mit der Anweisung int PWMpin=4 dann der PIN D4 als Ausgabepin verwendet, oder gibt es eine andere Zuweisung?

Das ist der Code, das Analogsignal habe ich nich korrigiert, da bereits im Ruhezustand ein Wert von 19 gemessen wurde.

int analogin;
int analogincorr;
float spannung;
int PWMout;
int PWMpin=4;

void setup() {
Serial.begin(9600);
pinMode(PWMpin, OUTPUT);

}

void loop() {

analogin = analogRead(0);
analogincorr=(analogin)-19;

spannung=analogincorr*0.00322265625;

PWMout=map(analogincorr,0,1023,0,255);

analogWrite(PWMpin,PWMout);

Serial.print("Spannungssignal roh: ");
Serial.println(analogin);

Serial.print("Spannungssignal corr: ");
Serial.println(analogincorr);

Serial.print("Spannung: ");
Serial.print(spannung);
Serial.println("[V] ");

Serial.print("PWM: ");
Serial.print(PWMout);
Serial.println("[%] ");

delay(5000);

}

Und hier die Ausgabe des Serial Monitors, wenn ich an A0 eine Spannung anlege:

20:03:48.815 -> Spannungssignal roh: 19
20:03:48.815 -> Spannungssignal corr: 0
20:03:48.848 -> Spannung: 0.00[V]
20:03:48.848 -> PWM: 0[%]
20:03:53.806 -> Spannungssignal roh: 478
20:03:53.806 -> Spannungssignal corr: 459
20:03:53.839 -> Spannung: 1.48[V]
20:03:53.872 -> PWM: 114[%]

Wie gesagt, was noch fehlt, ist die Umsetzung des Signals PWMout auf eine PIN.

Bin wieder für jeden Hinweis dankbar,

Viele Grüße

Nicht unbedingt.

Je nach ESP Ausführung muss man auch D4 schreiben, wenn man D4 verwenden will.
Die betreffende Datei im variants Ordner gibt Auskunft über die Zuordnung.

Als ich mit meinem ESP32 angefangen habe, ließ ich zunächst einen Ausgang blinken, um herauszufinden, wie ich Pins ansprechen muß.

Ist mein Tipp an Dich :slightly_smiling_face:

D4 und GPIO4 sind zwei verschiedene Pins.
Wenn D4 eine vordefinierte Konstante bei deinem Board ist, kannst du sie gerne verwenden. Auch gerne rauskriegen, welchen Zahlenwert die Konstante hat.

Ich komme leider nicht weiter. Habe jetzt Mal ein paar LEDs auf ein Board gesteckt und versucht diese anzusteuern. Leider ohne Erfolg.

Was geht, ist die interne LED. Diese erreiche ich über LED_BUILTIN oder auch 2.

Alle anderen Ausgänge konnte ich weder über 1,2,3,4 oder D1,D2,D3,D4 ansprechen.

In dem Ordner Variante kann die Pinzuordnung anscheinend nachvollzogen werden, ich bin mir aber unsicher, welcher Ordner zu dem WEMOS D1 Mini passt.

Wenn ich im Internet nach Pinout WEMOS D1 Mini suche, sind die Pins mit GPIO bezeichnet. Das hatte ich auch versucht, leider kein Blinken.

Danke für Tipps!

wenn du in der IDE den Wemos D1 Mini auswählst, dann sollten diese Pins möglich sein:

Arduino/pins_arduino.h at master · esp8266/Arduino · GitHub

mach mal einen Blinksketch für D2 bzw. GPIO 4.
Schließe an D2 bzw. GPIO4 an.
Poste den Sketch in Codetags sodass er auch lesbar ist.
Mach ein Bild deiner Verkabelung. Wir müssen genau sehen, dass du die LED richtig rum angeschlossen hast.

Da finde ich dieses Bild eines Moduls mit einem ESP8266


Bis auf D0 = GPIO16 und A0 sollten eigentlich alle Pins PWM-fähig sein.
Und LEDs zum Testen der Zuordnung ( ArduinoPin - GPIO - Dx ) solltest du (mit Vorwiderstand) auch hinkriegen

Ja, da bin ich absolut bei Euch. Ich bin auch der Meinung, dass es eigentlich ganz einfach sein sollte, komme aber dennoch nicht zum Ziel. Anbei zwei Bilder vom Aufbau.

Ich auch!

z.B.:
Wenn du die LEDs kurzschließt, wundert mich nicht, dass sie aus bleiben.
Würde ich auch, wenn ich eine LED wäre.