PWM Sound am ESP32 macht undefinierbare Geräusche

Servus mitanand,

ich habe einen MFRC522 Reader an einem ESP32 am laufen, funktioniert Alles prima.
Zusätzlich gebe ich PWM Sounds über einen kleinen PC - Speaker an einem Sound Modul (LM386) aus.
Beeeep = Karte OK, beep, beep, beep = Kartendaten ungültig.
Immer wenn der ESP arbeitet (Webserver muss Daten senden, SD lesen, SD schreiben, NTP Uhrzeit holen und die RTC synchronisieren), macht der Speaker rschch, schchch, kratz, kratz.
Ich habe schon alle noch freien GPIO's (12, 14, 26, 27) ausprobiert, es ändert sich Nichts. Die Kratzgeräusche bleiben. Leider habe ich keinen Oszi, um die Signale zu messen.

Hat jemand eine Idee, wie ich diese unerwünschten Signale am GPIO unterdrücken kann?
Den Trimmer auf dem LM386 habe ich schon auf Minimum gestellt. Noch ein µ weiter und der Ton ist ganz aus. Vcc am LM386 habe ich auch schon von 5V auf 3,3V verringert.

Sobald der ESP etwas mehr Arbeit bekommt, macht der Speaker Geräusche.

Gruß
Fred

Dann zeig doch mal den Code, den Du verwendest. PWM ist nicht zur Tonerzeugung gedacht, aber wenn man die PWM Frequenz ändert, dann sollte die Hardware diese Frequenz ohne Störungen abspielen.

Den Trimmer auf dem LM386 habe ich schon auf Minimum gestellt.

Nach kurzem Studium des Datenblattes für den LM386, musste ich feststellen, dass sich auf diesem Chip kein Trimmpoti befindet. Auch gibt es keine dafür vorgesehene Befestigung.

Damit gebe ich hier auf.

Typischer combie-Beitrag, sehr im Detail verbohrt :neutral_face:

Sicherlich hat Fred sowas wie hier am laufen. Was denn auch sonst, er schreibt ja auch von einem Modul.

Ich verwende für Kontroll-Piepserei auch PWM, die ich halt je nach Pieps länger/kürzer bzw. einmal/öfter einschalte. Das funktioniert einwandfrei.

Ich tippe mal auf Einstreuungen aus dem Digitalteil, erste Maßnahme: Schaltplan vom Modul zeigen

Hallo Fred,
ich denke auch, Einstreuungen dürften die wahrscheinlichste Ursache sein. Das Eingangssignal vom ESP ist schon rel. hoch, da braucht der Verstärker eigentlich nicht mehr viel verstärken. Je höher die Verstärkung, desto mehr werden auch die Einstreuungen verstärkt. Deshalb setz mal die Verstärkung des LM386 herunter. Im Link von Klaus_ww steht ja wie das geht. Auch eine sehr gute Entkopplung der Versorgungspannung von ESP und Verstärker ist wichtig.

Typischer combie-Beitrag, sehr im Detail verbohrt :neutral_face:

Vielleicht....

Sicherlich hat Fred sowas wie hier am laufen. Was denn auch sonst, er schreibt ja auch von einem Modul.

Kann eigentlich nicht sein, denn die Module sind erst ab 4 V oder 5V, laut Beschreibungen.
Seins wird offensichtlich mit 3,3V versorgt

Glaube ich, dass das eine gute Idee ist? Nö.
Das Datenblatt ist da klar.

Natürlich könnte ich meine Glaskugel los schicken und dann sagen:

  1. Koppelkondensator vergessen
  2. Pin nach der PWM Ausgabe nicht auf "floatend" gesetzt.

Mit Code und Schaltplan ließe sich das schnell überprüfen.
Aber so ist es nur eine dulle Vermutung.

Welchen Grund mag es wohl geben, das konkrete Modul/Code/Schaltung geheim zu halten?

Mal abgesehen von "Absicht", kann das doch nur passieren, wenn man versucht technische Probleme mit sozialen Lösungsstrategien anzugehen.

Wir müssen über das Problem reden!
Bis sich das Problem verändert
Oder die Sicht darauf
(was beides aufs gleiche hinausläuft)

Technische Probleme sollte man anders angehen:

Problem analysieren
Lösung entwickeln
Lösung durchsetzen.
Dazu müssen allerdings Fakten auf den Tisch.

Wer diese nicht liefern möchte, kann, oder auch gar nicht auf die Idee kommt, darf einfach keine konkrete Hilfe erwarten. Und meine Lust da immer nachzuhaken, betteln usw. wird zunehmend geringer.

verbohrt
Ja, vielleicht ist das "verbohrt".

[in eigener Sache]

Irgendwann baue ich mal einen Thread, mit Sprüchlein, mit was ich von so einer Informationsmangelversorgung halte.

Und darauf verweise ich dann in solchen, oder ähnlich gelagerten Fällen.

[/in eigener Sache]

freddy64:
.....
Sobald der ESP etwas mehr Arbeit bekommt, macht der Speaker Geräusche.

Verstehe ich nicht.
Du willst doch, dass der Speaker piept, also Geräusche macht. Ja was denn nun ?

Ja, aber er piepst nicht, sondern "rauschelt" so vor sich hin.
Abwarten, was an Rückmeldung kommt, Tipps gab's ja schon.

Klaus_ww:
Ja, aber er piepst nicht, sondern "rauschelt" so vor sich hin.
Abwarten, was an Rückmeldung kommt, Tipps gab's ja schon.

Ja, das ist so ein Problem mit den digitalen Pins, die dann auch noch verstärkt werden. :wink:

Da sollte dann einfach ein aktiver Piepser genommen werden.

Nur so, weil's irgendwie passt: Wenn ich meine Musik mit dem Kopfhörer höre (mein Verstärker verhält sich wie eine externe USB-Soundkarte), bekomme ich mit, wenn ich die Maus bewege.

„Digitale Qualität!"

Jaja

Gregor

Gleich so viele Replies,
das dauert, um alle abzuarbeiten.
Ohne Verstärker ist der Beep vom Speaker in einem Gehäuse bei lauten Umgebungsgeräuschen (Kneipe) kaum hörbar.
Deshalb dieses Teil.
Das Ding ist ca. 5cm vom ESP entfernt im Gehäuse verbaut.
Ich probiere jetzt mal folgendes: Den Eingang von dem NF Verstärker vom GPIO abstecken und dann schauen, was passiert. Wenn es immer noch "raschelt", sind es HF Störungen. Wenn nicht, weiter suchen.
Für die Sounderzeugung benutze ich diesen Code:

// Start by defining the relationship between note, period, &  frequency.

#define  B2    1014
#define  G3    637

// Set up speaker PWM pin
#define SPEAKER_PIN 13

// MELODY and TIMING  =======================================
// melody[] is an array of notes, accompanied by beats[] which sets each note's relative length (higher value = longer note)
uint16_t melody_ok[] = { B2 };
uint8_t beats_ok[]  = { 14 };

uint16_t melody_err[] = { G3, G3, G3 };
uint8_t beats_err[]  = { 7, 7, 7 };

// Set overall tempo
uint16_t tempo = 20000;

// Set length of pause between tones
uint16_t silence = 20000;

// PLAY TONE  ==============================================
// Pulse the speaker to play a tone for a particular duration
void playTone(unsigned long frequency, unsigned long duration) {
  unsigned long elapsed_time = 0;
  if (frequency > 0) {
    while (elapsed_time < duration) {
      digitalWrite(SPEAKER_PIN, HIGH);
      delayMicroseconds(frequency / 2);
      digitalWrite(SPEAKER_PIN, LOW);
      delayMicroseconds(frequency / 2);
      // Keep track of how long we pulsed
      elapsed_time += frequency;
    }
  }
}

void playSuccessMelody() {
  uint8_t i = 0;
  for (i = 0; i < (sizeof(melody_ok) / 2); i++) {
    playTone(melody_ok[i], beats_ok[i] * tempo);
    delayMicroseconds(silence);
  }
}

void playErrorMelody() {
  uint8_t i = 0;
  for (i = 0; i < (sizeof(melody_err) / 2); i++) {
    playTone(melody_err[i], beats_err[i] * tempo);
    delayMicroseconds(silence);
  }
}

Nicht über den GPIO13 wundern! ist ESP32, und kein Arduino

Schon mal viele Dank für eure Bemühungen.

Ich werde berichten, wenn ich das Problem gelöst habe.

Nun ja, mit Delay läßt sich kein zuverlässiges Timing erreichen. In einem Multitasking System läuft da alles mögliche nebenher.

Mit der tone32 library geht es jetzt.

#define BUZZER_PIN 13
#define BUZZER_CHANNEL 0

void playSuccess() {
  tone(BUZZER_PIN, NOTE_B5, 400, BUZZER_CHANNEL);
  noTone(BUZZER_PIN, BUZZER_CHANNEL);
}

Schau an!
Dann hatte meine Glaskugel ja doch recht.
Und dein Quellcode zeigt das auch mehr als deutlich.

  1. Pin nach der PWM Ausgabe nicht auf "floatend" gesetzt.

Danke für die Bestätigung.