Skocz do zawartości

Piezo buzzer bez generatora - najprostsza rzecz pod słońcem...


pmochocki

Pomocna odpowiedź

Chciałem użyć buzzera w swoim nowym projekcie. Ogólnie chciałbym projekt zasilać z pastylki CR2032, więc postanowiłem zbadać użycie prądu przez buzzer.

Do eksperymentów użyłem ATTiny3224 zasilane 3V i taktowane wewnętrznym zegarem 5MHz i buzzer PS1240P02CT3

image.thumb.png.49dfa92ec5c4cc5fb9313b719bdbdf36.png

Zwykła funkcja tone 4kHz z Arduino była bardzo cicha - co zresztą jest oczekiwane przy zasilaniu 3V.

Ustawiłem więc timmer TCA aby generował taki sygnał

image.thumb.png.1ada7dcd5fe20e81635a9ffac87068a4.png

i przestawiłem ATTiny w standby. Czyli buzzer zamiast być sterowany napięciem 3V jest sterowany napięciem 6V. 

#include <avr/sleep.h>

#ifdef MILLIS_USE_TIMERA0
  #error "This sketch takes over TCA0 - please use a different timer for millis"
#endif

#ifndef MILLIS_USE_TIMERB0
  #error "This sketch is written for use with TCB0 as the millis timing source"
#endif

void TCA0Setup()
{
  TCA0.SINGLE.CMP0 = 625;  /* Compare Register 0: 4kHz - 21.3.3.4.2 Frequency (FRQ) Waveform Generation*/
  TCA0.SINGLE.CMP1 = 625;  /* Compare Register 1: offset 0 by CMP1 == CMP0 See: */
  // TCA0.SINGLE.CMP2 = 0x0; /* Compare Register 2: 0x0 */
  // TCA0.SINGLE.CNT = 0x0; /* Count: 0x0 */

  TCA0.SINGLE.CTRLB = 0 << TCA_SINGLE_ALUPD_bp    /* Auto Lock Update: disabled */
                      | 1 << TCA_SINGLE_CMP0EN_bp /* Compare 0 Enable: enabled */
                      | 1 << TCA_SINGLE_CMP1EN_bp /* Compare 1 Enable: enabled */
                      | 0 << TCA_SINGLE_CMP2EN_bp /* Compare 2 Enable: disabled */
                      | TCA_SINGLE_WGMODE_FRQ_gc; /*  */

  // TCA0.SINGLE.CTRLC = 0 << TCA_SINGLE_CMP0OV_bp /* Compare 0 Waveform Output Value: disabled */
  //     | 0 << TCA_SINGLE_CMP1OV_bp /* Compare 1 Waveform Output Value: disabled */
  //     | 0 << TCA_SINGLE_CMP2OV_bp; /* Compare 2 Waveform Output Value: disabled */

  // TCA0.SINGLE.DBGCTRL = 0 << TCA_SINGLE_DBGRUN_bp; /* Debug Run: disabled */

  TCA0.SINGLE.EVCTRL = 0 << TCA_SINGLE_CNTAEI_bp          /* Count on Event Input A: disabled */
                       | 0 << TCA_SINGLE_CNTBEI_bp        /* Count on Event Input B: disabled */
                       | TCA_SINGLE_EVACTA_CNT_POSEDGE_gc /* Count on positive edge event */
                       | TCA_SINGLE_EVACTB_UPDOWN_gc;     /* Count on prescaled clock. Event controls count direction.
                                                             Up-count when event line is 0, down-count when event line
                                                             is 1. */

  // TCA0.SINGLE.INTCTRL = 0 << TCA_SINGLE_CMP0_bp /* Compare 0 Interrupt: disabled */
  //     | 0 << TCA_SINGLE_CMP1_bp /* Compare 1 Interrupt: disabled */
  //     | 0 << TCA_SINGLE_CMP2_bp /* Compare 2 Interrupt: disabled */
  //     | 0 << TCA_SINGLE_OVF_bp; /* Overflow Interrupt: disabled */

  // TCA0.SINGLE.PER = 0xffff; /* Period: 0xffff */

  TCA0.SINGLE.CTRLA = TCA_SINGLE_CLKSEL_DIV1_gc      /* System Clock */
                      | 1 << TCA_SINGLE_ENABLE_bp    /* Module Enable: enabled */
                      | 1 << TCA_SINGLE_RUNSTDBY_bp; /* Run Standby: enabled */
  
  PORTB.DIRSET = PIN0_bm | PIN1_bm; // Set B0 and B1 as outputs
  PORTB.PIN1CTRL = PORT_INVEN_bm;   // Invert B1 - 21.3.3.4.5 Port Override for Waveform Generation
}

