PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Buzzer mit PWM über Transistor



demmy
30.01.2017, 19:49
Hallo zusammen,

eig. habe ich ein ganz triviales Problem, aber irgendwie stehe ich auf dem Schlauch.

Ich möchte einen Buzzer über einen PWM-Pin eines Atmegas summen lassen. Den Buzzer wollte ich nach folgender Schaltung mittels eines Transistors ansteuern um später evtl. mal eine andere Spannung als die 5V des Testboards für den Summer verwenden zu können.

32380

Baue ich die Schaltung so auf, dann summt der Buzzer, kaum hörbar, nur ganz ganz leise. Ich habe auch schon verschiedene Basiswiderstände getestet, leider ohne Erfolg.
Meine PWM-Frequenz passt offensichtlich, denn schließe ich denn Buzzer direkt an den µC bin an, dann summt er schön laut.
Wieso funktioniert es aber nicht mit meiner Transistorschaltung? Habe ich einen Denkfehler drin?
Laut Datenblatt braucht der Buzzer nur 7mA und die 5V liegen auch an!
Ich bin mir eig. ziemlich sicher, dass ich so eine Schaltung schon erfolgreich mal aufgebaut habe.

ich hoffe Ihr habt eine Idee?

Peter(TOO)
30.01.2017, 20:32
Hallo,

Die Frage ist erst einmal was du da überhaupt für ein Teil hast?
Da gibt es welche mit eingebauter Elektronik, da kann man nur die Spannung anlegen und es piepst mit einer festen Frequenz.

Vermutlich hast du aber nur eine Piezo-Scheibe, sonst würde es direkt am Port nicht mit der eingestellten Frequenz funktionieren.

So ein Piezo verhält sich aber mehr wie ein Kondensator.
Dein Transistor lädt, wenn er durchschaltet den Kondensator auf ... das war es dann!
Der Pin schaltet zwischen 0V und 5V hin und her, lädt und entlädt den Kondensator also.

Wenn du jetzt z.B. 1k parallel zum Buzzer schaltest wird er lauter werden, dann kann sich der Kondensator über den Widerstand entladen.
Wenn due den Widerstandswert änderst, kannst du in einem gewissen Bereich die Lautstärke einstellen.

Alternativ müsstest du eine Gegentakt-Endstufe bauen.

MfG Peter(TOO)

demmy
30.01.2017, 21:31
Hallo Peter,

vielen Dank für deine schnelle Antwort.
Das mit den 1k parallel zum Buzzer hat funktioniert.

Ich verwende einen Piezzo-Summer mit Rechtecksignal. Der Typ ist: KPEG158-P5H

Jetzt hätte ich noch eine Frage, hätte ich das im Datenblatt erkennen können, dass der Buzzer sich wie ein Kondensator verhält?
Die Lautstärke ist doch auch spannungsabhängig oder? Also macht es einen Unterschied ob ich den Buzzer mit 12V oder mit 5V betreibe?

Viele Grüße
demmy

Peter(TOO)
30.01.2017, 23:15
Hallo demmy,

Ich verwende einen Piezzo-Summer mit Rechtecksignal. Der Typ ist: KPEG158-P5H

Jetzt hätte ich noch eine Frage, hätte ich das im Datenblatt erkennen können, dass der Buzzer sich wie ein Kondensator verhält?
Im Prinzip Ja,
es ist ein reiner Piezo ohne Elektronik. Und Piezo-Kristalle verhalten sich nun mal so. :-)

Hier noch das Datenblatt:
http://docs-europe.electrocomponents.com/webdocs/1168/0900766b811685e8.pdf


Die Lautstärke ist doch auch spannungsabhängig oder? Also macht es einen Unterschied ob ich den Buzzer mit 12V oder mit 5V betreibe?
Spezifiziert ist er bei 4kH und 9Vpp Du kommst jetzt auf 5VPP
Ein Trick wäre es, den Buzzer zwischen zwei Pins anzuschliessen und den zweiten Pin mit dem invertierten Signal zu speisen. Oder due verwendest einen Inverter und hängst den Buzzer zwischen Ein- und Ausgang an. An den Eingang des Inverters kommt dann noch dein PWM-Signal.

