Arduino Audio Input (7 / 8 steg)
Steg 7: avbryta
incomingAudio = ADCH;
i funktionen loop() av Arduino skiss, har jag lagt det i en speciell funktion som kallas en "avbrott rutin." Avbryta operationsföljden ser ut så här:
ISR(ADC_vect) {
incomingAudio = ADCH;
}
Se det som en normal skiss, Arduino första går genom setup() fungera då det börjar loop(), men varje 26us (när ett nytt värde är redo från A0) den Arduino stannar vad det gör i slingan och gör vad är inkapslat i rutinen avbrott (i detta fall bara raden "incomingAudio = ADCH;"). När rutinen avbrott är klar, plockar Arduino upp igen där det var i loop() för en annan 26us. Sedan körs avbryta rutinen igen... Detta går för upprepande för evigt. Om du vill, du kan läsa mer om Arduino avbryter här.
Denna avbrottskod generellt ett bättre sätt att läsa den inkommande signalen än hur jag skrev det i sista steget eftersom du bara uppdaterar den variabla incomingAudio när varje gång ett nytt värde kommer. Variabeln att uppdatera flera gånger, innan värdet har även haft tid att ändra är redundant. Också, om du vill spela in dessa värden kan du sätta lagring koden i rutinen avbrott så att du vet att din lagring samplingsfrekvens är exakt 38,5 kHz.
Ljud ut med 38,5 samplingsfrekvensen och avbryter
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.
*
*/
int incomingAudio;
void setup() {
(CLI); //disable avbrott
Ställ in kontinuerlig provtagning av analoga pin 0
Rensa ADCSRA och ADCSRB register
ADCSRA = 0;
ADCSRB = 0;
ADMUX | = (1 << REFS0); ange referens spänning
ADMUX | = (1 << ADLAR); Vänsterjustera ADC värde - så vi kan läsa högst 8 bitar från ADCH register endast
ADCSRA | = (1 << ADPS2) | (1 << ADPS0); ställa in ADC klockan med 32 prescaler - 16mHz/32 = 500 kHz
ADCSRA | = (1 << ADATE); enabble automatisk utlösare
ADCSRA | = (1 << Ebba Grön); Aktivera avbrott när mätningen är klar
ADCSRA | = (1 << ADEN); Aktivera ADC
ADCSRA | = (1 << ADSC); Starta ADC mätningar
SEI (); //enable avbrott
Om du vill lägga till andra saker i setup(), göra det här
}
ISR(ADC_vect) {//when nya ADC värdet redo
incomingAudio = ADCH; //update den variabel incomingAudio med nytt värde från A0 (mellan 0 och 255)
}
void loop() {
göra andra saker här
}