Procesamiento de frecuencia

0

Estoy realmente perdido. Necesito un poco de ayuda y una redirección. Estoy tratando de hacer un sintonizador cromático usando AT89C2051. Mi proyecto solo sería desde C1 hasta B5.

La señal sería desde un cable o un conector estéreo.

Usaré el ADC0848 para la conversión.

He estado leyendo sobre cómo funciona la frecuencia pero parece que no puedo entender muchas cosas. Si mi ADC y MCU son solo de 8 bits. ¿Cómo puedo determinar la frecuencia de la entrada en el código o dentro de la MCU?

Lo siento si esta es una pregunta muy tonta. No soy un estudiante de ingeniería ni nada.

    
pregunta Warren Gojar

2 respuestas

1

Tenga en cuenta que un convertidor analógico a digital le da una lectura instantánea del voltaje (bueno, le toma tiempo hacer lo que haga ...) Le da una lectura ahora, ahora, ahora, ahora, ahora, etc. Y podría obtener lecturas como -200 , -100 , -20 , +50 , +75 , +60 , +10 , -40 .

La frecuencia depende del tiempo. Si obtuviera las lecturas anteriores, podría interpretar que el voltaje máximo estaba alrededor de +75 (cualquiera que sean las unidades), y que la onda cruzó la marca 0 entre la tercera y cuarta lectura, subiendo, y la séptima y Octava lecturas, bajando. Si quisiera saber cuál era la frecuencia, tendría que saber a qué hora ocurrieron esos cruces. A partir de eso se puede calcular la frecuencia de la ola. ¡No olvide que debe calcular la diferencia en tiempos entre dos pasos ascendentes o dos hacia abajo!

En el piano, C1 es 32.703 Hz. B5 es 987.77 Hz. Eso no es tan malo: si muestreaste la ola 4,000 veces por segundo (¡mínimo! Mira "tasa de Nyquist" si quieres las matemáticas) podrías hacer ese tipo de cálculos de cruce por cero para obtener un conteo de frecuencia razonable. Sin embargo, ¡más muestras por segundo siempre son mejores!

Pero personalmente utilizaría el comparador analógico incorporado del AT89C2051. P1.0 y P1.1 se pueden configurar para comparar continuamente dos voltajes analógicos. Cuando P1.0 > P1.1 entonces P3.6 es un 1 . De lo contrario es un 0 . Por:

  1. Asegurarse de que la forma de onda muestreada en P1.0 está compensada en VCC/2 , y no se enlaza con VCC o GND ;
  2. Usando un divisor de voltaje 50/50 en P1.1 ;
  3. Pedirle a la MCU que interrumpa cuando P3.6 cambia;

entonces puede obtener la detección de cruce por cero para "gratis". Luego puede leer el temporizador en cada interrupción y hacer los cálculos para obtener la frecuencia.

Por supuesto, eso requiere que el hardware esté conectado correctamente, que el temporizador esté configurado correctamente, que el Comparador analógico esté configurado correctamente y que la interrupción esté configurada correctamente ... y luego pueda calcular y mostrar la frecuencia! O incluso mejor, convierta esa frecuencia a un valor de nota usando una tabla de búsqueda.

    
respondido por el John Burger
1

Cálmate.

Primero, use una MCU que tenga disponible una biblioteca de C bien establecida, entonces no debe preocuparse por las limitaciones de '8 bits'. A simple vista, parece que C está disponible para el 8051 que has elegido.

Luego lea sobre la estimación del tono, este es el artículo de wikipedia sobre él.

Por lo general, es mucho más fácil desarrollar su algoritmo de detección de tono en su PC, ya sea en C, o en un lenguaje de nivel superior como python o Matlab, antes de transferirlo a la MCU.

Al principio, no se preocupe por usar un algoritmo que sea lo suficientemente pequeño como para portar al pequeño espacio de direcciones del AT89, solo haga que algo funcione. Es mucho más fácil modificar un programa de trabajo existente, que escribir uno desde cero en un tamaño objetivo. Es mucho más fácil comparar un nuevo enfoque con uno de trabajo que intentar depurarlo por sí mismo.

Comience poco a poco con la MCU también. Solo capture algunas muestras, luego envíelas a la PC para su procesamiento.

Buena suerte

    
respondido por el Neil_UK

Lea otras preguntas en las etiquetas