This is an old revision of the document!


 

Heligeneraator

Teooria

Kodulabor II buzzer
Kodulabor III kõlar koos võimendiga

Taimerite üheks praktiliseks rakenduseks on heligeneraatori juhtimine. Heligeneraator on tihti kasutusel juhtpaneelides, alarmseadmetes ja mujal nupuvajutuste või signaalhelide kuuldavaks toomiseks. Sellist heligeneraatorit kutsutakse tihti lihtsalt kõlariks, piiksujaks, või siis buzzeriks, mis on üle võetud inglise keelest. Tööpõhimõttelt võib buzzerid jagada kaheks piesoelektrilisteks ja elektromagnetilisteks.

Piesoelektriline buzzer koosneb metallplaadist ja sellele kinnitatud piesokeraamilisest materjalist elemendist. Piesokeraamiline element muudab vastavalt pinge suurusele oma mõõtmeid. Selle tagajärjel metallplaat paindub. Rakendades buzzerile nelikantsignaali või vahelduvvoolu tekib võnkumine ehk heli.

Elektromagnetiline buzzer sarnaneb oma tööpõhimõttelt valjuhääldile. Ka siin on magnetväljas pool, mille kohale on paigutatud metallist membraan. Kui lasta helisageduslik vool läbi pooli, hakkab membraan tekkiva magnetvälja ja püsimagneti välja koosmõjul liikuma. Analoogselt piesoelektrilise buzzeriga tekib heli.

Üldiselt on piesoelektrilised buzzerid võrdluses elektromagnetilistega suurema helirõhu, väiksema voolutarbe ja kõrgema võimaliku helisagedusega. Kõige tugevama heli kõige väiksema voolutugevuse korral saab siis, kui buzzer töötab oma resonantssagedusel. Sellisel juhul on membraani amplituud kõige suurem.

Praktika Kodulabor III generatsiooni moodulitel

Kodulabori kasutajaliidese plaadil asub koos lihtsa võimendiga kõlar, mis on ühendatud kontrolleri DAC1 kanaliga 1.

Kõlari kasutamiseks on Kodulabori teegis olemas funktsioon buzzer_sound, mis toob kuuldavale valitud pikkuse ja sagedusega helisignaali. Helisadegus andtakse ette hertsides ning kestvus millisekundites. Lisaks on võimalik käsuga buzzer_volume muuta heli valjusust vahemikus 0-4095, mis on realiseeritud DACi amplituudiga.

XMega kontrolleriga kenereeritakse tarkvaraline PWM, millega juhitakse DAC mooduli pinge väljundit 0V ja volüümiga määratud pingenivoo vahel.

// Taimer E0 ületäituvuse katkestus
ISR(TCE0_OVF_vect)
{
	static uint8_t CH1_Output = 0;
 
	if( CH1_Output == 1)
	{
		// Sea väljundpinge vastavalt volüümile 1
		DAC_Channel_Write( &DACB, volume, CH1);
		CH1_Output = 0;
	}
	else
	{
		// Sea väljundpinge 0V
		DAC_Channel_Write( &DACB, 0, CH1);
		CH1_Output = 1;
	}
}
 
//
// Genereeri heli sagedusega freq (8Hz - 500kHz) ja pikkusega length (ms)
// kui length = 0, siis jäägi heli väljastama
//
void buzzer_sound (uint16_t freq, unsigned int length)
{
	// DAC seadistamine
	// AVCC Pingereferentsiks DAC moodulile
	DACB.CTRLC = ( DACB.CTRLC & ~DAC_REFSEL_gm) | DAC_REFSEL_AVCC_gc;
	// Vali kanalid
	DACB.CTRLB = ( DACB.CTRLB & ~DAC_CHSEL_gm ) | DAC_CHSEL_DUAL_gc;
	// Käivita kanal 1 ning DACB moodul
	DACB.CTRLA = DAC_CH1EN_bm | DAC_ENABLE_bm;
 
	// Taimeri E0 seadistamine
	// Luba ületäituvuse katkestus keskmise prioriteediga
	TCE0.INTCTRLA = ( TCE0.INTCTRLA & ~TC0_OVFINTLVL_gm ) | TC_OVFINTLVL_MED_gc;
	// Sea taimeri E0 sageduseks 32MHz/64 = 500kHz
	TCE0.CTRLA = ( TCE0.CTRLA & ~TC0_CLKSEL_gm ) | TC_CLKSEL_DIV64_gc;
	// Luba keskmise taseme katkestused
	PMIC.CTRL |= PMIC_MEDLVLEN_bm;
	sei();
 
	// Sea Taimeri tekitatav sagedus
	TCE0.PER = (uint32_t)250000/freq;
 
	// Kontrolli, kas on vaja taimer ka välja lülitada, ning vajadusel oota.
	if(length)
	{
		sw_delay_ms(length);
		TCE0.CTRLA = ( TCE0.CTRLA & ~TC0_CLKSEL_gm ) | TC_CLKSEL_OFF_gc;
	}
}

Praktika Kodulabor II generatsiooni moodulitel

Kodulabori kasutajaliidese plaadil asub piesoelektriline buzzer koos võimenduslülitusega. Heligeneraatorit juhitakse viiguga G5.

Heligeneraatori kasutamiseks on Kodulabori teegis olemas funktsioon buzzer_sound, mis toob kuuldavale valitud pikkuse ja sagedusega helisignaali. Heli sagedus antakse ette suhtelistes ühikutes 1-255. Heli kestvus on millisekundites.

//
// Valitud sageduse ja pikkusega helisignaali genereerimine.
//
void buzzer_sound (unsigned char freq, unsigned int length)
{
	// Seadista heligeneraatori viik
	pin buzzer = PIN(G,5);
 
	// Seadista heligeneraatori viik väljundiks
	pin_setup_output(buzzer);
 
	// Seadista Timer 0 kiire PWM režiimi koos OCR0A ja COM0B1 väljundiga
	TCCR0A |= (1 << COM0B1);
	TCCR0A |= ((1 << WGM01)|(1 << WGM00));
	TCCR0B |= (1 << WGM02);
	OCR0A = freq;
	// Käivita Timer 0 koos preskaleriga 1024
	TCCR0B |= ((1 << CS02)|(1 << CS00));
 
	// Heli pikkus
	sw_delay_ms(length);
 
	// Peata taimer ehk heli genereerimine
	timer0_stop();
}

Järgmine näide illustreerib heligeneraatori teegi kasutamist. Kuuldavale tuuakse 500 millisekundi pikkune piiksatus.

#include <homelab/module/buzzer.h>
 
int main (void)
{
	buzzer_sound(50,500);
}
et/examples/digi/sound.1412063226.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0