This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:examples:digi:sound [2014/09/30 07:47] – raivo.sell | et:examples:digi:sound [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ~~PB~~ | + | < |
| ====== Heligeneraator ====== | ====== Heligeneraator ====== | ||
| //Vajalikud teadmised: | //Vajalikud teadmised: | ||
| - | [HW][[et: | + | [HW][[et: |
| - | [AVR][[et: | + | [AVR][[et: |
| [LIB][[et: | [LIB][[et: | ||
| ===== 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, | + | Taimerite üheks praktiliseks rakenduseks on heligeneraatori |
| - | Piesoelektriline | + | Piesoelektriline |
| - | Elektromagnetiline | + | Elektromagnetiline |
| - | Üldiselt on piesoelektrilised | + | Üldiselt on piesoelektrilised |
| - | ~~CL~~ | + | Kõlarite juhtimiseks ei piisa tavaliselt digitaalväljundist vaid vaja on analoogsignaali. Selleks on kõige mugavam rakendada digitaal-analoog muundurit (inglise keeles // |
| + | < | ||
| + | ===== Praktika ===== | ||
| - | ===== Praktika | + | Kodulabor |
| + | Heligeneraatori kasutamiseks on Kodulabori teegis olemas funktsioon // | ||
| - | Kodulabori kasutajaliidese plaadil asub koos lihtsa võimendiga kõlar, mis on ühendatud kontrolleri DAC1 kanaliga 1. | + | <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); | ||
| - | Kõlari kasutamiseks on Kodulabori teegis olemas funktsioon buzzer_sound, | + | // Heligeneraatori viigu väljundiks seadistamine |
| + | pin_setup_output(buzzer); | ||
| - | XMega kontrolleriga | + | // 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 | ||
| <code c> | <code c> | ||
| Line 38: | Line 67: | ||
| if( CH1_Output == 1) | if( CH1_Output == 1) | ||
| { | { | ||
| - | // Sea väljundpinge | + | // Väljundpinge määramine |
| 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 |
| - | // Genereeri | + | // kui length = 0, siis jäädaksegi |
| - | // kui length = 0, siis jäägi | + | |
| - | // | + | |
| void buzzer_sound (uint16_t freq, unsigned int length) | void buzzer_sound (uint16_t freq, unsigned int length) | ||
| { | { | ||
| // DAC seadistamine | // DAC seadistamine | ||
| - | // AVCC Pingereferentsiks | + | // AVCC on pingereferentsiks |
| 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 | + | // Ületäituvuse |
| TCE0.INTCTRLA = ( TCE0.INTCTRLA & ~TC0_OVFINTLVL_gm ) | TC_OVFINTLVL_MED_gc; | TCE0.INTCTRLA = ( TCE0.INTCTRLA & ~TC0_OVFINTLVL_gm ) | TC_OVFINTLVL_MED_gc; | ||
| - | // Sea taimeri | + | // Taimeri |
| TCE0.CTRLA = ( TCE0.CTRLA & ~TC0_CLKSEL_gm ) | TC_CLKSEL_DIV64_gc; | TCE0.CTRLA = ( TCE0.CTRLA & ~TC0_CLKSEL_gm ) | TC_CLKSEL_DIV64_gc; | ||
| - | // Luba keskmise | + | // Keskmise |
| PMIC.CTRL |= PMIC_MEDLVLEN_bm; | PMIC.CTRL |= PMIC_MEDLVLEN_bm; | ||
| sei(); | sei(); | ||
| - | // Sea Taimeri | + | // Taimeri |
| TCE0.PER = (uint32_t)250000/ | TCE0.PER = (uint32_t)250000/ | ||
| - | // Kontrolli, kas on vaja taimer | + | // Kontroll, kas on vaja taimer välja lülitada, ning vajadusel |
| 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; | ||
| } | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | ===== 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, | ||
| - | |||
| - | <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(); | ||
| } | } | ||
| </ | </ | ||
| 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 < | #include < | ||
| - | + | ||
| + | // Põhiprogramm | ||
| int main (void) | int main (void) | ||
| { | { | ||
| - | buzzer_sound(50,500); | + | // Kodulabor III helivaljususe määramine |
| + | buzzer_volume(1000); | ||
| + | |||
| + | // 1 kHz 0,5 s pikkuse heli genereerimine | ||
| + | buzzer_sound(1000,500); | ||
| } | } | ||
| </ | </ | ||
| - | |||