Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
et:examples:digi:sound [2014/09/29 11:24] raivo.sellet:examples:digi:sound [2020/07/20 09:00] (current) – external edit 127.0.0.1
Line 1: Line 1:
-~~PB~~+<pagebreak>
 ====== Heligeneraator ====== ====== Heligeneraator ======
 //Vajalikud teadmised: //Vajalikud teadmised:
-[HW][[et:hardware:homelab:controller]], [HW][[et:hardware:homelab:digi]] \\ +[HW][[et:hardware:homelab:digi]], 
-[AVR][[et:avr:io]], [AVR][[et:avr:timers]], [AVR][[et:avr:dac]], [AVR][[et:avr:interrupts]] \\+[AVR][[et:avr:timers]],\\ [AVR][[et:avr:dac]], 
 [LIB][[et:software:homelab:library:buzzer]] // [LIB][[et:software:homelab:library:buzzer]] //
  
 ===== Teooria ===== ===== Teooria =====
  
-[{{  :et:examples:digi:homelab_buzzer.png?220|Kodulabor II buzzer}}] +[{{ :examples:sound:piezo.jpg?200|Piesoheligeneraator}}] 
-[{{  :et:examples:digi:speaker.jpg?220|Kodulabor III kõlar koos võimendiga}}]+[{{ :examples:sound:kingstate-kssg3108.jpg?200|Kõlar}}]
  
-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. +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 kahekspiesoelektrilisteks 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.+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 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.+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 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.+Ü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
  
-~~CL~~ +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).
-~~PB~~+
  
-===== Praktika Kodulabor III generatsiooni moodulitel =====+<pagebreak> 
 +===== Praktika =====
  
-Kodulabori kasutajaliidese plaadil asub koos lihtsa võimendiga kõlar, mis on ühendatud kontrolleri DAC1 kanaliga 1.+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.
  
-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-4095mis on realiseeritud DACi amplituudiga.+<code c> 
 +// Valitud sageduse ja pikkusega helisignaali genereerimine 
 +void buzzer_sound (unsigned char freq, unsigned int length) 
 +
 + // Heligeneraatori viigu määramine 
 + pin buzzer = PIN(G,5);
  
-XMega kontrolleriga kenereeritakse tarkvaraline PWM, millega juhitakse DAC mooduli pinge väljundit 0V ja volüümiga määratud pingenivoo vahel.+ // 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(); 
 +
 +</code> 
 + 
 +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.
  
 <code c> <code c>
Line 38: Line 67:
  if( CH1_Output == 1)  if( CH1_Output == 1)
  {  {
- // Sea väljundpinge vastavalt volüümile 1+ // Väljundpinge määramine vastavalt volume-ile 1
  DAC_Channel_Write( &DACB, volume, CH1);  DAC_Channel_Write( &DACB, volume, CH1);
  CH1_Output = 0;  CH1_Output = 0;
  }  }
 +
  else  else
  {  {
- // Sea väljundpinge 0V+ // Väljundpinge määramine 0 V
  DAC_Channel_Write( &DACB, 0, CH1);  DAC_Channel_Write( &DACB, 0, CH1);
  CH1_Output = 1;  CH1_Output = 1;
Line 50: Line 80:
 } }
  
