Logo DASEJ

 

     
  Buzzer  
 

Omawiany buzzer nie posiada generatora i dlatego należy podać do niego sygnał około 3,5kHz.
Możemy to zrobić na dwa sposoby dodać układ elektroniczny który to zrobi bądź podać sygnał z procesora.

Generator na 555

link do wersji eagle

Poniżej wersja z wykorzystaniem sprzętowego generatora PWM w procesorze
AtMega328p,  AtMega644p na Timer0 wykorzystane wyjście z procesora OC0A.
Sygnał przez procesor jest stale generowany nie zajmując czasu procesora.
My jedynie odcinany go od portu lub go ponownie przyłączamy.
Oczywiście można to zrobić jeszcze inaczej. Metod jest wiele.

Zalecam między wyście procesora a buzzer wstawić rezystor około 100R.

/*/////////////////////////////////////////////////////////////

AVR Studio, programator AVR PROG MKII
Procesor Atmega644PA 16 MHz, +5V.

*//////////////////////////////////////////////////////////////



#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>


#if __AVR_ATmega328P__ == 1
#define led_SCK PB5
#endif

#if __AVR_ATmega644P__ == 1
#define led_SCK PB7
#endif

#define initSCK DDRB |= 1 << led_SCK ; /// SCK LED
#define ledON PORTB |= 1 << led_SCK; /// LED SCK
#define ledOFF PORTB &= ~(1 << led_SCK); /// LED SCK
#define ledNOT PORTB ^= 1 << led_SCK; /// LED SCK zmiana stanu na przeciwny


// deklaracja procedury
#define pauza(x) _delay_ms(x)


void initPWM0(void)
{       // ustawienia dla Atmega328  Atmega644
#if __AVR_ATmega644P__ == 1
        //DDRB |= (1<<PB4); // OC0B jako wyjście
        DDRB |= (1<<PB3); // OC0A jako wyjście
#endif

#if __AVR_ATmega328P__ == 1
         //DDRD |= (1<<PD5); // OC0B jako wyjście
         DDRD |= (1<<PD6); // OC0A jako wyjście
#endif

        TCCR0A //|= (1<<COM0B0) // sygnał pwm na wyjście, przełącz OC0B przy zrównaniu się rejestrów
                         |= (1<<COM0A0) // sygnał pwm na wyjście, przełącz OC0A przy zrównaniu się rejestrów
                         | (1<<WGM01); // fastPWM,
        TCCR0B |= (0<<CS02) |(1<<CS01) |(1<<CS00); // preskaler
        OCR0A = 0x26;
        // OCR0B = 0x26;
        TCCR0A &= ~(1<<COM0A0); // odłącz sygnał od pinu OC0A czyli PB3
        TCCR0A &= ~(1<<COM0B0); // odłącz sygnał od pinu OC0B czyli PB4
        // drugie wyjście na pin PB4 zablokowane
}

void beep(void)
{
         /* TCCR0A |= (1<<COM0B0);  // sygnał na drugim pinie
             pauza(80);
             TCCR0A &= ~(1<<COM0B0);
             pauza(80);
             TCCR0A |= (1<<COM0B0);
             pauza(80);
             TCCR0A &= ~(1<<COM0B0); */


         TCCR0A |= (1<<COM0A0);
         pauza(80);
         TCCR0A &= ~(1<<COM0A0);
         pauza(80);
         TCCR0A |= (1<<COM0A0);
         pauza(80);
         TCCR0A &= ~(1<<COM0A0);

}


int main(void)
{
           initSCK;
           initPWM0();
           while(1)
             {
                pauza(1000);
                ledNOT;
                beep();
              }
}


Przy innym zegarze procesora należy dostosować podział prescaler-a.
Poniższy kod został sprawdzony na tych modułach.

Pobierz kod