AVR und Piezo Buzzer

OP #7761256
Lesenswert?
• ▲
▼

Hallo zusammen,

das Alarmsignal soll zuerst sehr leise ertönen und dann, wenn nicht quittiert wird, schon lauter.

Ich habe jetzt alles, was nicht zum Thema gehört, aus dem Code entfernt und ihn hoffentlich so weit wie möglich reduziert. Selbst das Quittieren/Ausschalten steht jetzt nicht im Code. Die beigefügte selbsterklärende Audiodatei soll die spärlichen Annotationen kompensieren. Allerdings würde ich gerne jemanden bitten, den Code kostenlos zu überprüfen, vielleicht kann er noch kompakter gemacht werden. Es ist nicht dringend, es kann warten.

1
#include <avr/io.h>
2

3
int main(void)
4
{
5
  uint8_t i = 0;                  // timer (0, 50ms, 100ms, 150ms...)
6
  uint8_t j = 0;                  // counter (0...6: signal, 6...18: pause)
7
  uint8_t k = 0;                  // signal counter
8
  const uint16_t p1 = 253;        // TCD value 1 (tone 1)
9
  const uint16_t p2 = 235;        // TCD value 2 (tone 2)
10
  uint16_t s1 = p1 - 10;          // pulse start value (tone 1)
11
  uint16_t s2 = p2 - 10;          // pulse start value (tone 2)
12

13
  _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, CLKCTRL_PDIV_10X_gc | CLKCTRL_PEN_bm); // 2 MHz main clock
14

15
  _PROTECTED_WRITE(TCD0.FAULTCTRL, TCD_CMPAEN_bm | TCD_CMPBEN_bm);
16
  TCD0.CTRLB = TCD_WGMODE_TWORAMP_gc;                     // two ramp mode
17
  TCD0.CTRLC = TCD_FIFTY_bm | TCD_AUPDATE_bm;             // symmetrical, automatically update
18
  TCD0.CMPBSET = s1;                                      // pulse start value (tone 1)
19
  TCD0.CMPBCLR = p1;                                      // tone 1
20
  while(!(TCD0.STATUS & TCD_ENRDY_bm)){}                  // ensure ENRDY bit is set
21
  TCD0.CTRLA = TCD_CLKSEL_SYSCLK_gc | TCD_ENABLE_bm;      // select clock, enable TCD
22

23
  TCB0.CCMP = 0xC34F;                                     // timeout value (50ms @ 1MHz TCB clock)
24
  TCB0.CTRLA = TCB_CLKSEL_CLKDIV2_gc | TCB_ENABLE_bm;     // 1MHz TCB clock, enable TCB
25

26
  while(1)
27
  {
28
    if(TCB0.INTFLAGS)
29
    {
30
      TCB0.INTFLAGS = TCB_CAPT_bm;              // clear the interrupt flag
31
      i++;
32
      if(i == 2)                                // 100ms
33
      {
34
        TCD0.CMPBSET = s2;                      // pulse start 2
35
        TCD0.CMPBCLR = p2;                      // tone 2
36
      }
37
      else if(i == 4)                           // 200ms
38
      {
39
        TCD0.CMPBSET = s1;                      // pulse start 1
40
        TCD0.CMPBCLR = p1;                      // tone 1
41
        i = 0;
42
        j++;
43
        if(j == 6)                              // after 6*(100ms tone 1 + 100ms tone 2)
44
        {
45
          TCD0.CTRLE = TCD_DISEOC_bm;           // pause
46
          k++;
47
          if(k == 4)                            // after 4 times "quiet"
48
          {
49
            s1 = 0;                             // switch to "loud"
50
            s2 = 0;                             // switch to "loud"
51
          }
52
          else if(k == 10)                      // after 6 times "loud"
53
          {
54
            TCB0.CTRLA = 0;                     // stop
55
          }
56
        }
57
        else if(j == 18)                                       // end of pause
58
        {
59
          while(!(TCD0.STATUS & TCD_ENRDY_bm)){}               // ensure ENRDY bit is set
60
          TCD0.CTRLA = TCD_CLKSEL_SYSCLK_gc | TCD_ENABLE_bm;   // enable again
61
          j = 0;
62
        }
63
      }
64
    }
65
  }
66
}
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #7761342
Lesenswert?
• ▲
▼

Walter T. schrieb:

Ich habe nicht verstanden, wie das mit dem leiser und lauter funktionieren soll.

  1. Wenn du ihn gar nicht ansteuerst, dann ist er ganz leise.
  2. Wenn du ihn mit 50/50 im Gegentakt ansteuerst, dann ist er am lautesten.

Und mit passender Ansteuerung kannst du jetzt die Bereiche dazwischen erreichen. Obacht: die Lautstärke verhält sich nicht proportional zum TV.

Marcel V. schrieb:

man haut gleichzeitig kräftig mit der Faust auf die Tischplatte, dann rappelt's und rummst es aber ganz schön ordentlich im Karton!

Ich hab mal ausproiert, einen µC mit so einem Ding zu versorgen. Fazit: funktioniert nicht. Und hohe Spannungen/Energien egeben sich nur bei Piezo-Stacks:

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.