Cambio de frecuencia

2

Estoy intentando generar una señal que contiene solo varias frecuencias específicas que conozco de antemano, alrededor de (16.4kHz, 16.7khZ, 17kHz, ...)

la señal se genera mediante un microcontrolador, que luego envía una señal analógica a un altavoz.

El problema es que debido a las limitaciones de tiempo del chip, no puedo producir las frecuencias exactas que necesito, son desplazadas alrededor de 40Hz en alguna dirección. Estoy empezando a pensar que tal vez este método de generación no es el óptimo. mis preguntas son:

  1. ¿Podría pensar en una forma diferente, tal vez incluso completamente analógica (sin microcontrolador) para generar este tipo de señal?

  2. Sé que para cambiar las frecuencias por ejemplo, 40Hz, necesito multiplicarlo por un coseno (modularlo), pero luego se cambiará "izquierda" y "derecha", lo que hará que Cosas extremadamente incontinentes. ¿Existe otra forma sofisticada de lograr este tipo de cambio de frecuencia?

¡Gracias!

EDITAR: Actualmente estoy usando el microchip pic16F1783 @ 32MHz con DAC de 8 bits. Estoy creando una suma de senos "puros" en las frecuencias deseadas y luego produzco la onda. Las restricciones son del mundo digital: la frecuencia de muestreo está digitalizada, puede ser de 8MHz / entero, digamos 8M / 100 para obtener una frecuencia de muestreo de 80KhZ. Otra restricción es la memoria RAM. Creo la señal de antemano y la coloco en una matriz que no puede tener más de 450 elementos. Debido a todo eso, mi señal no se creó 16.4 sino a las 16.351

    
pregunta Daniel

4 respuestas

4

En principio, el DDS debe ser fácil de lograr en el software - acumulador fraccional, luego buscar el seno o el cos para cada tono que desee generar, luego sumar. Sin embargo, en un PIC, eso va a ser un circuito cerrado ...

Estoy asumiendo una LUT de 256 elementos que contiene un ciclo completo de una onda sinusoidal.

Cada período de muestra, para cada frecuencia, agregamos una fracción a la posición de su puntero en la LUT y tomamos la muestra en la parte (entera) de la posición. Para ilustrar lo sencillo que puede ser, jugué con una hoja de cálculo:

Fs  =   80000   
Fout=   16400   16700   17000
Fout/Fs 0.205   0.20875 0.2125
*256    52.48   53.44   54.4
integer 52      53      54
rem     0.48    0.44    0.4
*256    122.88  112.64  102.4
rounded 123     113     102
actual  16400.146   16700.439   16999.511

La operación real de DDS se traduce en pseudo-ensamblador (no PIC!) como

add acc1L,123
adc acc1H,52
lookup LUT,acc1h
mov sum, lookup result

add acc2L,113
adc acc2H,53
lookup LUT,acc2h
add sum, lookup result

add acc3L,102
adc acc3H,54
lookup LUT,acc3h
add sum, lookup result

out DAC,sum
wait for next sample period

que se expandirá considerablemente de lo que recuerdo del lenguaje ensamblador PIC, pero está empezando a parecer viable.

Recuerde que los valores en la tabla de búsqueda deben reducirse para que el resultado de la suma en "suma" no se desborde.

    
respondido por el Brian Drummond
3

Utilice un chip DDS (síntesis digital directa). Analog Devices tiene algunos, por ejemplo.

Generalmente controlado por SPI o I2C, puede configurar su frecuencia de salida usando su microcontrolador.

Pero si desea generar estas diferentes frecuencias al mismo tiempo en la misma señal, entonces un DDS no es el camino a seguir.

La forma más fácil de hacerlo, es generar las diferentes señales, una a 16.4kHz, una a 16.7khZ, ... y sumarlas (no multiplicar) usando un OPAMP.

Puede generarlos usando osciladores XTAL simples.

Otro método es calcular tu señal por adelantado. muestralo a algo así como 20 veces la frecuencia más alta. Luego almacena la muestra en un ram externo, flash o eeprom. Luego puede usar un diseño lógico simple (discreto, CPLD, FPGA, etc.) para enviar la muestra a un DAC. No olvide filtrar la salida DAC para eliminar el contenido de mayor frecuencia que aparece.

    
respondido por el Blup1980
2

La respuesta de Blup1980 es buena y bastante fácil (suponiendo que haya hecho esto antes) con una configuración de FPGA / DAC, o un par de chips DDS.

En el frente de la unidad de control, hay DSPs con múltiples periféricos DAC que vale la pena mirar, por ejemplo. El dsPIC33FJ64GP802 (y variantes) se ejecuta a 40 MIPS, tiene una capacidad de 16 bits DIP periférica De hasta 100kHz de salida IIRC. También hay DSPs mucho más poderosos, esto es solo un tema de reflexión.

    
respondido por el Oli Glaser
0

Si este problema es simplemente una cuestión de que su almacenamiento de LUT sea demasiado pequeño, la solución simple es almacenar solo un segmento de 90 grados de la forma de onda y luego obtener la muestra correcta mediante compensaciones de indexación (Fase), las inversiones de polaridad (cuadrante III y IV) y dirección del conteo (cuadrantes II, IV). Es importante que las muestras sean simétricas con respecto a la reflexión y NO contengan "O" o pico (que se pueden insertar si es necesario).

    
respondido por el placeholder

Lea otras preguntas en las etiquetas