Forum: Mikrocontroller und Digitale Elektronik AVR und Piezo Buzzer


von Georg M. (g_m)



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
}

von Sebastian R. (sebastian_r569)


Lesenswert?

Georg M. schrieb:
> 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.

Wenn er funktioniert, für dich verständlich und wartbar ist und die für 
dich wichtigen Anforderungen erfüllt, muss er dann wirklich kompakter 
werden?

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Georg M. schrieb:
> vielleicht kann er noch kompakter gemacht werden.

Lass das lieber sein. Damit riskierst du nur, dass er schlechter 
lesbar/wartbar wird.

von Al. K. (alterknacker)


Lesenswert?

Wenn das Pizoteil direkt angeschlossen wird, können im spannungslosen
Zustand hohe Spannungen am Pizo entstehen.(klopfen auf das Gehäuse)

Kann das den IC zerstören?

MfG
alterknacker

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Al. K. schrieb:
> Kann das den IC zerstören?

Unwahrscheinlich. Die Spannung wir von den internen ESD Schutzdioden auf 
die VCC/GND Pins abgeleitet, wo sich eine Batterie oder wenigstens ein 
Kondensator befinden sollte, der die Energie aufnimmt.

von Rainer W. (rawi)


Lesenswert?

Al. K. schrieb:
> Wenn das Pizoteil direkt angeschlossen wird, können im spannungslosen
> Zustand hohe Spannungen am Pizo entstehen.

Dafür ist die Quellimpedanz viel zu hoch.

von Walter T. (nicolas)


Lesenswert?

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

von Marcel V. (mavin)


Lesenswert?

Rainer W. schrieb:
> Dafür ist die Quellimpedanz viel zu hoch.

Normalerweise ja, aber gesetzt den Fall, der AVR wird direkt nach dem 
Einschalten gebootet und man haut gleichzeitig kräftig mit der Faust auf 
die Tischplatte, dann rappelt's und rummst es aber ganz schön ordentlich 
im Karton!

👊💥⚡

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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:
- https://www.sciencedirect.com/science/article/pii/S2590174522000824

von Marcel V. (mavin)


Lesenswert?

Lothar M. schrieb:
> Und hohe Spannungen/Energien egeben sich nur bei Piezo-Stacks:

Was ich damit sagen wollte ist, dass die Eingangsimpedanz im Bootmodus 
ebenfalls hoch ist, so dass die Spannung im Erschütterungsfall gegen 
Unendlich ansteigen kann. Abhilfe schafft ein 4k7 Widerstand parallel 
zum Piezzo!

von Walter T. (nicolas)


Lesenswert?

Lothar M. schrieb:
> Und mit passender Ansteuerung kannst du jetzt die Bereiche dazwischen
> erreichen.

Das muss ich heute abend mal ausprobieren. Bislang ging ich davon aus, 
dass bei den zig Nanofarad der Tastgrad/DC-Offset fast keinerlei 
Auswirkungen auf die Lautstärke hat.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Marcel V. schrieb:
> Was ich damit sagen wollte ist, dass die Eingangsimpedanz im Bootmodus
> ebenfalls hoch ist
Die Eingangsimpedanz des Pins wird wegen der Schutzdioden "automatisch" 
niedrig, sobald Vcc+0,3V oder GND-0,3V erreicht werden. Denn die 
Schutzdioden sind auch bei hochohmigem Ein- und Ausgängen wirksam.

: Bearbeitet durch Moderator
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.