Wie man mit Arduino Töne unterschiedlicher Amplitude erzeugt

Für ein neues Projekt mit Arduino muss ich einen Alarmton erzeugen, der mit der Zeit an Amplitude zunehmen muss, wenn der Benutzer nichts unternimmt. Die Ausgabe erfolgt über einen kleinen Lautsprecher.

Wenn also die Alarmbedingung ausgelöst wird, würde ich einen leisen Piepton im hörbaren Bereich erzeugen, dem Benutzer etwas Zeit zum Reagieren geben, dann die Lautstärke erhöhen, warten, wieder erhöhen, bis der Benutzer reagiert. So erzeuge ich nicht von vornherein einen lauten Alarmton, der in einer ruhigen Umgebung störend wirken kann.

Das Erzeugen von Impulsen und die Verwendung eines Transistors oder IC-Verstärkers zum Ansteuern des Lautsprechers ist kein Problem.

--> Das Problem ist: Wie moduliert man die Amplitude des Lautsprecherklangs?

Meine Einschränkung ist, dass der Arduino, während er den Alarm auslöst, noch andere Sachen machen muss, also kann ich ihn nicht in einer komplizierten Routine blockieren, um Töne zu erzeugen, zum Beispiel durch eine ausgefallene PWM, die dann gefiltert wird, um ein Signal mit unterschiedlichen Amplituden zu liefern .

Ich könnte einen Pin verwenden, um das Basisfrequenzsignal zu erzeugen, und 3 Pins zur Verfügung haben, um eine externe Schaltung zu steuern, um die Amplitude zu ändern, wie folgt:Geben Sie hier die Bildbeschreibung ein

Habt ihr ein paar Ideen zu teilen?

Tks!

NACHTRAG: Dies ist die Lösung, die ich bereits ausprobiert hatte, aber die Lautstärkepegel sind nicht von einem Gerät zum nächsten wiederholbar, daher möchte ich das Hinzufügen eines Trimmerpotis vermeiden. D13 erzeugt mit dem Audioton eine Rechteckwelle. Die anderen Ausgänge leiten diesen Ton über die UND-Gatter durch die Widerstandsleiter.

Geben Sie hier die Bildbeschreibung ein

Antworten (2)

Ihre Frage zeigt eine PWM-Einheit, gefolgt von einer einstellbaren Verstärkungsstufe. Dies ist keine sehr offensichtliche Form, aber es könnte funktionieren.

Herkömmlicherweise können Sie mehrere PWM-Einheiten mit unterschiedlichen Ausgangstreiberstärken (unter Verwendung von Widerständen) verwenden, um im Endeffekt einen DAC aufzubauen.

Was Sie gebaut haben, sollte funktionieren, wenn Sie die PWM (zum Schalten) mit einer programmierbaren Stromquelle (für die Amplitude) kombinieren. Als Stromquelle können Sie 3 Stromspiegelschaltungen parallel verwenden, die von Ihren 3 Amplitudenreglern geschaltet werden. Typischerweise können Sie für jeden Umschaltschritt eine logarithmische Skalierung wählen.

Ihr PWM-Ausgang kann verwendet werden, um Strom zu senken, die 3 Stromspiegelstufen liefern Strom (und steuern die Amplitude).

Hallo Sean, ich hatte bereits eine einfache Lösung mit einer Widerstandsleiter gebaut, aber die Lautstärkepegel sind nicht von einem Gerät zum nächsten wiederholbar. Ich habe die Schaltung zum obigen Text hinzugefügt.

Arduino sagt nicht wirklich, welcher Mikrocontroller speziell, aber ich denke, alle mir bekannten Arduinos haben eine programmierbare PWM-Einheit, sodass Sie überhaupt keine CPU für die Erzeugung des Signals aufwenden müssen.

Einzelheiten zu verschiedenen Möglichkeiten zur Verwendung einer PWM-Einheit finden Sie in dieser Antwort , aber das Wesentliche ist:

Sie können die Periode Ihrer PWM programmieren, dh die Frequenz des Ausgangssignals.

Um die Spannung einzustellen, die Sie in den Lautsprecher einspeisen, können Sie verschiedene Wege gehen:

  1. Verwenden Sie eine zweite PWM-Einheit + Tiefpassfilter mit Untergrenze, um eine einstellbare Gleichspannung zu erzeugen, mit der Sie den Transistor betreiben, mit dem Sie das Signal verstärken, bevor es in den Lautsprecher gelangt
  2. Verwenden Sie anstelle einer Audiofrequenz-PWM eine viel schnellere PWM und schalten Sie diese bei der gewünschten Tonfrequenz ein und aus. Fügen Sie eine Filterung hinzu, sodass die schnelle PWM auf einen Offset reduziert wird, die Audiofrequenzen jedoch nicht abgeschnitten werden.

Ein anderer und wahrscheinlich einfachster Weg besteht darin, Ihren µC überhaupt nicht mit der Erzeugung eines analogen Signals zu befassen, sondern dafür einen Audio-DAC zu verwenden. Diese Dinge nehmen serielle Daten, typischerweise über SPI/I2S, und haben oft sogar integrierte Verstärker.

Beispielsweise verwenden die ST-Discovery-Boards den CS43L22 - IC für diese Aufgabe. Sie senden einfach digitale Audiodaten ein – und schon wird der Ton generiert. Tatsächlich hat es sogar eine Signaltonerzeugungseinheit, wenn Sie zu faul sind, die Signaltonwellenform über die I2S-Schnittstelle zu schreiben!

Es gibt eine Fülle anderer Optionen, wie z. B. Spannungs-Frequenz-Wandler-ICs, periodisches Ansteuern einer Tank- / Oszillatorschaltung usw., aber ich denke, dies könnten die arduino-freundlichsten Ansätze sein.

Hallo Marcus, ein DAC klingt wie eine gute Idee. Der CS43L22 ist ein Overkill. Mal sehen ob ich was einfacheres finde. Schließlich muss ich nur mit einem einzigen Transistor Impulse unterschiedlicher Amplitude erzeugen und verstärken.