-// +// Genereeritakse heli sagedusega freq (8 Hz 500 kHz) ja pikkusega length (ms) 
-// Genereeri heli sagedusega freq (8Hz 500kHz) ja pikkusega length (ms) +// kui length = 0, siis jäädaksegi heli väljastama
-// kui length = 0, siis jäägi heli väljastama +
-//+
 void buzzer_sound (uint16_t freq, unsigned int length) void buzzer_sound (uint16_t freq, unsigned int length)
 { {
  // DAC seadistamine  // DAC seadistamine
- // AVCC Pingereferentsiks DAC moodulile+ // AVCC on pingereferentsiks DAC moodulile
  DACB.CTRLC = ( DACB.CTRLC & ~DAC_REFSEL_gm) | DAC_REFSEL_AVCC_gc;  DACB.CTRLC = ( DACB.CTRLC & ~DAC_REFSEL_gm) | DAC_REFSEL_AVCC_gc;
- // Vali kanalid+ // Kanali valimine
  DACB.CTRLB = ( DACB.CTRLB & ~DAC_CHSEL_gm ) | DAC_CHSEL_DUAL_gc;  DACB.CTRLB = ( DACB.CTRLB & ~DAC_CHSEL_gm ) | DAC_CHSEL_DUAL_gc;
- // Käivita kanal 1 ning DACB moodul+ // Kanal 1 ning DACB mooduli käivitamine
  DACB.CTRLA = DAC_CH1EN_bm | DAC_ENABLE_bm;  DACB.CTRLA = DAC_CH1EN_bm | DAC_ENABLE_bm;
  
  // Taimeri E0 seadistamine  // Taimeri E0 seadistamine
- // Luba ületäituvuse katkestus keskmise prioriteediga+ // Ületäituvuse katkestus lubamine keskmise prioriteediga
  TCE0.INTCTRLA = ( TCE0.INTCTRLA & ~TC0_OVFINTLVL_gm ) | TC_OVFINTLVL_MED_gc;  TCE0.INTCTRLA = ( TCE0.INTCTRLA & ~TC0_OVFINTLVL_gm ) | TC_OVFINTLVL_MED_gc;
- // Sea taimeri E0 sageduseks 32MHz/64 = 500kHz+ // Taimeri E0 seadistamine sagedusega 32 MHz/64 = 500 kHz
  TCE0.CTRLA = ( TCE0.CTRLA & ~TC0_CLKSEL_gm ) | TC_CLKSEL_DIV64_gc;  TCE0.CTRLA = ( TCE0.CTRLA & ~TC0_CLKSEL_gm ) | TC_CLKSEL_DIV64_gc;
- // Luba keskmise taseme katkestused+ // Keskmise taseme katkestuste lubamine
  PMIC.CTRL |= PMIC_MEDLVLEN_bm;  PMIC.CTRL |= PMIC_MEDLVLEN_bm;
  sei();  sei();
   
- // Sea Taimeri tekitatav sagedus+ // Taimeri tekitatava sageduse lubamine
  TCE0.PER = (uint32_t)250000/freq;  TCE0.PER = (uint32_t)250000/freq;
   
- // Kontrolli, kas on vaja taimer ka välja lülitada, ning vajadusel oota.+ // Kontroll, kas on vaja taimer välja lülitada, ning vajadusel oodata
  if(length)  if(length)
  {  {
Line 82: Line 110:
  TCE0.CTRLA = ( TCE0.CTRLA & ~TC0_CLKSEL_gm ) | TC_CLKSEL_OFF_gc;  TCE0.CTRLA = ( TCE0.CTRLA & ~TC0_CLKSEL_gm ) | TC_CLKSEL_OFF_gc;
  }  }
-} 
-</code> 
- 
-===== 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. 
- 
-<code c> 
- 
-// 
-// 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(); 
 } }
 </code> </code>
Line 122: Line 115:
 Järgmine näide illustreerib heligeneraatori teegi kasutamist. Kuuldavale tuuakse 500 millisekundi pikkune piiksatus. Järgmine näide illustreerib heligeneraatori teegi kasutamist. Kuuldavale tuuakse 500 millisekundi pikkune piiksatus.
 <code c> <code c>
 +// Kodulabori heligeneraatori kasutamise näidisprogramm
 +// Genereeritakse 500 ms pikkune piiksatus
 #include <homelab/module/buzzer.h> #include <homelab/module/buzzer.h>
