Forum: Mikrocontroller und Digitale Elektronik Arduino tone() Problem (Ausgang invertiert)


von Max (Gast)


Lesenswert?

Hallo zusammen

An meinem Arduino hängt ein Piezo Buzzer, der über einen P-Channel 
MOSFET angesteuert wird. Leider ist durch diesen der Schaltzustand 
invertiert. Sobald der Pin nach dem Aufrufen der tone() Methode wieder 
auf Status LOW geht, liegt die Spannung am Piezo durchgehend an, da der 
MOSFET durchschaltet. Dasselbe natürlich auch mit der analogWrite() 
Methode.

Hat jemand von euch eine Idee, wie nach dem Abspielen von tone() der Pin 
auf HIGH gesetzt wird? Eventuell kann die PWM invertiert werden?

Hardware ist fix, da kann ich in meinen Setup nichts ändern. Es muss 
also softwareseitig gelöst werden.

Vielen Dank!

von Einer K. (Gast)


Lesenswert?

Max schrieb:
> liegt die Spannung am Piezo durchgehend an
Das sollte einem Piezo recht egal sein.

Max schrieb:
> Eventuell kann die PWM invertiert werden?
evtl. ja...
Doku zum Timer lesen.

Die Arduino Funktionen können das nicht.

Max schrieb:
> Hardware ist fix, da kann ich in meinen Setup nichts ändern. Es muss
> also softwareseitig gelöst werden.
Ein bisschen spät, dran...
Aber so ist das halt, mit dem planen....

von c-hater (Gast)


Lesenswert?

Max schrieb:

> An meinem Arduino hängt ein Piezo Buzzer, der über einen P-Channel
> MOSFET angesteuert wird. Leider ist durch diesen der Schaltzustand
> invertiert. Sobald der Pin nach dem Aufrufen der tone() Methode wieder
> auf Status LOW geht, liegt die Spannung am Piezo durchgehend an

Bei einem Piezo-Schallwandler ist das völlig Wurscht. Es fließt kein 
Strom, auch wenn eine Spannung dauerhaft anliegt.

> Es muss
> also softwareseitig gelöst werden.

Muss es nicht. Da es kein Problem gibt, muss auch keins gelöst werden...

von Max (Gast)


Lesenswert?

c-hater schrieb:
> Da es kein Problem gibt, muss auch keins gelöst werden...

Ich höre aber ein leises "Rauschen/Pfeifen" und der Piezo wird nach 
einiger Zeit warm. Ich vermute, das Rauschen kommt von der 
Spannungsversorgung. Der Arduino hängt an meinem MacBook Pro.
Hänge ich mein Board an ein anderes Netzteil, ist das Rauschen noch 
lauter.

Der Piezo liegt direkt an den 5V des USB Anschlusses.

von Mario M. (thelonging)


Lesenswert?