Bei 0-1 hast du dann +5V anliegen und bei 1-0 dann -5V, ergibt dann 10VPP.

Allerdings hängt die Lautstärke auch noch von der Frequenz ab. Im Datenbaltt unter "D. Typical Ferquency Response Curve" zu sehen. Zwischen 4kHz und 5kHz ist er am lautesten.

Betreiben kannst du ihn zwischen 2VPP und 20VPP

MfG Peter(TOO)

demmy
30.01.2017, 23:56
Hallo Peter,

danke nochmal für deine Ausführungen.


Ein Trick wäre es, den Buzzer zwischen zwei Pins anzuschließen und den zweiten Pin mit dem invertierten Signal zu speisen.

Damit meinst du immer wechselweise einen der Pins auf Masse / Low-Pegel und den andern Pin auf 5V / High-Pegel schalten oder?
Dann wäre die Spannungsdifferenz aber auch "nur" bei 5 V, oder habe ich dich falsch verstanden?


Oder due verwendest einen Inverter und hängst den Buzzer zwischen Ein- und Ausgang an. An den Eingang des Inverters kommt dann noch dein PWM-Signal.

Bei 0-1 hast du dann +5V anliegen und bei 1-0 dann -5V, ergibt dann 10VPP.


Dieser Vorschlag würde voraussetzen das ich auf meinem Board eine negative Spannung bereitstelle oder?


Könnte ich nicht auch einfach mittels des Transistors z.B. 12V schalten die am Buzzer anliegen?

Peter(TOO)
31.01.2017, 02:54
Hallo,

Damit meinst du immer wechselweise einen der Pins auf Masse / Low-Pegel und den andern Pin auf 5V / High-Pegel schalten oder?
Dann wäre die Spannungsdifferenz aber auch "nur" bei 5 V, oder habe ich dich falsch verstanden?
Du hast mich richtig verstanden, denkst aber falsch :-)

Bezeichnen wir einmal die beiden Anschlüsse mit A und B. (dann muss ein alter Mann nicht so viel tippen.):

A = 0V; B = +5V: An B liegen +5V an.
A = +5V; B = 0V: An B liegen nun -5V an!

Die Differenz zwischen +5V und -5V ist 10V ;-)

Alles ist eben relativ, besonders die Spannungen, bzw. Potentiale!
Eine Spannung kann immer nur zwischen zwei Potenzialen auftreten.
Nimm mal eine 9V-Batterie. Mit einem Voltmeter misst du zwischen den Anschlüssen 9V oder zumindest etwas in dieser Grössenordnung, wenn sie nicht leer ist.
Nun misst du zwischen dem einen Anschluss und z.B. der Wasserleitung. Ein DVM zeigt dir dann alles an, nur nicht 9V. Zwischen Wasserleitung und dem anderen Anschluss ist es auch nicht anders.

Wenn du eine 9V Batterie nimmst, ist es egal welchen Anschluss du mit Masse verbindest. Es sollten nur nicht beide gleichzeitig sein :-)
Je nachdem hat der andere Anschluss dann +9V oder -9V.


Dieser Vorschlag würde voraussetzen das ich auf meinem Board eine negative Spannung bereitstelle oder?
Nö.
Nimm einen CD4001 oder 74x04 Inverter.
Wenn du den Eingang mit 0 ansteuerst geht der Ausgang auf 1. Liegt am Eingang eine 1 an, geht der Ausgang auf 0.

Und jetzt lies die oben nochmals nach. :-P

MfG Peter(TOO)

Hubert.G
31.01.2017, 11:11
Ich verwende einen Piezzo-Summer mit Rechtecksignal. Der Typ ist: KPEG158-P5H

