Stap 7: Simple pannen Circuit met Arduino
//stereo pan with 44.1kHz sampling rate //by Amanda Ghassaei //Nov 2012
Deze code uitgangen 440hz sinusgolven uit beide stereo-uitgangen. Toen de potmeter is helemaal aan de ene kant, zal een van de uitgangen bij maximale amplitude en de andere zal flat-lijn op 0 (fig 2). Zoals de potmeter staat in de andere richting, de amplitude van één kanaal zal ingaan en de andere zal gaan tot het kanaal die was eerder platte-voering is bij volledige amplitude en het andere kanaal is bij 0 (fig 3-6).
Deze code is redelijk eenvoudig, maar het gebruikt een paar trucjes om te maximaliseren van de efficiëntie die ik een beetje verder hier uitleggen zal. Zoals in stap 4, heb ik alle opdrachten van de digitalWrite() vervangen door PORTB & = en PORTB | = opdrachten. Ik deed dit puur omwille van de snelheid (wanneer u met 88kHz onderbreekt werkt, moet u snel werken), en de opmerkingen van elk van deze regels geeft hun equivalent Arduino library commando. bijvoorbeeld de regel:
PORTB & = B11111011;
is gelijk aan:
digitalWrite(WR,LOW);
waar WR = digital pin 10
meer info over de werking van deze opdrachten vindt u op de website van Arduino. De functie checkPan() controleert de status van de pan-potentiometer. Aangezien het is niet essentieel zijn voor het meten van deze pot op een hoge frequentie, ik alleen de functie aangeroepen in de belangrijkste loop in plaats van de interrupt. De inhoud van checkPan() worden herhaald hieronder:
pan = analogRead(A0);
pan pan = >> 3; //convert vanaf 10 bit 7 bit (0-127)
panA = pan;
panB = 127-pan;
Eerst is de variabele pan ingesteld op de uitvoer van analogRead(A0). De functie analogRead() zal altijd een getal tussen 0 en 1023 - een 10 bit getal retourneren. Ik denk niet dat dergelijke hoge resolutie was noodzakelijk voor wat ik aan het doen was, dus ik verminderde de resolutie van dit getal naar beneden af 7 bit in de tweede lijn om het te maken een beetje meer beheersbaar. Nu in plaats van een getal tussen 0 en 1023, is pan verkleind om te passen tussen 0 en 127. Ik deed dit met een eenvoudige beetje shift, je kan dit ook doen met sommige verdeling, of de kaart van functie, ze hebben allemaal het hetzelfde eindresultaat (maar de verschuiving van bits is de snelste manier om dit te doen). Nu dat ik heb de pan, een waarde tussen 0 en 127, ik heb sommige eenvoudige aftrekken als u wilt berekenen van de amplitudes verzenden naar DACA en DACB en deze waarden toegewezen aan panA en panB.
In de interrupt routine verving ik de eenvoudige sinus output uit stap 4:
PORTD = sinus [index2];
met een vermogen dat vergroot of verkleind:
PORTD = (sine[index2]*panB) >> 7;
deze regel is functioneel gelijk aan de volgende:
PORTD = (sinus [index2] * panB) / 127;
maar aangezien het een beetje verschuiving in plaats van de divisie gebruikt, het is veel efficiënter. Dit is zeer belangrijk in hoge frequentie interrupts, in feite, de bovenstaande regel zal vertragen de interrupt zozeer dat het zal niet zitten kundig voor volledig uitvoeren voordat het tijd voor een nieuwe onderbreken om te beginnen. Het gebruik van deze bits shift truc is de enige manier om de code om correct te werken.