- + 
 +// Põhiprogramm 
 int main (void) int main (void)
 { {
- buzzer_sound(50,500); + // Kodulabor III helivaljususe määramine 
-+ buzzer_volume(1000);
-</code> +
- +
-Muusika mängimiseks, kasutades noodistikku, on vaja teada iga heli sagedust. Järgmine näide õpetab ilma buzzer.h teeki kasutamata keerulisemate muusikapalade loomist. Kasutusel on taimer 0, mille ületäitumise korral tekib katkestus. Katkestuse funktsioonis on muutuja //intrs//, mida suurendatakse iga katkestuse täitmise korral. Samal ajal võrreldakse seda muutujat noodi sagedusest arvutatud ületäitumiste arvuga. Kui muutuja //intrs// ja noodi ületäitumiste arv on saanud võrdseks, siis inverteeritakse heligeneraatori viigu väärtus. Tekib ristkülikukujuline signaal, mille sagedus on määratud noodi sagedusega. +
- +
-Uute nootide defineerimine on näiteprogrammis lihtne. Analoogselt olemasolevatele nootidele tuleb, kasutades //#define// direktiivi, kirjeldada uue noodi nimi. Noodi nime järele tuleb lisada noodi sagedus hertsides. Sammuti tuleb lisada definitsioon, mitu taimeri ületäitumist leiab aset noodi kohta. Peale seda on uus noot kasutusvalmis. +
- +
-Näiteprogramm mängib lühikese muusikapala peale nupu S1 vajutamist. +
- +
-<code c> +
-#include <homelab/pin.h> +
-#include <homelab/delay.h> +
-#include <homelab/timer2561.h> +
-#include <avr/interrupt.h> +
- +
- +
-// Timer0 ületäitumisi sekundis +
-#define INT_PER_SEC 31250 +
- +
-// Nootide sagedused (Hz) +
-#define F_FSH_4 370 +
-#define F_A_4 440 +
-#define F_B_4 494 +
-#define F_E_4 330 +
-#define F_CSH_5 554 +
-#define F_D_5 587 +
-#define F_FSH_5 740 +
-#define F_CSH_4 277 +
-#define F_GSH_4 415 +
- +
-// Timer0 ületäitumisi noodi kohta +
-#define REST -1 // special case +
-#define FSH_4 INT_PER_SEC/F_FSH_4 +
-#define A_4 INT_PER_SEC/F_A_4 +
-#define B_4 INT_PER_SEC/F_B_4 +
-#define E_4 INT_PER_SEC/F_E_4 +
-#define CSH_5 INT_PER_SEC/F_CSH_5 +
-#define D_5 INT_PER_SEC/F_D_5 +
-#define FSH_5 INT_PER_SEC/F_FSH_5 +
-#define CSH_4 INT_PER_SEC/F_CSH_4 +
-#define GSH_4 INT_PER_SEC/F_GSH_4 +
- +
-#define SEMIQUAVER_TIME 60  // ms +
-#define BREATH_TIME 20      // ms +
- +
-volatile uint32_t intrs = 0; +
-volatile int32_t curNote = REST; +
- +
- +
-// Nupu viik +
-pin button1 = PIN(C, 0); +
- +
-// Heligeneraatori viik +
-pin buzzer = PIN(G, 5); +
- +
- +
-// Taimer 0 katkestuse programmilõik +
-ISR(TIMER0_OVF_vect) +
-+
-    if (curNote == REST) +
-+
-        intrs = 0; +
-+
-    else +
-    { +
-        intrs++; +
-        if (intrs >= curNote) +
-        {             +
- pin_toggle(buzzer); +
- +
-            intrs = 0; +
-        } +
-    } +
-+
- +
-// Mängi nooti etteantud aeg +
-void play(int32_t note, uint32_t len) +
-+
-    int i; +
-    curNote = note; +
- +
-    for (i = 0; i< len; i++) +
-+
-        sw_delay_ms(SEMIQUAVER_TIME); +
-+
- +
-    curNote = REST; +
-    sw_delay_ms(BREATH_TIME); +
-+
- +
-int main(void) +
-+
- +
-    unsigned char new_value1, old_value1 = 0; +
- +
-    // Seab nupu töökorda +
-    pin_setup_input_with_pullup(button1); +
- +
-    // Heligeneraatori viigu väljundiks määramine +
-    pin_setup_output(buzzer); +
- +
-    // Taimer 0 normaalreziimi seadistamine. Selles reziimis loendab  +
-    // taimer 255-ni (kaasa arvatud) ja ainuke tekkiv sündmus on ületäitumine.  +
-    // Jagurit ei kasutata. +
-    timer0_init_normal(TIMER0_NO_PRESCALE); +
- +
-    // Taimer 0 ületäitumise katkestuse lubamine +
-    timer0_overflow_interrupt_enable(true); +
- +
-    // Taimer 0 väärtuse nullimine +
-    timer0_set_value(0);     +
-     +
-    // Globaalne katkestuste lubamine +
-    sei(); +
- +
-    while (1) +
-    { +
-        // Loeb nuppude väärtused. +
-        new_value1 = pin_get_debounced_value(button1); +
- +
-        // Nupp S1 alla vajutatud. Registreeritakse ainult üks vajutus. +
-        if((!new_value1) && (old_value1)) +
-        { +
-            // Mängi järgnev lugu +
-            play(FSH_4, 2); +
-            play(REST, 2); +
-            play(A_4, 3); +
-            play(FSH_4, 2); +
-            play(FSH_4, 1); +
-            play(B_4, 2); +
-            play(FSH_4, 2); +
-            play(E_4, 2); +
-            play(FSH_4, 2); +
-            play(REST, 2); +
-            play(CSH_5, 3); +
-            play(FSH_4, 2); +
-            play(FSH_4, 1); +
-            play(D_5, 2); +
-            play(CSH_5, 2); +
-            play(A_4, 2); +
-            play(FSH_4, 2); +
-            play(CSH_5, 2); +
-            play(FSH_5, 2); +
-            play(FSH_4, 1); +
-            play(E_4, 2); +
-            play(E_4, 1); +
-            play(CSH_4, 2); +
-            play(GSH_4, 2); +
-            play(FSH_4, 6); +
-            play(REST, 12); +
-  +
-            // Viide +
-            sw_delay_ms(2);   +
-        }+
  
-        // Jätab eelmise nupu väärtuse meelde + // 1 kHz 0,5 s pikkuse heli genereerimine 
-        old_value1 = new_value1        + buzzer_sound(1000,500);
-    }+
 } }
 </code> </code>
et/examples/digi/sound.1411989878.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