Jetzt hätte ich noch eine Frage, hätte ich das im Datenblatt erkennen können, dass der Buzzer sich wie ein Kondensator verhält?

Nur zur Ergänzung:
Im Datenblatt steht (sollte stehen) ob der Summer für DC oder AC ist.
Für DC legt man die vorgegebene Gleichspannung an und es summt mit der angegebenen Frequenz.
Für AC gilt das von Peter(TOO) beschriebene.

oberallgeier
31.01.2017, 13:22
.. Im Datenblatt steht (sollte stehen) ob der Summer für DC oder AC ist ..Steht drin, zumindest bei RS-online unter "Eigenschaften" (http://de.rs-online.com/web/p/piezo-summer-komponenten/7716910/). 1V AC .. 20 V AC, Tonart Rechtecksignal, Kapazität 12nF. Das Datenblatt (http://docs-europe.electrocomponents.com/webdocs/1168/0900766b811685e8.pdf) spricht (gilt nur für lateinische Schriftzeichen *gg*) NIRGENDWO von AC oder DC, aber es steht dort ".. Operating Volt. Vp-p 2~20 .."

oberallgeier
31.01.2017, 19:52
.. eine Piezo-Scheibe .. wie ein Kondensator.. z.B. 1k parallel zum Buzzer schaltest wird er lauter werden ..Sorry, wenn ich meine völlige Unkenntnis hier aufbiete. Ich habe das getestet.

Aufbau: Experimentierplatine mit mega1284 @ 20 MHz, PORTD/PD2 und GND, 5V-Controller, PD2 ist Ausgang. Eines dieser zölligen (Ø ca. 25,4 mm) Scheibchen aus ner Glückwunschkarte. Kapazität: DMM => 26 nF, selbstgebauter "Transistor"tester => 19 nF. Zwei Drähte angelötet. Piezoscheibe mit Krokoklemme an Pappdeckel geklemmt.

Test:
a) PD2 wird mit 4 kHz getoggelt, die zwei Drähte der Scheibe an PD2 und GND. Es pfeift mit den erwarteten 2 kHz.
b) Parallel zu den Drahtanschlüssen der Scheibe einen 1k gesteckt. Es pfeift etwa so laut wie vorher.

Warum pfeifts - nach meinem eigenen Gehör - gleichlaut?

Danke für ne Antwort.


// ================================================== =========================== =
// === Nicht unterbrechbare ISR für timer2 ==================================== =
// Routine zählt hoch im Takt 20 kHz = 50 µs.
ISR(TIMER2_COMPA_vect) // Vektor 10 / $0012
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{ //
IzeitA2 --; // ###>>> IzeitA2 ist aktuell int16_t ==>>
// IzeitA2 bleibt bis 32000 in der int16-Grenze

// - - - - - - - - - - - - - - - - - - -
tmpizo --;
if ( !tmpizo )
{ //
ToggleBit (PORTD, PD2);
tmpizo = 5; //
}
// - - - - - - - - - - - - - - - - - - -
. . .

Hubert.G
31.01.2017, 20:28
Hallo Joe
Der Unterschied von deiner Schaltung zur Schaltung am Anfang dieses Beitrags ist der, das du eine Seite des Kondensators auflädst und wieder entlädst wenn der Ausgang auf 0 geht.
Bei der ersten Schaltung wird der Kondensator über den Transistor aufgeladen aber nicht mehr entladen.

Peter(TOO)
31.01.2017, 20:58
Hallo Geier,

Aufbau: Experimentierplatine mit mega1284 @ 20 MHz, PORTD/PD2 und GND, 5V-Controller, PD2 ist Ausgang.
Test:
a) PD2 wird mit 4 kHz getoggelt, die zwei Drähte der Scheibe an PD2 und GND. Es pfeift mit den erwarteten 2 kHz.
b) Parallel zu den Drahtanschlüssen der Scheibe einen 1k gesteckt. Es pfeift etwa so laut wie vorher.

Warum pfeifts - nach meinem eigenen Gehör - gleichlaut?
Dein Aufbau ist falsch!

