Table of Contents

 

Sound Generator

Needs translation

Necessary knowledge: [HW]User Interface Module, [AVR]Counters/Timers,
[AVR]Digitaal-analoogmuundur, [LIB]buzzer

Theory

Piesoheligeneraator
Kõlar

Taimerite üheks praktiliseks rakenduseks on heligeneraatori või kõlari 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 heligeneraatorid jagada kaheks: piesoelektrilisteks ja elektromagnetilisteks.

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

Elektromagnetiline heligeneraator sarnaneb oma tööpõhimõttelt valjuhääldile ehk kõlarile. 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 piesoelektrilisele heligeneraatorile tekib heli.

Üldiselt on piesoelektrilised heligeneraatorid 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 heligeneraator töötab oma resonantssagedusel. Sellisel juhul on membraani amplituud kõige suurem. Elektromagnetiline heligeneraator ehk kõlar omab võrreldes piesoelektrilise heligeneraatoriga oluliselt paremat tonaalsust ja sobib lisaks lihtsate signaalhelide genereerimiseks ka muusika ja kõne edastamiseks.

Kõlarite juhtimiseks ei piisa tavaliselt digitaalväljundist vaid vaja on analoogsignaali. Selleks on kõige mugavam rakendada digitaal-analoog muundurit (inglise keeles digital-analog converter, lühend DAC). Digitaal-analoog muundur töötab vastupidiselt analoog-digitaal muundurile ja võimaldab mikrokontrolleril tekitada ka analoogväljundsignaali. Odavamatel ja lihtsamatel mikrokontrolleritel (sh ka ATmega128 ja ATmega2560) ei ole digitaal-analoog muundurit kiipi integreeritud. Sellisel juhul võib kasutada välist eraldiseisvat kiipi või tekitada analoogsignaal RC filtri ja võimendusskeemi abil. See nõuab aga mitmeid lisakomponente ja seetõttu on kõlari kasutamine koos mikrokontrolleriga mõnevõrra keerukam võrreldes muude digitaalsignaalidega opereerivate komponentige (nt lülitid, LED-id, andurid, jms).

 

Practice

Kodulabor II Kasutajaliidese moodulil asub piesoelektriline heligeneraator koos võimenduslülitusega. Heligeneraatorit juhitakse viiguga PG5. 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)
{
	// Heligeneraatori viigu määramine
	pin buzzer = PIN(G,5);
 
	// Heligeneraatori viigu väljundiks seadistamine
	pin_setup_output(buzzer);
 
	// Timer 0 kiire PWM režiimi seadistamine koos OCR0A ja COM0B1 väljundiga
	TCCR0A |= (1 << COM0B1);
	TCCR0A |= ((1 << WGM01)|(1 << WGM00));
	TCCR0B |= (1 << WGM02);
	OCR0A = freq;
	// Timer 0 käivitamine koos jaguriga 1024
	TCCR0B |= ((1 << CS02)|(1 << CS00));
 
	// Heli pikkus
	sw_delay_ms(length);
 
	// Taimeri ehk heli genereerimise peatamine
	timer0_stop();
}

Kodulabor III Kasutajaliidese moodulil asub koos lihtsa võimendiga kõlar, mis on ühendatud kontrolleri DAC1 kanaliga 1.

Kõlari kasutamiseks Kodulabori teegis olev funktsioon buzzer_sound toob kuuldavale valitud pikkuse ja sagedusega helisignaali. Helisagedus 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 genereeritakse tarkvaraline PWM signaal, millega juhitakse DAC mooduli pingeväljundit 0 V ja buzzer_volume funktsiooni parameetriga määratud pingenivoo vahel.

// Taimer E0 ületäituvuse katkestus
ISR(TCE0_OVF_vect)
{
	static uint8_t CH1_Output = 0;
 
	if( CH1_Output == 1)
	{
		// Väljundpinge määramine vastavalt volume-ile 1
		DAC_Channel_Write( &DACB, volume, CH1);
		CH1_Output = 0;
	}
 
	else
	{
		// Väljundpinge määramine 0 V
		DAC_Channel_Write( &DACB, 0, CH1);
		CH1_Output = 1;
	}
}
 
// Genereeritakse heli sagedusega freq (8 Hz - 500 kHz) ja pikkusega length (ms)
// kui length = 0, siis jäädaksegi heli väljastama
void buzzer_sound (uint16_t freq, unsigned int length)
{
	// DAC seadistamine
	// AVCC on pingereferentsiks DAC moodulile
	DACB.CTRLC = ( DACB.CTRLC & ~DAC_REFSEL_gm) | DAC_REFSEL_AVCC_gc;
	// Kanali valimine
	DACB.CTRLB = ( DACB.CTRLB & ~DAC_CHSEL_gm ) | DAC_CHSEL_DUAL_gc;
	// Kanal 1 ning DACB mooduli käivitamine
	DACB.CTRLA = DAC_CH1EN_bm | DAC_ENABLE_bm;
 
	// Taimeri E0 seadistamine
	// Ületäituvuse katkestus lubamine keskmise prioriteediga
	TCE0.INTCTRLA = ( TCE0.INTCTRLA & ~TC0_OVFINTLVL_gm ) | TC_OVFINTLVL_MED_gc;
	// Taimeri E0 seadistamine sagedusega 32 MHz/64 = 500 kHz
	TCE0.CTRLA = ( TCE0.CTRLA & ~TC0_CLKSEL_gm ) | TC_CLKSEL_DIV64_gc;
	// Keskmise taseme katkestuste lubamine
	PMIC.CTRL |= PMIC_MEDLVLEN_bm;
	sei();
 
	// Taimeri tekitatava sageduse lubamine
	TCE0.PER = (uint32_t)250000/freq;
 
	// Kontroll, kas on vaja taimer välja lülitada, ning vajadusel oodata
	if(length)
	{
		sw_delay_ms(length);
		TCE0.CTRLA = ( TCE0.CTRLA & ~TC0_CLKSEL_gm ) | TC_CLKSEL_OFF_gc;
	}
}

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

// Kodulabori heligeneraatori kasutamise näidisprogramm
// Genereeritakse 500 ms pikkune piiksatus
#include <homelab/module/buzzer.h>
 
// Põhiprogramm 
int main (void)
{
	// Kodulabor III helivaljususe määramine
	buzzer_volume(1000);
 
	// 1 kHz 0,5 s pikkuse heli genereerimine
	buzzer_sound(1000,500);
}
en/examples/digi/sound.txt · Last modified: 2015/03/26 17:32 by heikopikner
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