void SleepSetup() {
  set_sleep_mode(SLEEP_MODE_STANDBY);
  sleep_enable();
}

void setup() {
    // Don't leave unused pins floating
  for( int i = 0; i <= 10; i++ ) {
    pinMode(i, INPUT_PULLUP);
  }
  
  takeOverTCA0();   // Need to take over the TCA0 form mgaTinyCore - check: https://github.com/SpenceKonde/megaTinyCore/blob/master/megaavr/extras/TakingOverTCA0.md
  TCA0Setup();      // It will set the Set B0 and B1 as outputs
  SleepSetup();
}

void loop() {
  sleep_cpu();
}

Bez piezo pobór prądu to:
AVG: 0.8 mA
MAX: 0.9 mA

Już to wygląda słabo - dla baterii CR2032 Duracell Standard Continuoues Discharge Current to tylko 0.3 mA

image.thumb.png.58b49599b35e9a532590e28b44704e51.png

Jak to wygląda jak podłączymy brzęczyk? Jest dużo głośniej niż przy sterowaniu tylko jednym pinem. A pobór prądu:
AVG: 2.5 mA
MAX: 9.6 mA

Upsss - wyszło dość dużo.

A co gdyby zastosować wyspecjalizowany układ, który został stworzony do sterowania piezo? Na przykład taki: PAM8904.

image.thumb.png.6bd983e5c932db02d74fd6cbfa83ade4.png

Gdy ustawimy Charge Pump na x1 mamy:
AVG: 1.2 mA
MAX: 3.5 mA

Czy ktoś rozumie skąd taka różnica w stosunku do sterowania tylko z ATTiny? Średni pobór prądu jest o połowę mniejszy. Nie mam pojęcia z czego to wynika. Spodziewałem się podobnego wyniku jak przy sterowaniu ATTiny bezpośrednio.

A co gdy ustawimy Charge Pump na x3? Wtedy dźwięk z tego małego brzęczyka kosi uczy, a całość zmienia się w prądożercą bestię:
AVG: 7 mA
MAX: 16.7 mA

Należy może dodać, że zrobiłem eksperyment, jak by wyglądała sytuacja gdyby ATTiny zamiast w stan Standby zostawiać w stanie PowerDown i budzić w odpowiednim czasie (co 4 cykle zegara 32.768 kHz) używając wewnętrznego RTC.

#include <avr/sleep.h>
#include <avr/io.h>
#include <avr/interrupt.h>

// Arduino pins
const int SW_PWM_0 = 7;   // PB0 pin
const int SW_PWM_1 = 6;   // PB1 pin

void SleepSetup() {
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
}

void RTCSetup() {

  /* Initialize RTC: */
  while (RTC.STATUS > 0) {
    ; /* Wait for all register to be synchronized */
  }

  /* 32.768kHz Internal Crystal Oscillator (XOSC32K) */
  RTC.CLKSEL = RTC_CLKSEL_INT32K_gc;

  /* Run in debug: enabled */
  RTC.DBGCTRL = RTC_DBGRUN_bm;
  
  RTC.PITINTCTRL = RTC_PI_bm; /* Periodic Interrupt: enabled */
  
  RTC.PITCTRLA = RTC_PERIOD_CYC4_gc /* RTC Clock Cycles 4 */
         | RTC_PITEN_bm; /* Enable: enabled */
}

// Interrupt
ISR(RTC_PIT_vect) {
  RTC.PITINTFLAGS = RTC_PI_bm; 
  digitalWrite(SW_PWM_0, !digitalRead(SW_PWM_0));
  digitalWrite(SW_PWM_1, !digitalRead(SW_PWM_1));
}

