This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:examples:digi:sound [2014/10/07 17:07] – raivo.sell | et:examples:digi:sound [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | < | ||
| + | ====== Heligeneraator ====== | ||
| + | //Vajalikud teadmised: | ||
| + | [HW][[et: | ||
| + | [AVR][[et: | ||
| + | [LIB][[et: | ||
| + | ===== Teooria ===== | ||
| + | |||
| + | [{{ : | ||
| + | [{{ : | ||
| + | |||
| + | Taimerite üheks praktiliseks rakenduseks on heligeneraatori või kõlari juhtimine. Heligeneraator on tihti kasutusel juhtpaneelides, | ||
| + | |||
| + | 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 // | ||
| + | |||
| + | < | ||
| + | ===== Praktika ===== | ||
| + | |||
| + | Kodulabor II Kasutajaliidese moodulil asub piesoelektriline heligeneraator koos võimenduslülitusega. Heligeneraatorit juhitakse viiguga PG5. | ||
| + | Heligeneraatori kasutamiseks on Kodulabori teegis olemas funktsioon // | ||
| + | |||
| + | <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); | ||
| + | |||
| + | // 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 // | ||
| + | |||
| + | Xmega kontrolleriga genereeritakse tarkvaraline PWM signaal, millega juhitakse DAC mooduli pingeväljundit 0 V ja // | ||
| + | |||
| + | <code c> | ||
| + | // 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/ | ||
| + | |||
| + | // 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. | ||
| + | <code c> | ||
| + | // Kodulabori heligeneraatori kasutamise näidisprogramm | ||
| + | // Genereeritakse 500 ms pikkune piiksatus | ||
| + | #include < | ||
| + | |||
| + | // Põhiprogramm | ||
| + | int main (void) | ||
| + | { | ||
| + | // Kodulabor III helivaljususe määramine | ||
| + | buzzer_volume(1000); | ||
| + | |||
| + | // 1 kHz 0,5 s pikkuse heli genereerimine | ||
| + | buzzer_sound(1000, | ||
| + | } | ||
| + | </ | ||