Generación de una onda sinusoidal en un gran rango de frecuencia

Quiero construir un circuito que pueda generar ondas sinusoidales a frecuencias controladas por una computadora o un microcontrolador. Me gustaría ir tan bajo como 0,01 Hz (probablemente hasta 0,05 Hz sería aceptable) y tan alto como 100 kHz; Necesito al menos 10 frecuencias por década, que es una resolución de aproximadamente 12 MHz en la parte inferior de la escala (o 60 MHz si la parte inferior es de 0,05 Hz). El voltaje de salida no necesita ser alto; de todos modos, después lo pasaré por algunos amplificadores operacionales.

¿Cuál es la forma estándar de hacer esto? ¿Es DDS el camino a seguir (utilizando una tabla de búsqueda de seno en un uC o un IC como el AD9850)? ¿Hay una solución analógica simple que me falta?

Me encantaría ceñirme a las partes de orificio pasante si puedo.

Mi reacción instintiva sería usar un DDS para esto. Por cierto, ¿cuál es la resolución deseada en frecuencia?
Sí, para el extremo de baja frecuencia puedes olvidarte del analógico. Siempre hay un transitorio/encendido con un oscilador analógico. Durará al menos unos pocos ciclos. Por ~$400, Rigol hace una buena firma. gen. eso hace milihercios a 20 MHz.
Las técnicas de generación de onda sinusoidal AN-263 de TI tienen un buen "menú" en la página 4 desde el que puede elegir su favorito según la frecuencia. rango. Para el tuyo hay varios diseños posibles. La distorsión y la estabilidad también se encuentran entre los factores a considerar al elegir una solución (pero no ha tocado eso).
@NickAlexeev: agregué información sobre la resolución. Necesito al menos 10 puntos por década, por lo que el segundo punto más bajo es ~12 mHz más alto que el más bajo.
Por desgracia, su requisito de tener un rango de barrido de 10M: 1 (así es como interpreto "controlado por computadora") excluye la mayoría de los clásicos analógicos de un solo chip como el XR-2206, ICL8038 y demás (la mayoría de los cuales han quedado obsoletos por sus fabricantes, pero aún se pueden encontrar como excedentes)... a menos que pueda vivir con múltiples ollas de ajuste como se muestra, por ejemplo, en youtube.com/watch?v=KPtsgFw5Fno Presumiblemente, podría construir los equivalentes microcontrolados de esas ollas, pero no es tan fácil como enviar bits a un DAC. Por otro lado, estos viejos están disponibles en DIP.
Si entiendo correctamente el "rango de barrido", creo que eso es lo que necesito. Me imagino un microcontrolador enviando un par de bits y apareciendo una onda sinusoidal hasta que el uC le dice que cambie de frecuencia. Los potenciómetros controlados manualmente no son útiles aquí y los potenciómetros controlados digitalmente suenan como una excelente fuente de frustración.
¡Gracias por todo el esfuerzo @Fluff! Echaré un vistazo de cerca a estas opciones tan pronto como tenga la oportunidad.

Respuestas (4)

Podría hacer fácilmente un DDS altamente flexible en una placa Discovery STM32F4 por ~ $ 15 usando un DAC interno, DMA, un temporizador y una tabla de búsqueda de seno. La gente ha blogueado ejemplos de cosas similares si las buscas.

Para obtener la frecuencia requerida (los DAC STM32F4xx solo pueden hacer 300ksps a pleno rendimiento, lo que equivale a ~1V/ m s) deberá restringir el rango del DAC.

Para una sinusoide, la velocidad de respuesta máxima (en V/s) es 2 π × F × A . Insertando los valores de los requisitos del OP y suponiendo que Vref del DAC es de 3,3 V (que, si recuerdo correctamente, es el caso de un STM32F4Disco), una onda sinusoidal de 3,3 Vpp a 100 kHz, la velocidad de giro máxima es 2 π × 10 5 × 3.3 / 2 = 1036726 V/s, o 1.04 V/ m s.

Para cumplir con esta restricción, la amplitud de la onda sinusoidal tiene que ser limitada, de 3.3 V a 3.3 × 1 / 1.04 = 3.18 v

Esto ahora trae el problema aparente del límite de 300 ksps en el DAC STM32F4. Ese límite es un furphy. No sé cuál es el límite superior físico real, pero sospecho que es la velocidad del bus APB1. Sé (porque lo he hecho) que puede escribir al menos 2Msps en el DAC y, siempre que respete la velocidad de respuesta de 1V/us, se comportará de manera predecible. Por lo tanto, puede hacer 16 muestras por ciclo para una onda sinusoidal de 100 kHz, una tasa de actualización de 1,6 Msps, siempre que limite la amplitud de la onda sinusoidal a 3,18 V en lugar de 3,3 V.

En algún momento, probablemente tendrá que lidiar con potenciómetros digitales porque la realidad es que si desea una señal de salida continua y suave, especialmente a baja velocidad, entonces tendrá que pasar su DDS por un filtro, y ese filtro tendrá que ser ajustable: no puede simplemente ponerle un LPF de 100 kHz y esperar que sea útil en frecuencias inferiores a 1 Hz.