void setup() {
  // Don't leave unused pins floating
  for( int i = 0; i <= 10; i++ ) {
    pinMode(i, INPUT_PULLUP);
  }
  pinMode(SW_PWM_0, OUTPUT);
  pinMode(SW_PWM_1, OUTPUT);
  digitalWrite(SW_PWM_0, LOW);
  digitalWrite(SW_PWM_1, HIGH);
  SleepSetup();
  RTCSetup();
}

void loop() {
  sleep_cpu();
}

Więc od strony sygnału wygląda to beznadziejnie:

image.thumb.png.42dba1893a450b591a9d22db8d41643d.png

Mamy opóźnienie między sygnałami wynoszące prawie 15us. A pod względem poboru prądu bez podłączonego buzzera mamy:
AVG: 3.2 mA
MAX: 14.6 mA

Czyli istna tragedia - widać, że nie tędy droga.

Podsumowująca tabelka:

                                     AVG          MAX
ATTiny Standby TCA0 bez buzzera     0.8 mA       0.9 mA
ATTiny Standby TCA0 z buzzerem      2.5 mA       9.6 mA
ATTiny Standby TCA0 z PAM8904 x1    1.2 mA       3.5 mA
ATTiny Standby TCA0 z PAM8904 x3    7.0 mA      16.7 mA
ATTiny PowerDown RTC bez buzzera    3.2 mA      14.6 mA

Podsumowujący komentarz:

Największym zaskoczeniem jest to, że PAM8904 za pompą ustawioną na x1 pobiera o połowę mniej prądu niż gdy jest w ten sam sposób sterowany bezpośrednio z ATTiny. Czy poziom dźwięku jest różny w tych dwóch przypadkach był różny? Trudno mi to stwierdzić. Jeśli ktoś potrafi wyjaśnić dlaczego ten układ pobiera mniej prądu sterując buzzerem w porównaniu do sterowania bezpośrednio ATTiny - byłbym wdzięczny...

Układ PAM8904 jest w obudowie QFN16 0.5mm - jest to przekleństwo jeśli chodzi o lutowanie, ale błogosławieństwo jeśli chodzi o zajętość miejsca. Gdybym miał inne zasilanie niż bateria CR2032 używałbym go w ciemno do sterowania piezo buzzera.

Jak widać PoweDown nie zawsze jest lepszy od Standby 🙂

W moim projekcie w ostateczności mogę użyć PAM8904 z Charge Pump x1. Jednak planuję spędzić trochę czasu i zbadać czy stosując indukcyjność i obwód LC nie można by znacznie zejść z prądem, bo można by energię magazynować w indukcyjności. Widomo koszt w postaci dodatkowych elementów na płytce, ale chyba warto temat zbadać.

Pytania:

Ktoś podpowie jak taki sygnał:

image.thumb.png.1ada7dcd5fe20e81635a9ffac87068a4.png

uzyskać na STM32L476RG zużywając jak najmniej prądu? Tak z ciekawości chciałem porównać do ATTiny, ale moje doświadczenie z STM32 jest mierne.

Może ktoś ma doświadczenie ze sterowaniem buzzerem piezo aby minimalizować użycie prądu?

 

 

 

 

Edytowano przez pmochocki
  • Lubię! 1
Link do komentarza
Share on other sites

Ciekawa sprawa, buzzer trzeba potraktować jako kondensator który musi być szybko przeładowany z jednego poziomu do drugiego, ciekaw jestem jak to wygląda na oscyloskopie gdyż analizator nigdy nie odda subtelności sygnału.

EDIT: próbowałbym z układem rezonansowym garść informacji: https://edw.elportal.pl/pdf/k01/21_17.pdf

EDIT2: Spróbuj zastosować czasy martwe pomiędzy przełączeniami wyjścia

Edytowano przez _LM_
  • Pomogłeś! 1
Link do komentarza
Share on other sites

11 minut temu, _LM_ napisał:

Ciekawa sprawa, buzzer trzeba potraktować jako kondensator który musi być szybko przeładowany z jednego poziomu do drugiego, ciekaw jestem jak to wygląda na oscyloskopie gdyż analizator nigdy nie odda subtelności sygnału.

Tak oscyloskop będzie jeszcze podłączany. Jednak na razie nie jestem w ogóle zadowolony z poboru prądu więc rozpocznę analizę obwodu LC, a tu osculoskop też będzie niezbędny.

14 minut temu, _LM_ napisał:

