¿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?
Busque DDS (síntesis directa digital) que utiliza un filtro de paso bajo como se menciona en las otras respuestas:
Luego usa una señal PWM variable para crear una onda sinusoidal:
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 .
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 digitalWrite
funció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 digitalWrite
puede 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)analogWrite
funció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?)
vicatcu