¿Es posible emitir una señal sinusoidal con un Arduino?

¿Hay alguna forma de generar una onda sinusoidal con un arduino? ¿Quizás usando PWM? Sería bueno poder simular algo alrededor de 10kHz. ¿Es esto posible con el hardware del Uno?

Respuestas (3)

Busque DDS (síntesis directa digital) que utiliza un filtro de paso bajo como se menciona en las otras respuestas:

filtro de paso bajo

Luego usa una señal PWM variable para crear una onda sinusoidal:

rastreo de alcance

Todo lo que necesita para implementarlo con un Arduino, incluido el código fuente para el generador PAM, se puede encontrar en este artículo .

directamente, afirman ser capaces de generar ondas sinusoidales de hasta 16kHz ... no está mal

Sí, utiliza un filtro de paso bajo combinado con PWM. Cuanto menor sea el ciclo de trabajo, menor será el valor de su salida. Entonces modula su ciclo de trabajo como una sinusoide y pasa la salida PWM a través de un LPF. La salida del LPF será entonces una forma de onda sinusoidal, aunque tendrá una compensación de CC.

No es exactamente un Arduino, pero recuerdo un ejercicio de laboratorio específico que requería que hiciera esto en mi curso universitario de microcontroladores usando un AT90S8515, y según recuerdo, requirió algo de programación de ensamblaje para obtener la frecuencia en decenas de kHz ... en hecho aquí está la descripción del laboratorio .

Además de PWM + filtrado de paso bajo, otra forma es usar un DAC de escalera R-2R y controlar la salida con un PUERTO. Pero no obtendrá mucha frecuencia usando la digitalWritefunción. Como dije, como mínimo, deberá realizar asignaciones de puertos directos.

digitalWrite()no proporcionará la frecuencia para la escalera R-2R? ¿Es capaz de hacerlo para el método de filtrado de paso bajo PWM +, o hay un límite en la frecuencia en la que digitalWritepuede operar?
digitalWrite()es muy, muy lento... y es un "problema" bien documentado con el núcleo de Arduino. Ha habido mucha discusión en torno a esto en la lista de correo de los desarrolladores últimamente. La inadecuación para la escalera R-2R es que tendría que configurar cada pin con una llamada separada en lugar de cambiar todos los puntos de control de la escalera R-2R a la vez. Puede usarlo para hacer PWM "suave", pero nuevamente, a velocidades muy lentas en comparación con el PWM de hardware (es decir, usar los temporizadores de hardware como se hace en la analogWrite()función)
Y la analogWritefunción es en sí misma solo a 490 Hz, ¿verdad? Entonces eso significa que ninguna de las dos es una opción válida para las velocidades que necesitamos... (¿O me equivoco?)