EDIT: próbowałbym z układem rezonansowym garść informacji: https://edw.elportal.pl/pdf/k01/21_17.pdf

Dzięki dokładnie takich informacji szukam. O czymś takim właśnie myślałem:

image.thumb.png.75a3cff9244ac52fc77681cac9c1ca0c.png

15 minut temu, _LM_ napisał:

EDIT2: Spróbuj zastosować czasy martwe pomiędzy przełączeniami wyjścia

Nie rozumiem? Co znaczy martwe czasy? @_LM_ możesz rozwinąć tą myśl?

Link do komentarza
Share on other sites

Źle to napisałem 😉 chodzi o to że pomiędzy kolejnymi zmianami stanu dać trochę przerwy, czyli sterować mniej więcej takim sygnałem:

IMG_20230102_215230.thumb.jpg.93fbc0b5a113145569e2b41b5fca8828.jpg

Edytowano przez _LM_
  • Lubię! 2
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

1 godzinę temu, _LM_ napisał:

EDIT: próbowałbym z układem rezonansowym garść informacji: https://edw.elportal.pl/pdf/k01/21_17.pdf

Przeczytałem i powali się obawiam, że wpadam w pułapkę odkrywania koła na nowo. Chcąc uzyskać coś lepszego niż zwykły buzzer z generatorem:

image.thumb.png.60b119db2d9d762cc6f47908769a86a4.png

dochodzę do wniosku, że to wcale nie jest takie złe rozwiązanie - muszę zbadać pobór prądu takiego najprostszego buzzera z generatorem.

Jak chciałbym coś głośniejszego chyba powinienem iść w tym kierunku:

image.thumb.png.0bf846545120df5e2ea44b8868b7160f.png

image.thumb.png.93645ec3a654ea4b31f6177f22a22186.png

Niestety nigdy nie zajmowałem się autotransformatorem. Ktoś z was ma może doświadczenie? 

 

  • Lubię! 1
Link do komentarza
Share on other sites

 

Udało się załatwić indukcyjności do eksperymentów. Aby z tym piezo buzzerem uzyskać częstotlowiść~4kHz musiałem zastosować 100mH.

image.thumb.png.5650c88de2eb6f18b5c746429ea17880.png

Przy zasilaniu 3V napięcie na buzzerze osiągało 18V. Głośność porównywalna z zastosowaniem PAM8904 z pompą ustawioną na x3. Jednakże zużycie prądu imponujące:
AVG: 1.5 mA
MAX: 3.5 mA

Zastosowana indukcyjność ma rezystancję 490Ω to powoduje, że oscylacje dość szybko się tłumią. Jednak planuje eksperyment z pobudzaniem układu tylko 1/2 częstotliwości rezonansowej. Powinno to zmniejszyć znacząco złużycie prądu. Jak to wpłynie na głośność - jeszcze nie wiem. Problem z tymi eksperymentami jest taki, że jak mogę do tego usiąść to dzieci śpią i wtedy zabawa buzzerem to nie najlepszy pomysł. 

Muszę kupić jeszcze kilka modelów buzzerów. Ponadto jeszcze eksperymenty jak strojenie częstotliwości rezonansowej dodatkowym kondensatorem C2 wpływa na głośność. 

image.thumb.png.8843bf67761a4c82fcd707add6e4669c.png

Może dałoby się zajść z indukcyjnością do jakiś sensownych rozmiarów.

Zrobiłem też eksperymenty z piezo z wbudowanym generatorem. Trzeba przyznać, że jest głośniejszy, ale zużycie prądu to jakiś dramat:
AVG: 29.5 mA
MAX: 56.5 mA

Podsumowująca tabelka:

                                             AVG          MAX
ATTiny Standby TCA0 bez buzzera             0.8 mA       0.9 mA
ATTiny Standby TCA0 z buzzerem              2.5 mA       9.6 mA
ATTiny Standby TCA0 z PAM8904 x1            1.2 mA       3.5 mA
ATTiny Standby TCA0 z PAM8904 x2            4.6 mA      12.6 mA
ATTiny Standby TCA0 z PAM8904 x3            7.0 mA      16.7 mA
ATTiny Standby TCA0 z indukcyjnością 100mH  1.5 mA       3.5 mA
Buzzer 3V z generatorem                    29.5 mA      56.5 mA

 

