AVR Studio 6 - Piezo buzzer integriert, nun muss Spannung bzw Strom höher

Likeagenius

Cadet 2nd Year
Registriert
Feb. 2015
Beiträge
17
Hey,

ich habe zu meiner Letzten Schaltung nun einen Piezzo Buzzer mit integriert.
Dieser klingelt aber nur so leise das man es fast garnicht hört.

Wenn ich ihn direkt an die 3 V hänge is er gut hörbar.

Meine Schaltung ist immer noch die Selbe
bis auf das der Widerstand garnicht mehr existiert und die LED nun der Buzzer ist
schaltung.png

und mein Code ist:
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>
#define F_CPU 1000000LU
#include <util/delay.h>

#define isButtonPressed()	!(PINB & _BV(PB3))
#define buzzerON()			PORTB |= _BV(PB4)
#define buzzerOFF()			PORTB &= ~_BV(PB4)
#define buzzerTOGGLE()		PORTB ^= _BV(PB4)

enum uCState {
	STATE_MAIN = 0,
	STATE_WAIT = 1,
	STATE_BUZZ = 2
};

enum uCState currentState;

uint16_t _ovf_cnt = 0;

ISR(TIM0_OVF_vect)
{
	/* Overflow Zähler erhöhen */
	++_ovf_cnt;
}

void timer_reset(void)
{
	uint8_t oldSREG = SREG;
	/* Interrupts deaktivieren */
	cli();

	/* Timer zurück setzen */
	_ovf_cnt = 0;
	TCNT0 = 0;

	/* SREG wiederherstellen */
	SREG = oldSREG;
}

uint8_t timer_get(void)
{
	uint8_t oldSREG = SREG, scnds = 0;
	/* Interrupts deaktivieren */
	cli();

	/*
	1 Overflow	261120 uS
	_ovf_cnt	XXX S
	*/
	scnds = (_ovf_cnt / 1) * 261120E-6;

	/* SREG wiederherstellen */
	SREG = oldSREG;

	return scnds;
}

int main(void)
{
	// PB3 als EINGANG definieren
	// PB4 als AUSGANG definieren
	DDRB = _BV(PB4);
	/* Gesamter Port B auf 0 setzen ; interner Pull-UP Widerstand bei PB3 aktivieren */
	PORTB = _BV(PB3);
	
	/* Timer Konfigurieren */
	TCNT0 = 0;
	// Timer Overflow Interrupt zulassen
	TIMSK0 = 0b00000010;

	// Normaler Modus
	TCCR0A = 0b00000000;
	// Prescaler von 1024 einstellen
	TCCR0B = 0b00000101;
	
	#if 0
	/* ADC bei PB3 aktivieren */
	ADMUX = _BV(MUX0) | _BV(MUX1);
	ADCSRA = _BV(ADEN) | _BV(ADPS1) | _BV(ADPS0);
	
	/*
		255 / 3 = 85
		
		0-85 = RANDOM 1
		85-170 = RANDOM 2
		170-255 = RANDOM 3
	*/
	
	for (;;) {
		/* ADC Wert auslesen */
		// Messung starten
		ADCSRA |= _BV(ADSC);
	
		// Warten bis fertig
		while (ADCSRA & _BV(ADSC));
	
		// Wert speichern
		adcValue = ADCH;
		
		buzzerON();
		_delay_ms(500);
		uint8_t rCase = adcValue / 3;
		/*
		switch (rCase) {
			case 0: _delay_ms(1000); break;
			case 1: _delay_ms(2000); break;
			case 3: _delay_ms(3000); break;
			default: _delay_ms(500);
		}*/

		buzzerOFF();
	}
	#endif
	
	/* Globale Interrupts erlauben */
	sei();

	/* Zustand ist MAIN */
	currentState = STATE_MAIN;

	/* Endlos Schleife */
	while (1) {
		switch (currentState) {
			case STATE_MAIN: {
				/* Warten bis der Taster an PB3 gedrückt wurde */
				if (isButtonPressed()) {
					currentState = STATE_WAIT;
					/* Timer zurücksetzen */
					timer_reset();
				}
			} break;

			case STATE_WAIT: {
				/* Warten bis 2 Min. und 20 Sek. verstrichen sind */
				if (timer_get() >= 5) {
					/* State wechseln */
					currentState = STATE_BUZZ;
					/* Timer zurücksetzen */
					timer_reset();
				}
			} break;

			case STATE_BUZZ: {
				/* Buzzer anstellen */
				buzzerON();
				/* Warten bis 3 bis 5 Sekunden verstrichen sind */
				if (timer_get() >= 3) {
					/* Buzzer ausstellen */
					buzzerOFF();
					/* Ins MAIN zurückspringen */
					currentState = STATE_MAIN;
				}
			} break;
		}
	}
}


Wie kann ich hier jetzt den Widerstand runter schrauben? so das der Buzzer lauter ist?
Ich habe keinen Hardware Widerstand dran.

Das ist mein Buzzer:
http://www.conrad.de/ce/de/product/...raeusch-Entwicklung-83-dB-2-5-VDC-Inhalt-1-St
 
Zuletzt bearbeitet:
Ohne Ahnung von dem Controller zu haben, sieht es für mich so aus, als wäre der Strom am Ausgang durch eine interne Schutzschaltung des Controllers begrenzt. Sprich, der Buzzer benötigt mehr Strom als er bekommt.

Bleibt nur die Option, mit dem Ausgang 4 ein Relay zu schalten, welches dem Buzzer dann "direkt" die 3 Volt mit "quasi unbegrenzter Leistung" zur Verfügung stellt.
 
Ich nehme an, dass der rote Punkt der Buzzer ist. Dann hast du den Buzzer parallel zu Controller geschalten und der Strom teilt sich zwischen Buzzer und µC auf. Falls die Ports vom µC dem Strom erlauben kannst du den Buzzer zwischen Port und GND hängen. Sonst brauchst du einen Transistor als schalter oder ein Relais.
 
Okay, also das mit dem Transistor hört sich doch mal schön an :D Aber ich habe leider nur den hier gerade da.. http://www.reichelt.de/BC-Transisto...ACTION=3&GROUPID=2881&ARTICLE=4981&OFFSET=16& und müsste bzw wollte eigentlich heute Fertig werden.. Der Transistor klappt zwar perfekt, allerdings umgekehrt.. Das heißt der Buzzer Piept durchgehen, außer wenn der Schalter Schaltet.. xD
Also müsste ich eigentlich das Signal umkehren, dann klappt das. :D

Vielen dank :)

Und das hatte ich vergessen.. ich hab nen ATTiny13A ^^
 
Die Schaltung müsste so ausschauen:
Vdd und GND vom µC direkt an die Batterie/Spannungsregler.
LED: 1.Port >> Vorwiderstand >> LED >> GND
Buzzer (mit dem oben genannten PNP Transistor): 2.Port >> Basis Tr.
Vdd >> Collector Tr.
Emitter Tr. >> Buzzer >> GND

Buzzer ein = Low-Pegel am Port
 
Zuletzt bearbeitet:
Zurück
Oben