This shows you the differences between two versions of the page.
| en:examples:digi:sound [2015/03/26 17:32] – created heikopikner | en:examples:digi:sound [2026/02/19 11:30] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ~~PB~~ | + | < |
| - | ====== Sound Generator | + | ====== Sound generator |
| - | < | + | //Required |
| - | + | [HW][[et: | |
| - | // | + | [AVR][[et: |
| - | [HW][[en: | + | [LIB][[et: |
| - | [AVR][[en: | + | |
| - | [LIB][[en: | + | |
| ===== Theory ===== | ===== Theory ===== | ||
| - | [{{ : | + | [{{ : |
| - | [{{ : | + | [{{ : |
| - | 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. | + | One practical use of timers is driving a sounder or a speaker. Sounders are often used in control panels, alarm devices, and elsewhere to make button presses or signal tones audible. Such a sounder is often simply called a speaker, a beeper, or a //buzzer//. |
| + | By operating principle, sounders can be divided into piezoelectric and electromagnetic. | ||
| - | Piesoelektriline heligeneraator koosneb metallplaadist ja sellele kinnitatud piesokeraamilisest materjalist elemendist. Piesokeraamiline | + | A piezoelectric sounder consists of a metal plate with a piezoceramic element attached. The piezoceramic |
| - | 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. | + | An electromagnetic sounder is similar in principle to a loudspeaker. A coil is placed in a magnetic field with a metal diaphragm above it. When audio-frequency current flows through the coil, the diaphragm moves due to the magnetic fields of the coil and permanent magnet. Like the piezoelectric sounder, this produces sound. |
| - | Ü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. | + | In general, piezoelectric sounders have higher sound pressure, lower current consumption, |
| - | 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 | + | To drive speakers, a digital output is usually not enough; you need an analog signal. The easiest way is to use a digital-to-analog converter |
| - | ~~PB~~ | + | < |
| ===== Practice ===== | ===== Practice ===== | ||
| - | Kodulabor | + | The HomeLab |
| - | Heligeneraatori kasutamiseks on Kodulabori teegis olemas funktsioon | + | To use the sounder, the HomeLab library provides the function |
| <code c> | <code c> | ||
| - | // Valitud sageduse ja pikkusega helisignaali genereerimine | + | // Generate a sound signal with selected frequency and length |
| void buzzer_sound (unsigned char freq, unsigned int length) | void buzzer_sound (unsigned char freq, unsigned int length) | ||
| { | { | ||
| - | // Heligeneraatori viigu määramine | + | // Select the sounder pin |
| pin buzzer = PIN(G,5); | pin buzzer = PIN(G,5); | ||
| - | // Heligeneraatori viigu väljundiks seadistamine | + | // Configure the sounder pin as output |
| pin_setup_output(buzzer); | pin_setup_output(buzzer); | ||
| - | // Timer 0 kiire PWM režiimi seadistamine koos OCR0A ja COM0B1 | + | // Timer 0 fast PWM mode with OCR0A and COM0B1 |
| TCCR0A |= (1 << COM0B1); | TCCR0A |= (1 << COM0B1); | ||
| TCCR0A |= ((1 << WGM01)|(1 << WGM00)); | TCCR0A |= ((1 << WGM01)|(1 << WGM00)); | ||
| TCCR0B |= (1 << WGM02); | TCCR0B |= (1 << WGM02); | ||
| OCR0A = freq; | OCR0A = freq; | ||
| - | // Timer 0 käivitamine koos jaguriga | + | // Start Timer 0 with prescaler |
| TCCR0B |= ((1 << CS02)|(1 << CS00)); | TCCR0B |= ((1 << CS02)|(1 << CS00)); | ||
| - | // Heli pikkus | + | // Sound length |
| sw_delay_ms(length); | sw_delay_ms(length); | ||
| - | // Taimeri ehk heli genereerimise peatamine | + | // Stop timer and sound generation |
| timer0_stop(); | timer0_stop(); | ||
| } | } | ||
| </ | </ | ||
| - | Kodulabor | + | The HomeLab |
| - | Kõlari kasutamiseks Kodulabori teegis olev funktsioon | + | To use the speaker, the HomeLab library function |
| - | Xmega kontrolleriga genereeritakse tarkvaraline PWM signaal, millega juhitakse | + | With an Xmega controller, a software PWM signal is generated to drive the DAC module output between |
| <code c> | <code c> | ||
| - | // Taimer | + | // Timer E0 overflow interrupt |
| ISR(TCE0_OVF_vect) | ISR(TCE0_OVF_vect) | ||
| { | { | ||
| Line 69: | Line 68: | ||
| if( CH1_Output == 1) | if( CH1_Output == 1) | ||
| { | { | ||
| - | // Väljundpinge määramine vastavalt | + | // Set output voltage according to volume |
| DAC_Channel_Write( &DACB, volume, CH1); | DAC_Channel_Write( &DACB, volume, CH1); | ||
| CH1_Output = 0; | CH1_Output = 0; | ||
| Line 76: | Line 75: | ||
| else | else | ||
| { | { | ||
| - | // Väljundpinge määramine | + | // Set output voltage to 0 V |
| DAC_Channel_Write( &DACB, 0, CH1); | DAC_Channel_Write( &DACB, 0, CH1); | ||
| CH1_Output = 1; | CH1_Output = 1; | ||
| Line 82: | Line 81: | ||
| } | } | ||
| - | // Genereeritakse heli sagedusega | + | // Generate sound with frequency |
| - | // kui length = 0, siis jäädaksegi heli väljastama | + | // if length = 0, sound is generated continuously |
| void buzzer_sound (uint16_t freq, unsigned int length) | void buzzer_sound (uint16_t freq, unsigned int length) | ||
| { | { | ||
| - | // DAC seadistamine | + | // DAC setup |
| - | // AVCC on pingereferentsiks | + | // AVCC as DAC reference |
| DACB.CTRLC = ( DACB.CTRLC & ~DAC_REFSEL_gm) | DAC_REFSEL_AVCC_gc; | DACB.CTRLC = ( DACB.CTRLC & ~DAC_REFSEL_gm) | DAC_REFSEL_AVCC_gc; | ||
| - | // Kanali valimine | + | // Select channel |
| DACB.CTRLB = ( DACB.CTRLB & ~DAC_CHSEL_gm ) | DAC_CHSEL_DUAL_gc; | DACB.CTRLB = ( DACB.CTRLB & ~DAC_CHSEL_gm ) | DAC_CHSEL_DUAL_gc; | ||
| - | // Kanal 1 ning DACB mooduli käivitamine | + | // Enable channel |
| DACB.CTRLA = DAC_CH1EN_bm | DAC_ENABLE_bm; | DACB.CTRLA = DAC_CH1EN_bm | DAC_ENABLE_bm; | ||
| - | // Taimeri | + | // Timer E0 setup |
| - | // Ületäituvuse katkestus lubamine keskmise prioriteediga | + | // Enable overflow interrupt with medium priority |
| TCE0.INTCTRLA = ( TCE0.INTCTRLA & ~TC0_OVFINTLVL_gm ) | TC_OVFINTLVL_MED_gc; | TCE0.INTCTRLA = ( TCE0.INTCTRLA & ~TC0_OVFINTLVL_gm ) | TC_OVFINTLVL_MED_gc; | ||
| - | // Taimeri | + | // Set Timer E0 frequency to 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; | ||
| - | // Keskmise taseme katkestuste lubamine | + | // Enable medium-level interrupts |
| PMIC.CTRL |= PMIC_MEDLVLEN_bm; | PMIC.CTRL |= PMIC_MEDLVLEN_bm; | ||
| sei(); | sei(); | ||
| - | // Taimeri tekitatava sageduse lubamine | + | // Set timer frequency |
| TCE0.PER = (uint32_t)250000/ | TCE0.PER = (uint32_t)250000/ | ||
| - | // Kontroll, kas on vaja taimer välja lülitada, ning vajadusel oodata | + | // Check if timer should be stopped, and wait if needed |
| if(length) | if(length) | ||
| { | { | ||
| Line 115: | Line 114: | ||
| </ | </ | ||
| - | Järgmine näide illustreerib heligeneraatori teegi kasutamist. Kuuldavale tuuakse | + | The next example illustrates use of the sounder library. It generates a 500 millisecond beep. |
| <code c> | <code c> | ||
| - | // Kodulabori heligeneraatori kasutamise näidisprogramm | + | // HomeLab sounder usage example program |
| - | // Genereeritakse | + | // Generate a 500 ms beep |
| #include < | #include < | ||
| - | // Põhiprogramm | + | // Main program |
| int main (void) | int main (void) | ||
| { | { | ||
| - | // Kodulabor | + | // Set HomeLab |
| buzzer_volume(1000); | buzzer_volume(1000); | ||
| - | // 1 kHz 0,5 s pikkuse heli genereerimine | + | // Generate |
| buzzer_sound(1000, | buzzer_sound(1000, | ||
| } | } | ||
| </ | </ | ||
| + | |||