Link do komentarza
Share on other sites

Zastanawia mnie sens i cel stosowania C1. Dlaczego nie włączyłeś buzzera równolegle z cewką? 

35 minut temu, pmochocki napisał:

mogę do tego usiąść to dzieci śpią

Wziąłbym pojemność odpowiadającej pojemności przetwornika i stroił na największą amplitudę Vpp. Do wstępnych testów kondensator zamiast piezzo powinien wystarczyć 

EDIT: Część energii z cewki zapewne przebija złącze CE tranzystora i idzie w ciepło

EDIT2: Znalazłem buzzerek jego pojemność to 12nF innych parametrów nie znam, leżał w szpejach. 

Edytowano przez _LM_
Link do komentarza
Share on other sites

(edytowany)
27 minut temu, _LM_ napisał:

Zastanawia mnie sens i cel stosowania C1. Dlaczego nie włączyłeś buzzera równolegle z cewką? 

C1 wynika właśnie z faktu, że nie połączyłem buzzera równolegle z cewką. Buzzer nie lubi składowej stałej, która w tym układzie się pojawia. C1 ma zniwelować ten efekt. 

W tym układzie uzyskiwałem większą amplitudę niż przy połączeniu równoległym. Jednak eksperymenty muszę jeszcze powtórzyć, bo może to tylko błąd pomiaru.

27 minut temu, _LM_ napisał:

Wziąłbym pojemność odpowiadającej pojemności przetwornika i stroił na największą amplitudę Vpp. Do wstępnych testów kondensator zamiast piezzo powinien wystarczyć 

Do wstępnych testów jak najbardziej. Ale jak się spojrzy na oscyloskop to jednak widać, że piezo to tylko w przybliżeniu pojemność. Jak stosowałem kondensator to przebieg był bardziej gładki i przy jednokrotnym pobudzeniu kolejne oscylacje dokładnie o tej samej częstotliwości i malejące zgodnie z teorią. Przy przetworniku piezo już tak nie było.

Więc tak dużo można sprawdzić stosując kondensator, ale potem i tak trzeba jeszcze raz upewnić się jak to wygląda jak się dołączy piezo.  

Edytowano przez pmochocki
Link do komentarza
Share on other sites

@pmochocki A może by tak pójść nieco inną drogą? Nie wiem ile tam pinów zostało w twoim mikrokontrolerze, dla testów zrobić przetwornicę podwyższającą a potem z tego napięcia kluczować piezzo? Na dzień dobry odpadnie problem rezonansu, bo wychodzi na to że trzeba będzie cewek o dużej indukcyjności i rozmiarach aby uzyskać zadowalający efekt.

  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)
10 godzin temu, _LM_ napisał:

dla testów zrobić przetwornicę podwyższającą a potem z tego napięcia kluczować piezzo?

Myślałem o czymś takim: PAM8907 . Pewnie sobie kupię dla testów, ale podejrzewam, że będzie głośne, jednak prądożercę.

10 godzin temu, _LM_ napisał:

Na dzień dobry odpadnie problem rezonansu, bo wychodzi na to że trzeba będzie cewek o dużej indukcyjności i rozmiarach aby uzyskać zadowalający efekt.

No tak, ale z drugiej strony to właśnie rezonans powoduje, że "za darmo", przeładowuję się piezo. Więc pod względem minimalizowania ilości prądu to w teorii wydaje się najlepsze rozwiązanie. Bo nawet jak podbijasz napięcie to w sumie zwierasz potem wszystko do masy. W rozwiązaniu z tranzystorem i cewką jest inaczej, wyłączasz tranzystor i przeładowanie w drugą stronę masz za "free".

Spójrz na to porównanie:

                                             AVG          MAX
ATTiny Standby TCA0 bez buzzera             0.8 mA       0.9 mA
ATTiny Standby TCA0 z indukcyjnością 100mH  1.5 mA       3.5 mA
Buzzer 3V z generatorem                    29.5 mA      56.5 mA

Przy zastosowaniu cewki mamy średni prąd 1.5mA, z czego ponad połowa to sam ATTiny.

Ale nie ma się co zamykać na pomysły. Wszystkie uwagi są mile widziane.

Edytowano przez pmochocki
  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.