Paso 7: Simple panorámica circuito con Arduino
//stereo pan with 44.1kHz sampling rate //by Amanda Ghassaei //Nov 2012
Este código de salidas de 440hz ondas sinusoidales a dos salidas estéreo. Cuando el potenciómetro se gira hacia un lado, una de las salidas será a máxima amplitud y la otra será línea plana a 0 (Fig. 2). El potenciómetro se gira en sentido contrario, disminuirá la amplitud de un canal y el otro irá hasta el canal que fue previamente guarnición plana es en amplitud completo y el otro canal es a 0 (Fig. 3-6).
Este código es bastante simple, pero utiliza algunos trucos para maximizar la eficiencia de la que voy a explicar un poco más aquí. Como en el paso 4, he sustituido todos los comandos digitalWrite() con PORTB & = y PORTB | = comandos. Hice esto puramente por razones de velocidad (cuando se trabaja con interrupciones de 88kHz, usted necesita trabajar rápidamente), y los comentarios de cada una de estas líneas da su comando equivalente de la biblioteca Arduino. por ejemplo la línea:
PORTB & = B11111011;
es equivalente a:
digitalWrite(WR,LOW);
donde WR = pin digital 10
más información acerca de cómo funcionan estos comandos puede encontrarse en la Página Web de Arduino. La función checkPan() comprueba el estado del potenciómetro pan. Puesto que no es crítica para medir este bote en un de alta frecuencia, sólo llamé a la función en el loop() principal en lugar de la interrupción. El contenido de checkPan() se repite a continuación:
pan = analogRead(A0);
pan = pan >> 3; //convert de 10 bit a 7 bit (0-127)
panA = pan;
panB = 127-pan;
En primer lugar la bandeja variable se encuentra a la salida de analogRead(A0). El analogRead() función siempre devuelve a un número entre 0 y 1023 - un número de 10 bits. No creo que tal alta resolución era necesario para lo que estaba haciendo, así que reduje la resolución de este número a 7 bits en la segunda línea para que sea un poco más manejable. Ahora en vez de ser un número entre 0 y 1023, Panamericana ha sido reducido entre 0 y 127. Hice esto con un simple cambio de poco, también podría hacerlo con alguna divisióno la función de mapa, todos tienen el mismo resultado (pero el cambio de broca es la manera más rápida de hacer esto). Ahora que tengo un valor entre 0 y 127, pan, hice algunos resta simple para calcular la amplitud para enviar a DACA y DACB y asignar estos valores a panA y panB.
En la rutina de interrupción reemplacé la salida sinusoidal simple del paso 4:
PORTD = seno [2];
con una producción ha escalado:
PORTD = (sine[index2]*panB) >> 7;
esta línea es funcionalmente equivalente a los siguientes:
PORTD = (seno [2] * panB) / 127;
pero ya que utiliza un cambio de bit en lugar de la división, es mucho más eficiente. Esto es muy importante en la alta frecuencia interrupciones, de hecho, la línea anterior se ralentizará la interrupción tanto que no será capaz de ejecutar completamente antes de que sea tiempo para una nueva interrupción empezar. Utilizando este truco de cambio de broca es la única manera de obtener el código para que funcionen correctamente.