Gran información. Tiene razón sobre el filtro de paso bajo: tendré que experimentar y ver qué funciona para el rango de sub-1 Hz.
Hmmm, ¿Rigol y otros kits económicos realmente intentan y LPF las cosas de mili-Hz? A 10 bits, ¿qué tipo de TC necesito para 1 Hz? (¿~1ms?) ¿Y el filtro no hace también un cambio de fase?
@GeorgeHerold No tengo información sobre cómo (o si) Rigol se ocupa del filtrado. TC?
Oh, lo siento, por supuesto que no. ¿Alguien filtra ondas sinusoidales DDS de miliHz? CT = constante de tiempo. (R*C) (Miraré el rigol mañana.)
Pensé que te referías a la constante de tiempo, pero es mejor estar seguro... ¡la respuesta corta es muy larga! Recambio de fase, sí, por supuesto, pero lo fundamental es un tono puro (excepto cuando cambias las frecuencias), por lo que el cambio de fase no debería importar. Aunque depende de la aplicación.
Bueno, no puedo decir que no me guste esta solución, porque la estás convirtiendo en un problema de software. Un DDS también consta de una búsqueda sinusoidal y DAC, pero básicamente tiene el "software" de barrido de tablas codificado en su ASIC. Si ya tiene un uC compatible, un DDS en una placa de circuito impreso/blindaje cuesta alrededor de $5... pero, por otro lado, si ya tiene un uC con DAC incorporado, el costo es de $0 (porque el software es gratuito).
Después de pensar un poco más en esto, parece haber un problema serio con la velocidad del DAC. Con 300KSPS, solo puede generar como máximo 3 voltajes diferentes por período a 100KHz. Y no veo cómo se puede dar forma a una onda sinusoidal de aspecto razonable con una frecuencia de muestreo tan baja. En el mejor de los casos, tendrá forma de triángulo. No veo cómo se puede corregir eso con etapas analógicas posteriores a menos que implemente un convertidor de triángulo a seno ... que básicamente hace que el uso de un DAC sea discutible.
@RespawnedFluff El DAC solo puede funcionar a 300ksps a pleno rendimiento , por lo que para Vref = 3.3V tiene una velocidad de giro máxima de ~ 1V/us. Una onda sinusoidal de 3,3 Vpp a 100 kHz tiene una velocidad de respuesta de ~1,04 V/us, por lo que al restringirla a un rango de 3 Vpp puede alcanzar el límite de 1 V/us. De hecho, mencioné esto (con menos detalle) en mi publicación; Lo editaré para expandir el punto.
Con respecto al filtrado, puede ser posible usar un lpf de frecuencia fija sintonizado para las frecuencias altas y difuminar el caso de frecuencia más baja a alta frecuencia. Es decir, si se supone que el valor de salida es, digamos, 4,3 lsb, envíe 4454454445 a dac. Esto también aumenta la resolución.
@NicolasD Ese es un buen uso de sigma-delta, gran idea.
Por cierto, ST tiene una nota de aplicación #AN3126 sobre cómo hacer exactamente esto (generación de formas de onda, incluida la onda sinusoidal) usando el STM32.

Aquí está mi (RF) resumen aproximado de la solución DDS, que inicialmente fue sugerido por Nick Alexeev. Estoy marcando esto como wiki de la comunidad, así que siéntete libre de mejorar con detalles, etc.

Usando la calculadora de AD , para obtener el equilibrio deseado entre la resolución de frecuencia de 12 MHz (que simplemente redondearé a 10 MHz) y una curva resnoblemente suave a una salida de 100 KHz, necesita un reloj DDS de 10 a 40 MHz, con 20 MHz que parece un buen término medio Con un reloj inferior a 10Mhz, la salida del DDS a 100KHz comienza a parecer bastante ruidosa. En relojes superiores a 40Mhz, la resolución se vuelve demasiado gruesa; con un reloj de 40 MHz, obtiene un cambio de poco menos de 0,01 Hz por cada bit de sintonización, en el rango bajo, por supuesto; siendo la palabra de sintonización un divisor de reloj, produce una curva de frecuencia no lineal.

En cuanto a las soluciones prácticas, uno puede encontrar chips DDS ya montados en protectores compatibles con Arduino (parece que cuestan alrededor de $ 5); Sin embargo, el problema es que pueden venir con un reloj fijo (y posiblemente inadecuadamente alto), pero eso se puede mejorar con un poco de trabajo en el tablero.

También vale la pena mencionar que si uno está usando un microcontrolador (uC) que tiene un DAC incorporado y lo suficientemente rápido, entonces agregar un DDS (que es básicamente un ASIC que barre una tabla de búsqueda sinusoidal y envía ese valor indexado a un DAC) es bastante inútil ya que la búsqueda de seno se puede implementar en el software uC. Para obtener más detalles sobre este enfoque de DAC integrado, consulte la respuesta de Markt.