Beim ursprüngliche Aufbau wurde nur ein Transistor verwendet, welcher nach 0V schaltet und im anderen Fall hochohmig ist, also ein OC-Ausgang.

Dein PD2 hat aber eine Gegentakt-Ausgangsstufe.
Der Port-Ausgang schaltet zuerst nach 0V und lädt den Kondensator, anschliessend wir der Pin gegen 5V geschaltet und der Kondensator wird entladen.

Wenn man an einen Piezo-Kristall eine Spannung anlegt verformt er sich. Die Verformung ist proportional zur angelegten Spannung. Polt man die Spannung um, verformt er sich in die andere Richtung. Entsprechend werden Piezo auch als Aktoren im µm-Bereich verwendet.

Umgekehrt kann man den Piezo verbiegen und er erzeugt dann eine Spannung, welche proportional zur Kraft ist.
Wurde in billigen Plattenspielern verwendet, als Mikrofon, vandalensichere Tasten, EnOcean betreibt damit auch noch einen Sender für Funktasten ohne Batterie, im Feuerzeug hat ein Hammer drauf um einen Zündfunken zu bekommen usw.

Achja, der Schwingquarz gehört auch noch dazu. Das Plättchen schwingt dann tatsächlich mechanisch mit 16MHz im Gehäuse. Der Trick ist dabei, dass die mechanische Eigenresonanz-Frequenz entsprechend abgeglichen wird. Wenn man den Quarz also wie eine Glocke anschlägt, würde dieser mit den 16MHz nachklingen.
Jetzt habe ich etwas gelogen, praktisch verwendet man in diesem Bereich eine der Obertöne. Der Quarz würde vermutlich nur mit 1 MHz klingen.

