Paso 6: Velocidad de ~ 40kHz de muestreo
Aquí está la explicación sencilla (todo lo que necesita saber por ahora):
Básicamente en la función setup() me dicho el Arduino que lo quiero para continuamente medir pin A0 y olvidarse de las otras entradas analógicas todos juntas. Así que mientras otras cosas están pasando en la función loop(), Arduino constantemente está actualizando una variable llamada "ADCH" con nuevos valores de A0 a una frecuencia de 38,5 kHz (que es uno cada 26us de la muestra, se puede ver en la Fig. 2). Cuando quiero conseguir uno de estos valores que solo puedo configurar una variable igual a ADCH, o como he escrito en mi código:
incomingAudio = ADCH;
Tuve que bajar la resolución de estas mediciones analógicas un poco para conseguir una mayor velocidad de muestreo. En el último paso que estábamos usando analogRead() para medir el voltaje de la señal como un valor entre 0 y 1023, ahora estos valores siempre estará entre 0 y 255. Monitoreo continuo de A0 significa también, que los otros pines analógicos son ahora inútiles, pero si usted realmente necesita medir un potenciómetro o un sensor, revisa cómo puede hacer él con un pin digital usando RCTime es 's posible que los pines analógicos todavía pueden ser utilizados como pines de I/O digitales, pero que realmente no he probado esto todavía, deja un comentario si lo intentas!
La complicada explicación (no es necesario, pero para aquellos que estén interesados):
Puse manualmente analógico interno de Arduino al convertidor digital (ADC) en contra de 500kHz y leer un valor de 8 bits de entrada analógica 0 de la ADCH directamente (acabo de leer los 8 bits más significativos de la ADC de 10 bits para ahorrar tiempo en el código). Fije el contador del ADC a 500kHz porque el ADC tiene 13 ciclos de reloj para leer un nuevo valor analógico. 500/13 = ~ 38,5 kHz que me pone bastante cerca de 40KHz (frecuencia de muestreo de audio estándar) sin introducir ruido adicional. Como se puede ver en la figura 2, este da me una muestra cada 13/500000 = 26us. Muchas de las ideas aquí (prescalers y contadores) son similares a la configuración de interrupciones del temporizador de Arduino, y usted puede leer más acerca de lo que funciona aquí.
Como en el paso anterior, envié los valores de la variable "incomingAudio" a un DAC de 8 bits por lo que pude visualizar los datos como estaba siendo almacenado en el Arduino. Puedes ver la señal de entrada (amarillo) y la salida del DAC (azul) en las imágenes de arriba. Observe cuánto mejor el Arduino sigue la señal en comparación con el último paso. En la figura 2 puede ver que el tamaño de paso es hasta 26us (en comparación con 125us al usar analogRead). Otra vez vemos los efectos del recorte en 0V y 5v en la figura 3.
El código de velocidad de muestreo de 38,5 kHz con salida DAC se expone a continuación.