Arduino ljud utgång (9 / 10 steg)
Steg 9:40 kHz samplingsfrekvens
För att ställa in avbrottet måste du kopiera följande rader till din setup() funktion:
(CLI); //disable avbrott
Set timer0 avbrott på 40kHz
TCCR0A = 0; / / Ställ in hela TCCR0A register till 0
TCCR0B = 0; / / samma för TCCR0B
TCNT0 = 0; //initialize värde till 0
Set jämför match registrera dig för 40khz steg
OCR0A = 49. / / = (16 * 10 ^ 6) / (40000 * 8) - 1 (måste vara < 256)
Aktivera CTC läge
TCCR0A | = (1 << WGM01);
Ange CS11 bit för 8 prescaler
TCCR0B | = (1 << CS11);
Aktivera timern jämför avbrott
TIMSK0 | = (1 << OCIE0A);
SEI (); //enable avbrott
innehållet i rutinen avbrott är inkapslade i följande funktion:
ISR(TIMER0_COMPA_vect) {//40kHz avbrott rutin
}
Du vill behålla rutinen avbrott så kort som möjligt, bara nödvändigaste. Du kan göra alla dina andra uppgifter (kontrollera på knappar, vrida på lysdioder, etc) i loop(). Tänk också på att ställa in avbrott kan påverka andra Arduino funktioner som analogWrite och dröjsmål.
I koden nedan använder jag avbryta funktionen Skicka ett nytt värde för sine [] till PORTD med en hastighet av 40 kHz och ökar värdet för variabeln "t." Figurerna 1 och 2 visar (ofiltrerade) produktionen av koden på ett oscilloskop. Vi kan beräkna den förväntade frekvensen enligt följande:
frekvens = (samplingsfrekvens) / (steg per cykel)
frekvens = 40.000 / 100 = 400 hz
Vi förväntar oss en samplingsfrekvens på 40kHz och varaktigheten av varje steg vara:
varaktigheten av varje prov steg = 1 / (samplingsfrekvens)
varaktigheten av varje prov steg = 1/40 000 = 25us
Sine ut w / 40kHz samplingsfrekvens
av Amanda Ghassaei
Sept 2012
/*
* Detta program är fri programvara; Du kan vidaredistribuera det och/eller ändra
* det enligt villkoren i GNU General Public License som offentliggjorts av
* den Free Software Foundation; antingen version 3 av licensen, eller
* (på ditt alternativ) någon senare version.
*
*/
byte sine [] = {127, 134, 142, 150, 158, 166, 173, 181, 188, 195, 201, 207, 213, 219, 224, 229, 234, 238, 241, 245, 247, 250, 251, 252, 253, 254, 253, 252, 251, 250, 247, 245, 241, 238, 234, 229, 224, 219, 213, 207, 201, 195, 188, 181, 173, 166, 158, 150, 142, 134, 127, 119, 111, 103, 95, 87, 80, 72, 65 58, 52, 46, 40, 34, 29, 24, 19, 15, 12, 8, 6, 3, 2, 1, 0, 0, 0, 1, 2, 3, 6, 8, 12, 15, 19, 24, 29, 34, 40, 46, 52, 58, 65, 72, 80, 87, 95, 103, 111, 119,};
int t = 0; //time
void setup() {
ställa in digital stift 0-7 som utgångar
för (int jag = 0; jag < 8; i ++) {
pinMode(i,OUTPUT);
}
(CLI); //disable avbrott
Set timer0 avbrott på 40kHz
TCCR0A = 0; / / Ställ in hela TCCR0A register till 0
TCCR0B = 0; / / samma för TCCR0B
TCNT0 = 0; //initialize värde till 0
Set jämför match registrera dig för 40khz steg
OCR0A = 49. / / = (16 * 10 ^ 6) / (40000 * 8) - 1 (måste vara < 256)
Aktivera CTC läge
TCCR0A | = (1 << WGM01);
Ange CS11 bit för 8 prescaler
TCCR0B | = (1 << CS11);
Aktivera timern jämför avbrott
TIMSK0 | = (1 << OCIE0A);
SEI (); //enable avbrott
}
ISR(TIMER0_COMPA_vect) {//40kHz avbrott rutin
PORTD = sine [t]; //send sinusvåg till DAC, centrerad kring (127/255) * 5 = 2.5V
t ++; //increment t
om (t > 99) {//reset t till noll
t = 0;
}
}
void loop() {
göra andra saker här
}