Zurück zur Frage!
Mit dem OC-Ausgang schaltest du gegen Masse, der Kondensator wird geladen und der Piezo-Kristall verbiegt sich.
Dann schaltest du den OC ab :-(
Der Kondensator bleib geladen und der Piezo ändert seine Form nicht!
OK, ein klein bisschen hat er sich über die Leckströme entladen, ganz leise war er hörbar.

Mit dem Widerstand wird nun der Kondensator entladen und der Piezo verbiegt sich wieder zurück.

Der 1k war nur so ein Schätzwert um den Fehler aufzuzeigen. Je kleiner man den Macht umso schneller, bzw. mehr kann sich der Kondensator entladen. Macht man ihn zu klein brennt irgendwann der Transistor durch, weil er überlastet wird.
Wie sich der Kondensator entlädt, kann man über die normalen RC-Gleichungen berechnen, dazu braucht man die Kapazität des Piezos und den Widerstandswert. Zusammen mit der Ansteuerfrequenz kann man R dann so festlegen, dass sich der Kondensator nur auf die halbe Spannung oder 1/4 entladen kann. Entsprechend ändert sich die Lautstärke, bei einer festen Frequenz.


Du kannst aber folgendes testen:
Setze den Pin per Software auf 0.
Dann schaltest du in der ISR zwischen Ausgang und Eingang um. Also wie ToggleBit() aber nicht auf dem Port-Register sondern das DDR-Register.
Dann kannst du die Lautstärke noch damit ändern, dass du den Pull-Up zu und weg schaltest.

MfG Peter(TOO)

oberallgeier
31.01.2017, 22:39
.. Dein Aufbau ist falsch! .. .. .. Dann kannst du die Lautstärke noch damit ändern, dass du den Pull-Up zu und weg schaltest ..Mannoohh, Peter, danke für diese umfassende Antwort.

Das mit Feuerzeug, Tonabnehmer und so und natürlich das mit den (Frequenz-)Quarzen kannte ich - ungefähr - auch das mit den Oberwellen. Ich glaube, jetzt verstehe ich das aber besser. Und den Aufbau mache ich morgen anders, die Geschichte interessiert mich.

demmy
31.01.2017, 22:40
Hallo zusammen,

ich wollte auch nochmal kurz bescheid geben, das ich den Buzzer jetzt mal testweise an zwei PWM-Pins eines Timers gehängt habe.
Die beiden Pins lasse ich wechselweise über die PWM ein und aus schalten.
Damit ist der Summer jetzt nochmal deutlich lauter geworden als im Vergleich zur Transistorschaltung mit Widerstand oder an nur einem PWM-Pin.

Theoretisch müsste man doch jetzt auch die Lautstärke, zumindest in zwei Stufen, regeln können. Wenn man einen der beiden PWM-Pins auf einem Potential stehen lässt und nur mit einem Pin weiter togglet, dann verringert man die Lautstärke. Gefühlt hätte ich gesagt man halbiert sie? Togglet man den zweiten Pin wieder, erhöht man die Lautstärke wieder. Leider gibt es im Datenblatt keine Auskunft darüber wie die Lautstärke mit der Spannung in Zusammenhang zu bringen ist.

Was würde denn passieren wenn die beiden PWM-Pins nicht synchron ihr Potential wechseln?
Dies hätte vermutlich hauptsächliche eine Auswirkung auf die Frequenz nehme ich an. Kurzzeitig müsste eine Unterbrechung in der Umladung des Kondensators stattfinden, da beide Pins für einen Moment das gleiche Potential haben würden.

Peter(TOO)
31.01.2017, 23:05
Hallo,

ich wollte auch nochmal kurz bescheid geben, das ich den Buzzer jetzt mal testweise an zwei PWM-Pins eines Timers gehängt habe.
Die beiden Pins lasse ich wechselweise über die PWM ein und aus schalten.
Damit ist der Summer jetzt nochmal deutlich lauter geworden als im Vergleich zur Transistorschaltung mit Widerstand oder an nur einem PWM-Pin.
Das müsste die Lautstärke sein, welche im Datenblatt angegeben wird, die ist bei 9VPP gemessen. Deine Ausgänge schalten nicht exakt bis 0B und +5V durch, da fällt noch etwas Spannung ab.


Theoretisch müsste man doch jetzt auch die Lautstärke, zumindest in zwei Stufen, regeln können. Wenn man einen der beiden PWM-Pins auf einem Potential stehen lässt und nur mit einem Pin weiter togglet, dann verringert man die Lautstärke. Gefühlt hätte ich gesagt man halbiert sie? Togglet man den zweiten Pin wieder, erhöht man die Lautstärke wieder. Leider gibt es im Datenblatt keine Auskunft darüber wie die Lautstärke mit der Spannung in Zusammenhang zu bringen ist. /QUOTE]
Richtig, Versuch macht kluch. :-)
Bei der Lautstärke wird es aber etwas schwierig. Das Gehör empfindet die Lautstärke nicht linear.

[QUOTE=demmy;634828] Was würde denn passieren wenn die beiden PWM-Pins nicht synchron ihr Potential wechseln?
Dies hätte vermutlich hauptsächliche eine Auswirkung auf die Frequenz nehme ich an. Kurzzeitig müsste eine Unterbrechung in der Umladung des Kondensators stattfinden, da beide Pins für einen Moment das gleiche Potential haben würden.
Kannst du auch einfach ausprobieren, einfach zwei PWM unterschiedlich programmieren.
Das ist das schöne am Mikrokontroller. Du musst nur die Software ändern. kostet dich ausser Zeit keinen zusätzlichen Cent.
Kaputt kannst du in diesem Fall auch nichts machen.

Je nachdem bekommst du dann ganz lustiges Gejaule hin :-)
Neben den beiden Grundfrequenzen hörst du dann noch die Summen und Differenzen der beiden Frequenzen. Zudem dürfe je nach dem auch noch die Lautstärke etwas moduliert werden.
Schöne Schwebungen müsste es geben, wenn die Frequenzen nur ganz leicht voneinander abweichen. Also im Bereich von nur ein paar Herz.

