- LiFePO4 Speicher Test         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 20 von 20

Thema: Buzzer mit PWM über Transistor

  1. #11
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo Geier,
    Zitat Zitat von oberallgeier Beitrag anzeigen
    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)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  2. #12
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.652
    .. 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.
    Ciao sagt der JoeamBerg

  3. #13
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    348
    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.

  4. #14
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Hallo,
    Zitat Zitat von demmy Beitrag anzeigen
    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.

    [QUOTE=demmy;634828] 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.

    Zitat Zitat von demmy Beitrag anzeigen
    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)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  5. #15
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.652
    Zitat Zitat von Peter(TOO) Beitrag anzeigen
    .. 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 ?

    Code:
    ...
    // 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;  //
      }
    // - - - - - - - - - - - - - - - - - - -
    ...
    Ciao sagt der JoeamBerg

  6. #16
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    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)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  7. #17
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.652
    Zitat Zitat von Peter(TOO) Beitrag anzeigen
    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 ? ? ? ?
    Ciao sagt der JoeamBerg

  8. #18
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    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)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  9. #19
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.652
    Zitat Zitat von Peter(TOO) Beitrag anzeigen
    Was ist mit dem Widerstand .. Piezo .. gegen +5V oder gegen Masse? .. was ToggleBit() im Detail macht
    Hallo 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.

    ......Bild hier  
    ......© 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)
    Ciao sagt der JoeamBerg

  10. #20
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    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-42..._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 - - -

    Zitat Zitat von oberallgeier Beitrag anzeigen
    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.
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Selbsthaltung über Transistor
    Von blondie im Forum Elektronik
    Antworten: 10
    Letzter Beitrag: 17.04.2014, 17:15
  2. Motor über Transistor schalten
    Von andyrhoads im Forum Motoren
    Antworten: 19
    Letzter Beitrag: 26.02.2013, 17:09
  3. Buzzer für Silvesterparty
    Von EscoR im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 22.12.2012, 08:47
  4. Anschluss meherer LED´s über Transistor
    Von pmaler im Forum Elektronik
    Antworten: 10
    Letzter Beitrag: 22.03.2008, 19:43
  5. IR-Sendediode nur über Transistor an µc?
    Von Goblin im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 13.02.2006, 13:24

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress