Arduino Audio Input (6 / 8 steg)
Steg 6: Samplingsfrekvens ~ 40 kHz
Här är enkel förklaring (allt du behöver veta för nu):
I princip i funktionen setup() har jag berättat Arduino att jag vill ha det att kontinuerligt mäta pin A0 och glömma de andra analoga ingångarna som alla tillsammans. Så medan andra saker pågår i funktionen loop(), Arduino ständigt uppdaterar en variabel som kallas "ADCH" med nya värden från A0 uppgå till 38,5 kHz (som är en prova på varje 26us, du kan se det i fig 2). När jag vill få en av dessa värden jag kan bara ställa in en variabel är lika till ADCH, eller som jag skrev i min kod:
incomingAudio = ADCH;
Jag var tvungen att sänka upplösningen av dessa analoga mätningar lite för att få en högre samplingsfrekvens. I det sista steget var vi med analogRead() för att mäta spänningen på signalen som ett värde mellan 0 och 1023, nu dessa värden kommer alltid vara mellan 0 och 255. Kontinuerlig övervakning av A0 innebär också, att andra analoga stiften är nu värdelösa, men om du verkligen behöver för att mäta en potentiometer eller sensor, kolla in hur du kan göra det med en digital pin med RCTime It är möjligt att analoga stiften kan fortfarande användas som digital I/O pins, men jag har inte faktiskt testat detta ännu, lämna en kommentar om du prova det!
Den komplicerade förklaringen (inte nödvändigt, men för de som är intresserade):
Jag manuellt ställa in den Arduino inre analog till digital omvandlare (ADC) mot 500kHz och läsa en 8 bitars värde från analog ingång 0 från ADCH direkt (jag läste bara de mest betydande 8 bitarna av de 10 bitars ADC att spara tid i koden). Jag ange ADC 500kHz eftersom ADC tar 13 klockcykler att läsa ett nytt analoga värde. 500/13 = ~ 38,5 kHz som får mig ganska nära 40 kHz (standard ljud samplingsfrekvens) utan att införa extra buller. Som ni kan se i figur 2, detta ger mig en prova varje 13/500000 = 26us. En hel del idéer här (prescalers och räknare) liknar setup för Arduino timer avbrott, och du kan läsa mer om hur det fungerar här.
Ljud ut med 38,5 kHz 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.
*
*/
int incomingAudio; //storage för A0 data
void setup() {
Ställ in kontinuerlig provtagning av analoga pin 0 (du inte behöver att förstå denna del, bara vet hur man använder det i loop())
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 << ADEN); Aktivera ADC
ADCSRA | = (1 << ADSC); Starta ADC mätningar
Om du vill lägga till andra saker i setup(), göra det här
}
void loop() {
incomingAudio = ADCH; //get nytt värde från A0
göra andra saker här
}
Som i föregående steg skickade jag värdena för variabeln "incomingAudio" ut en 8 bitars DAC så att jag kunde Visualisera data som det var lagras i Arduino. Du kan se den inkommande signalen (gul) och utgång från DAC (blå) i bilderna ovan. Märke hur mycket bättre den Arduino följer signalen jämfört till den sista steg. I figur 2 kan du se att steget är ner till 26us (jämfört med 125us när du använder analogRead). Igen kan du se effekterna av klippning på 0V och 5v i fig 3.
Koden för samplingsfrekvens på 38,5 kHz med DAC utgång ges nedan.
Ljud ut med 38,5 kHz samplingsfrekvens och DAC utgång
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.
*
*/
void setup() {
för (byte jag = 0; jag < 8; i ++) {
pinMode(i,OUTPUT);
}
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 << ADEN); Aktivera ADC
ADCSRA | = (1 << ADSC); Starta ADC mätningar
Om du vill lägga till andra saker i setup(), göra det här
}
void loop() {
PORTD = ADCH; //send 8 bitars värde från analoga stift 0 till DAC
}