Nach Ende des Tones digitalWrite(pin#, HIGH) oder pinMode(pin#, INPUT) 
aufrufen.

Beitrag #5917968 wurde von einem Moderator gelöscht.
von Max (Gast)


Lesenswert?

Mario M. schrieb:
> Nach Ende des Tones digitalWrite(pin#, HIGH) oder pinMode(pin#, INPUT)
> aufrufen.

Das funktioniert leider nicht, da tone() asynchron ausgeführt wird.

von Stefan F. (Gast)


Lesenswert?

Max schrieb:
> da kann ich in meinen Setup nichts ändern. Es muss
> also softwareseitig gelöst werden.

Kommt mir sehr bekannt vor. Am Ende müssen es immer die 
Softwareentwickler ausbaden. Anschließend muss man sich dann auch noch 
nicht selten persönliche Kritik von Prüfern/Beratern gefallen lassen, 
die Keine Ahnung von der Entstehungsgeschichte haben.

von Stefan F. (Gast)


Lesenswert?

Max schrieb:
> Ich höre aber ein leises "Rauschen/Pfeifen" und der Piezo wird nach
> einiger Zeit warm.

Dann ist es kein Piezo Schallwandler.

von Jens M. (schuchkleisser)


Lesenswert?

Das der Piezo rauscht, liegt am Scheiß Netzteil, oder möglicherweise 
auch dran, das der Transistor nicht richtig angesteuert wird.
Liegt der Transistor auch auf 5V? Warum ist der überhaupt da drin, einen 
Piepser anzutreiben sollte der Pin des ATmega auch so schaffen.

Und ein Piezo der warm wird, da ist was im argen. Und zwar derbe.
Die bei "Gehörsturz" umgesetzte Leistung ist so gering, das selbst da 
keine Erwärmung festzustellen ist.
Wenn das bei "Stille" passiert, ist da was falsch.

von Stefan F. (Gast)


Lesenswert?

>> Nach Ende des Tones digitalWrite(pin#, HIGH) oder pinMode(pin#, INPUT)
>> aufrufen.

> Das funktioniert leider nicht, da tone() asynchron ausgeführt wird.

Dann musst du das eben zum richtigen Zeitpunkt machen. Oder die Tatsache 
ausnutzen, dass das Arduino Framework quell-offen ist. Sprich: Du kannst 
und darfst es modifizieren.

von Max (Gast)


Lesenswert?

Hab mal so ein Modul aufgebrochen. Es scheint, doch ein Lautsprecher zu 
sein :-/
Eine kleine Kupferspule unterhalb eines piezoähnlichen Blech. Das nervt 
jetzt umso mehr.

Stefanus F. schrieb:
> Dann musst du das eben zum richtigen Zeitpunkt machen.

Das wird die Lösung sein. Wie kann der Zeitpunkt zuverlässig ermittelt 
werden, wenn tone() asynchron ausgeführt wird?

von Stefan F. (Gast)


Lesenswert?

Max schrieb:
> Das wird die Lösung sein. Wie kann der Zeitpunkt zuverlässig ermittelt
> werden, wenn tone() asynchron ausgeführt wird?

Weiss ich jetzt nicht. Schau Dir die Quelltexte von Arduino an. 
Vielleicht wird am Ende des Tones irgendein globales Flag gesetzt, dass 
du abfragen kannst.

Aber wenn du schon so weit gehst, kannst du vermutlich gleich den Code 
verändern, so dass der Pin nach Ende des Tones als Input umkonfiguriert 
wird.

von Max (Gast)


Lesenswert?

So wie's aussieht, muss folgende Datei angepasst werden.
https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/Tone.cpp

Vielen Dank für alle Antworten!

von äxl (Gast)


Lesenswert?

Wie groß ist der Basisvorwiderstand zum Treibertransistor? Was ist das 
für einer?
Hier einen pnp-RET einsetzen,
https://www.nexperia.com/products/bipolar-transistors/resistor-equipped-transistors-rets/rets-500-ma-single-double/PDTB113ZT.html
den Basisvorwiderstand vom Board nehmen und dort einen (von der Baugröße 
her passenden) Kondensator einlöten.
Oder der SW-Mann muss ran. Ich bade meine HW-Fehlerchen (wenns geht) 
gern selbst aus ;)

von Stefan F. (Gast)


Lesenswert?

Max schrieb:
> So wie's aussieht, muss folgende Datei angepasst werden.

Ja. Ich würde mir die Stellen anschauen, wo "// keep pin low after stop" 
steht. Ich denke, genau dort kannst du den finalen Pegel am Pin 
umkehren.

von Max (Gast)


Angehängte Dateien:

Lesenswert?

Für alle, die das dann irgendwann brauchen werden. Code anpassen in 
Tone.cpp. Kommentierten Code auskommentieren und [PIN] ersetzen.

Das ist schnell, unsauber und nur zum Testen. Ich werde meine Hardware 
anpassen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.