He usado un diseño para un oscilador no digital que produce senos decentes por debajo de 0,1 Hz y por encima de 100 kHz. En teoría, era un circuito sintonizado en paralelo LC en la ruta de retroalimentación de un amplificador. La L y la C eran en realidad circuitos giratorios de precisión (es por eso que podían sintonizarse a frecuencias de resonancia tan ridículamente bajas). Nunca construiría uno con inductores reales y, si lo hiciera, no sería sintonizable.

Tanto "C" como "L" se mantuvieron en seguimiento mediante el uso de un potenciómetro de doble banda de precisión y, si no recuerdo mal, se podía obtener un rango de frecuencia de más de 50:1 del potenciómetro antes de cambiar los condensadores fijos en los giradores.

Los potes, por supuesto, estarían mejor atendidos por digipots en estos días, ya que estos pueden "seguir" mucho mejor que los potes normales. Estoy seguro de que con cuidado, podría funcionar hasta 0,01 Hz.

Inductor giratorio: -

ingrese la descripción de la imagen aquí

Hay giradores de mayor calidad (mejor respuesta de frecuencia) y aquí hay otro enlace a un documento sobre un tipo diferente de girador. La belleza del girador de amplificador operacional único en esta aplicación es que la red CR (como normalmente se pretende que sea parásita) se puede usar de manera efectiva como la sección de sintonización que hace que L y C estén en paralelo a través de resistencias en serie pequeña.

Nunca he oído hablar de giradores antes. Esto es realmente genial, pero suena mucho más difícil de hacer bien que una solución DDS.
Echa un vistazo a las adiciones y el enlace.
Ese enlace es extremadamente útil. Todavía tengo un poco de miedo de intentar hacer esto en el mundo analógico, pero parece información útil.
Claro, esta es una de las varias soluciones analógicas que funcionaría... pero va a ser tan difícil de conectar a una computadora como un XR-2206, etc., que Kynit rechazó de inmediato en los comentarios debajo de su pregunta. . ¿Hay giradores controlados por DAC que facilitarían su aplicación?
Los digipots @RespawnedFluff permitirían el control como se dijo en mi respuesta.
Creo que los potenciómetros digitales funcionarían aquí. Simplemente creo que sería más feliz con los temporizadores y las interrupciones que con algo con lo que no estoy familiarizado. Esta parece una gran solución que puede funcionar tan bien como DDS para alguien con un poco más de experiencia en diseño de filtros que yo.
@Kynit tus habilidades y experiencia son un factor importante, por supuesto
Supongo que Kynit cambió de opinión sobre los potenciómetros digitales. Hace 17 horas escribió "las ollas controladas digitalmente suenan como una excelente fuente de frustración".
Por el costo de aproximadamente ~5.5 potenciómetros digitales más baratos (a 40 centavos de dólar cada uno en más de 3000 pedidos) ofrecidos por DigiKey, puede comprar el DDS más barato (alrededor de $2.20 en más de 1500 cantidades, máximo 16Mhz) pero que funcionaría aquí, por lo que el análogo La solución que controlarían los potenciómetros digitales tendría que ser sobresaliente para que valiera la pena. (Los precios unitarios para pedidos de DYI/1 pieza son más altos para ambos, por supuesto... y seguro que hay variaciones de precio entre los distribuidores, pero creo que este es un buen punto de referencia). Entonces, después de ver el lado del costo relativo, creo que Vea por qué los antiguos circuitos integrados analógicos de generación de funciones han sido eliminados del mercado.

Un enfoque sería sincronizar un sumador/acumulador de 28 bits con un reloj de 4 Mhz. Un uController maneja los 20 bits de orden bajo con una palabra digital y los ocho bits superiores alimentan direcciones a un eprom para una tabla de búsqueda de seno de 256 entradas. Los bits de datos del eprom sumados en una escalera R2R se acoplarían capacitivamente a la etapa de ganancia de su amplificador operacional. Conduzca un valor alto del micro al sumador y los bits de alto orden se ciclan más rápido, para una onda sinusoidal de mayor frecuencia. Un valor bajo requiere mucho más ciclo de reloj para hacer un conteo en los ocho bits superiores que impulsan el eprom. Con un poco de trabajo extra en el microsoftware; puede hacer que la tabla eprom sea más pequeña simplemente almacenando ángulos desde 0 grados hasta 90. Simplemente lea la tabla hacia adelante para los primeros 90 grados (cuadrante 1) y luego hacia atrás para el cuadrante 2 hacia adelante nuevamente para el cuadrante tres, etc.

Supongo que el "punto de venta" de esta solución es evitar comprar/usar un DAC IC y, en su lugar, implementarlo como esa escalera R/2R.
@RespawnedFluff Sin argumento de venta. Acabo de pensar en este enfoque debido al comentario de las partes del orificio pasante.
Bueno, los DAC en paquete DIP todavía están disponibles para la venta de varios fabricantes...
Entonces, ¿estoy usando un temporizador a bordo del uC para incrementar un contador del uC para determinar qué voltaje emitir? ¿Por qué no mantenerlo todo a bordo? ¿Y por qué una escalera en lugar de un DAC?