Stap 6: Sampling rate van ~ 40kHz
Hier is eenvoudige uitleg (alles wat je moet weten voor nu):
In principe in de Setup-functie heb ik verteld de Arduino dat ik wil continu meten pin A0 en vergeet over de andere analoge ingangen allemaal samen. Dus terwijl andere dingen in de loop-functie gaande zijn, de Arduino is constant het bijwerken van een variabele met de naam "ADCH" met nieuwe waarden van A0 met een snelheid van 38.5kHz (dat is een voorbeeld van elke 26us, u kunt zien in Fig. 2). Wanneer ik wil graag een van deze waarden die ik kan gewoon een variabele ingesteld op ADCH, of zoals ik schreef in mijn code:
incomingAudio = ADCH;
Ik heb om de resolutie van deze analoge metingen een klein beetje te krijgen een hogere samplefrequentie te verlagen. In de laatste stap gebruikten we analogRead() voor het meten van de spanning van het signaal als een waarde tussen 0 en 1023, nu deze waarden altijd tussen 0 en 255 zullen. Continue monitoring van A0 betekent ook dat de andere analoge pinnen nu nutteloos zijn, maar als je echt nodig om te meten een potentiometer (potmeter) of de sensor, Bekijk hoe kan je het met een digitale pen met RCTime It is mogelijk dat de analoge pinnen kunnen nog steeds worden gebruikt als digitale I/O pinnen, maar ik heb niet echt dit getest nog, laat een reactie als je het probeert!
De ingewikkelde uitleg (niet noodzakelijk, maar voor degenen die geïnteresseerd zijn):
Ik handmatig instellen van de Arduino interne analoog naar digitaal converter (ADC) strijd met 500kHz en een 8-bit waarde rechtstreeks inlezen van analoge ingang 0 van de ADCH (ik lees net de 8 meest significante bits van de 10 bit ADC om tijd te besparen in de code). Ik plaatste de ADC-teller aan 500kHz, omdat de ADC duurt 13 klokcycli om een nieuwe analoge waarde te lezen. 500/13 = ~ 38.5kHz die mij vrij dichtbij 40 kHz (standaard audio samplefrequentie krijgt) zonder invoering van extra geluid. Zoals u kunt zien in Fig. 2, dit geeft mij een voorbeeld van elk 13/500000 = 26us. Veel van de ideeën die hier (prescalers en tellers) zijn vergelijkbaar met de setup voor Arduino timer interrupts, en u kunt meer lezen over hoe dat hier werkt.
//Audio out with 38.5kHz sampling rate //by Amanda Ghassaei
Zoals in de vorige stap stuurde ik de waarden van de variabele "incomingAudio" uit een 8 bit DAC, zodat ik de gegevens visualiseren kan, zoals het was in de Arduino worden opgeslagen. U kunt zien het inkomend signaal (geel) en output van de DAC (blauw) in de bovenstaande foto's. Zoals u ziet hoeveel beter de Arduino volgt het signaal met de vorige vergeleken stap. In figuur 2 ziet u dat de stap-grootte neer aan 26us is (ten opzichte van 125us bij het gebruik van analogRead). Opnieuw kunt u de effecten van knippen op de 0V en 5v in fig 3.
De code voor sampling rate van 38.5kHz met DAC output is hieronder gegeven.
//Audio out with 38.5kHz sampling rate and DAC output //by Amanda Ghassaei