AVR und Piezo Buzzer

#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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren