Stap 4: Stereo Audio-uitgang met 8 Bit DAC en 44,1 kHz Sampling Rate
In deze code ben ik sturen een sinusgolf uit DACA en een zaag Golf uit DACB op hetzelfde moment en met een snelheid van 44,1 kHz. Dit is de stereo-audio, twee aparte kanalen voor audio. Om dit te laten werken, ik gecombineerd elementen sinus zag mono code uit de laatste stap en de WR en DACA/DACB pinnen gebruikt om te schakelen tussen de twee uitgangen van de DAC.
Mij troep opwaarts een interrupt zoals in de vorige stap, maar dit keer ik het opzette met een snelheid van 2 * 44,1 = 88,2 kHz. Vervolgens telkens de interrupt uitgevoerd, ik afgewisseld tussen het verzenden van iets aan DACA en DACB, zodat elk een steekproef tijdens elke andere interrupt ontvangen. Dit maakt de samplefrequentie op beide van de uitgangen 44,1 kHz. De inhoud van de interrupt routine worden gekopieerd hieronder:
digitalWrite (WR, hoge); //hold uitgangen-dus nieuwe DAC-gegevens niet krijgen verzonden doet totdat wij gereed zijn
Als (kanaal) {}
PORTD = sinus [index]; //send sinus naar digitale pinnen 0-7
digitalWrite (outputSelector, laag); //select DACA
index ++; //increment indexwaarde door een
Als (index 100 ==) {//reset index als het bereikt 100
index = 0;
}
}
else {}
PORTD = zagen; //send zag naar digitale pinnen 0-7
digitalWrite (outputSelector, hoge); //select DACB
zaag ++; //increment zag waarde door een
Als (zag == 255) {//reset zag als het bereikt 256 (houdt output binnen altijd 0-255)
zagen = 0;
}
}
digitalWrite (WR, laag); //enable uitgang weer
kanaal ^ = 1; //toggle kanaal
Wanneer de interrupts wordt gestart, de Arduino sets de WR pin HIGH, dit tijdelijk houdt de DAC-uitgangen op hun huidige spanningen en laat ons toe om het verzenden van gegevens naar de DAC zonder de huidige geselecteerde DAC-uitgang wijzigen. De variabele "kanaal" wordt geschakeld tussen de waarden van 0 en 1 telkens de interrupt wordt uitgevoerd, afwisselend van de sinus en zag uitvoer. Wanneer "channel" = 1, een waarde uit de matrix "sinus" is ingesteld op de DAC via PORTD. In de volgende regel wordt de outputSelector pin (pin-nummer DACA/DACB) laag, waardoor DACA worden geselecteerd. Dan is WR laag, waardoor de nieuwwaarde van de sinus uitgang via DACA ingesteld. In de volgende interrupt routine veroorzaakt een soortgelijke reeks gebeurtenissen een zaag-waarde aan de output van DACB.
<pre>//stereo audio out, sampling rate <=44.1kHz //by Amanda Ghassaei //Nov 2012
Net als in de laatste stap, mijn samplefrequentie was niet precies 88,2 kHz, het was eigenlijk 88.398 kHz (iets beter dan 88,2), dus ik gebruik dat aantal in de volgende berekeningen:
duur van elk monster = 2 * 1/Samplingsnelheid
duur van elk monster = 2 * 1/88398 Hz = 22.6us
Als de laatste stap in de periode van de sinus en zag zijn als volgt:
periode zag = 22.6us * 256 = 5.8ms
sinus periode = 22.6us * 100 = 2.3ms
maar als je kijkt naar vijgen 2 en 3 u zult zien dat de steekproef duur en periode van de golven van de uitvoer is veel langer. Dit is omdat de code in de interrupt routine inefficiënt is en langer dan de 22.6us uit te voeren. Om dit te bevestigen die ik moest vervangen de Arduino library commando "digitalWrite" met veel efficiënter directe pin manipulatie commando's in de onderstaande code. U kunt meer lezen over hoe ze werken hier, u kunt ook het lezen van de opmerkingen die ik heb gezet in de onderstaande code. Vijgen 4 en 5 tonen de output van deze geoptimaliseerde code, kunt u zien dat de duur van de periode en steekproef zijn wat we verwachten van de berekeningen.
<pre>//stereo audio out with 44.1kHz sampling rate //by Amanda Ghassaei //Nov 2012
Ik zal ook Let hier, sinds de CS pin wordt laag gehouden voor de duur van deze code (instelling hoog zal onbruikbaar nieuwe gegevens schrijven naar of uitvoer), u kan een extra pin van de Arduino vrijmaken door CS aan grond permanent te verwijderen van de exemplaren van CS in de code van de Arduino.