Bei grösseren Abweichungen, z.B. 1kHz kommt dann diese Frequenz auch schön durch.

Dann spiel mal schön. :-({|=

MfG Peter(TOO)

oberallgeier
01.02.2017, 15:23
.. Dein Aufbau ist falsch! .. Du kannst aber folgendes testen:
Setze den Pin per Software auf 0.
Dann schaltest du in der ISR zwischen Ausgang und Eingang um. Also wie ToggleBit() aber nicht auf dem Port-Register sondern das DDR-Register.
Dann kannst du die Lautstärke noch damit ändern, dass du den Pull-Up zu und weg schaltest.

MfG Peter(TOO)

OK:
Setze den Pin per Software auf 0.
>>..PORTD........&= ~(1<<PD2);........// PD2 auf Null setzen
.. Also wie ToggleBit() aber nicht auf dem Port-Register sondern das DDR-Register.
>>..ToggleBit (DDRD, PD2);..............// DDRD-2 umschalten: Eingang/Ausgang

Geht leider überhaupt nicht => kein Ton (auch kein Blinken einer LED). Die "alte" Variante tönte wenigstens. Hab ich Dein Posting falsch vestanden ?


...
// Auszug aus main.c
// ================================================== =========================== =
// Testweise hier eine Endlosschlaufe, NUR für Piezosummer (anderer Test!!)
// Verwendete Pinne: RXD1/INT0/PD2 + GND,
// - - - - - - - - - - - - - - - -
DDRD &= ~(1<<PD2); // Setze Pinn auf Eingang
PORTD &= ~(1<<PD2); // PD2 auf Null setzen
// ================================================== =========================== =
// Testweise hier eine Endlosschlaufe, NUR für Piezosummer (anderer Test!!)
// Verwende Ausgänge RXD1/INT0/PD2 + TXD1/INT1/PD3, beide als Ausgang, PD2=0
// - - - - - - - - - - - - - - - -
DDRD &= ~(1<<PD2); // Setze Pinn auf Eingang
DDRD |= (1<<PD3); // Setze Pinn auf Ausgang
PORTD &= ~(1<<PD2); // PD2 auf Null setzen
tmpizo = 5 ; // Piezo schnarrt mit 20000/5 = 4 kHz
// siehe ISR(TIMER2_COMPA_vect)
// - - - - - - - - - - - - - - - -
while ( 1 )
{ //
} //
// - - - - - - - - - - - - - - - -
// ================================================== =========================== =
...
// Auszug aus ~tmr~.c
// ================================================== =========================== =
// === Nicht unterbrechbare ISR für timer2 =================================== */
// Routine zählt hoch im Takt 20 kHz = 50 µs.
ISR(TIMER2_COMPA_vect) // Vektor 7
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{ //
IzeitA2 --; // ###>>> IzeitA2 ist aktuell int16_t ==>>
// IzeitA2 bleibt bis 32000 in der int16-Grenze
//...
// - - - - - - - - - - - - - - - - - - -
// - - - - - - - - - - - - - - - - - - -
tmpizo --;
if ( !tmpizo )
{ //
// ToggleBit (PORTD, PD2); // Portpin umschalten 0/1
ToggleBit (DDRD, PD2); // DDRD-2 umschalten: Eingang/Ausgang
tmpizo = 5; //
}
// - - - - - - - - - - - - - - - - - - -
...

Peter(TOO)
01.02.2017, 18:13
Du hast mich nicht ganz richtig verstanden:

1. Initialisieren Port-Pin auf 0 setzen.
2. Erster ISR-Aufruf: DDR auf Eingang
3. nächster ISR-Aufruf: DDR auf Ausgang setzen
4. wieder wie 2.

MfG Peter(TOO)

oberallgeier
01.02.2017, 18:32
Du hast mich nicht ganz richtig verstanden:

1. Initialisieren Port-Pin auf 0 setzen.
2. Erster ISR-Aufruf: DDR auf Eingang
3. nächster ISR-Aufruf: DDR auf Ausgang setzen
4. wieder wie 2.
..(TOO)

Grübel - ich dachte genauso läufts bei mir. Im main wird vor einer Endlosschleife Port-Pin PD2 auf null gesetzt ( PORTD &= ~(1<<PD2); ), danach gehts in die leere while-Schleife. Inzwischen schaltet die ISR lustig im Toggelmodus ( ToggleBit (DDRD, PD2); ). Sorry, ich denke, das ist genau wie von Dir empfohlen ? ? ? ?

Peter(TOO)
01.02.2017, 19:22
Was ist mit dem Widerstand parallel zum Piezo um dem Pullup im Port?

und wie ist der Piezo angeschlossen? gegen +5V oder gegen Masse?



if ( !tmpizo )
Das if wird nur ausgeführt wenn tmpizo == 0 ist.
Bei einer Störung (doppelter decrement) geht es dann eine Ganze Runde bis tmpizo wieder 0 wird.

So etwas sollte man mit
if ( tmpizo <= 0 )
aber dann muss tmpizo signed sein.

Zudem verwende ich keine Bibliotheken, da weiss man nie welche Seiteneffekt die noch haben.

Ich weiss nicht was ToggleBit() im Detail macht.

MfG Peter(TOO)

oberallgeier
03.02.2017, 13:11
Was ist mit dem Widerstand .. Piezo .. gegen +5V oder gegen Masse? .. was ToggleBit() im Detail machtHallo Peter, danke für Deine ausführliche Hilfe.

Mich interessierte ja primär die Lautstärkeänderung des Piezobuzzers durch Parallelschalten eines Widerstandes. Hintergrund ist, dass ich über solche Erscheinungen (Schwingkreise und so) keinen blassen Schimmer habe.

Nun habe ich also ein paar Varianten gemessen und Variationen mit Ergebnissen in die Tabelle eingetragen. Dort ist auch das von mir seit "Ewigkeiten" verwendete Makro "ToggleBit" beschrieben; keine spezielle Bibliothek, nur eben Teil einer eher kurzen, von mir erstellten Liste von Makros.

......https://dl.dropbox.com/s/mkkgjbnbyqc2hr4/Buzzertest_03Feb2017-50%25.jpg?dl=0 (https://dl.dropbox.com/s/cdk4sh40j897p50/Buzzertest_03Feb2017.JPG?dl=0)
......© 2017 oberallgeier

Sonstige, nicht erwähnte Daten des Testaufbaus:
Mega1284P @ 20 MHz, 5 V ± 0,1 V (Labornetzteil - Strombegrenzung 3A), Port D/D2, Buzzer mit Drahtanschluss ca. 200 mm, Soft"PWM" aus dem Zeittakt für "Boardzeit und Allerlei".

Leider habe ich keine Beeinflussung der Lautstärke bei 4 kHz gemessen, siehe Spalte "Sound". Andere Frequenzen habe ich nicht gemessen, die 4kHz scheinen ja etwa die Eigenfrequenz der Piezoscheibe zu sein (Datenblatt liegt nicht vor). Der Rest ist eigentlich verständlich: wird der Portpin getoggelt, dann ist "immer" Sound, wird nur das DDRB D2 getoggelt dann ist Sound nur dann zu hören, wenn der Buzzer zwischen Vcc und Pinn D2 läuft.

Einen Aufbau mit Transistor habe ich nicht erstellt/getestet. Die mageren 7 mA, die der Buzzer bei Aktivität zieht sollte ja den Controller noch nicht wirklich belasten. (ok, nur die grobe Schätzung per DMM - über den gesamten Stromverbrauch der Platine per DMM)

Peter(TOO)
03.02.2017, 17:27
Hallo Geier,
Wie man der Tabelle entnehmen kann ist im oberen Teil das Port als Gegentakt-Endstufe geschaltet.

In der unteren Hälfte hast du die OC-Variante, welche nur gegen Masse schaltet.
Allerdings stimmt dein Aufbau immer noch nicht mit dem Original überein. :-P

Also weiter im Text, Das schaffen wir!

Das kann man noch umkehren und nur gegen Vcc schalten, wenn man den Ausgang auf 1 schaltet, an Statt 0.
Dann kehrt sich die Tabelle um, also gegen GND hast du sound, gegen Vcc ist Ruhe.

Was jetzt bei deinem Versuch noch nicht berücksichtigt ist, ist der Pull-Up, welcher im ATmega eingebaut ist, den kann man auch noch an/abschalten und der liegt in der Grössenordnung von 50k, wenn ich das gerade richtig im Kopf habe.
Dieser liegt noch parallel zu deinem externen Widerstand.

Schwingkreise berechnen ist gar nicht nötig, RC-Berechnungen genügen.

Die Kapazität deines Piezo hast du mit 26nF angegeben, wobei sich diese mit Frequenz und Spannung ändern kann. Aber als Hausnummer kann man damit rechnen.

Frequenz ist 4kHz, also 250µs Perioden-Dauer.
eine Halbwelle sind also 125µs

Also rechnen wir mal:
Tau = R*C = 125µs

R = 125µs / 26nF = 125-6s / 26-9F = 4.8073 Ohm

So in etwa ist ein Kondensator nach 5*Tau geladen/entladen.

Theoretisch bringt dann ein Wiederstand von etwa 1k die grösste Spannung am Piezo.
Mit 5k hast du etwa 70% der maximalen Spannung, das wären akustisch aber nur -3dB, für's Ohr also praktisch gleich laut :-(
Ohne einen parallelen internen Pull-Up sollte aber ein hörbarer Unterschied zwischen 1k und 100k sein.

------------------

So, ich habe jetzt noch meine Faulheit überwunden und im Datenblatt nachgesehen:
http://www.atmel.com/Images/Atmel-42718-ATmega1284_Datasheet.pdf

Der Pull-Up hat 20-50k dieser liegt parallel zu deinem externen Widerstand.


Also, setze PDR auf 1 und hänge den Piezo gegen GND. Dann liegt der interne Pull-Up parallel zum Schalter und spielt keine grosse Rolle mehr.

Dann sollte ohne externen Widerstand annähernd nichts zu hören sein.

Figure 15-2, Seite 97 zeigt den Port-Aufbau.
In der Mitte ist der Tri-State Ausgangstreiber, dieser wird über das PDDR-Bit (oberstes Flip-Flop) Hochohmig/aktiv geschaltet.
Der Transistor oben links, schaltet den Pul-Up Ein/Aus.
Wie ich gerade sehe, lassen sich die Pull-Ups bei ATmega 1284 nur global für alle Ports über ein Bit schalten.

Ich kenne andere µC, da lassen sich die Pull-Ups per Port oder sogar per Pin einzeln schalten.
Könnte also Ärger geben, wenn du alle Pull-Ups abschaltest :-(
Da macht die Variante mit 1 im PDR keine Probleme.

MfG Peter(TOO)

- - - Aktualisiert - - -


Einen Aufbau mit Transistor habe ich nicht erstellt/getestet. Die mageren 7 mA, die der Buzzer bei Aktivität zieht sollte ja den Controller noch nicht wirklich belasten. (ok, nur die grobe Schätzung per DMM - über den gesamten Stromverbrauch der Platine per DMM)
Da ist natürlich noch eine kleine Falle versteckt.
Was du mit dem DMM misst ist das der durchschnittliche Strom.
Der kann theoretisch auch aus Stromspitzen von 1A bestehen.

Beim theoretischen laden eines idealen Kondensators ist die Stromspitze unendlich.

Praktisch wir er in deinem Fall durch den Ausgangstransistor des Ports begrenzt.
Mit einem Oszilloskop kann man das dann sehen, da liegt am Pin nicht wirklich eine Rechteckspannung an, Das ist dann mehr eine Trapezspannung.