This is an old revision of the document!
Vajalikud teadmised:
[HW]Kontrollermoodul, [HW]Kasutajaliidese moodul
[AVR]Digitaalsed sisendid-väljundid, [AVR]Loendurid/Taimerid, [AVR]Digitaal-analoogmuundur, [AVR]Katkestused
[LIB]Heligeneraator
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.
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; } }
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); }