El hardware Arduino Nano / UNO podría generar dos señales PWM, con sus complementos, a 50Hz y 50kHz. El ATmeg328 contiene tres temporizadores de hardware, que pueden producir señales PWM de forma autónoma en un rango de frecuencias razonablemente amplio.
Sin embargo, la biblioteca estándar de Arduino no proporciona ninguna forma de controlar la frecuencia de los temporizadores, por lo que deberá comprender cómo usarlos directamente. Eso implica leer la hoja de datos de ATmega328 y tal vez hacer preguntas si tiene problemas.
Los temporizadores de ATmega328 no son ideales para esta tarea, pero existen varios enfoques prácticos.
Un temporizador tiene varias partes (un poco simplificado):
- ' Prescaler ' divide el reloj MCU para producir la tasa básica de 'tick'
-
Counter que, en combinación con el prescaler, establece la frecuencia fundamental de la señal PWM. Idealmente el contador puede ser
reinicie en cualquier valor de conteo para que, en combinación con el prescaler,
puede generar cualquier frecuencia.
-
El registro Compare / Match que establece la relación de señales PWM de alta a baja, y por lo tanto produce la señal para el generador de forma de onda
-
Waveform Generator que interpreta la señal de comparación / coincidencia para establecer un pin de salida alto o bajo, y por lo tanto, si la salida sigue la señal de comparación / coincidencia, o si es su complemento.
Los temporizadores de ATmega328 no son ideales. O bien pueden
- generar salidas complementarias, pero solo para frecuencias desunidas,
es decir, no puede producir todas las frecuencias posibles, hay
'agujeros' en el rango de frecuencia, o
- genera un mejor rango de frecuencias (agujeros más pequeños), pero solo para
un pin de salida.
Mientras no pasen muchas otras cosas, el problema 2 se puede superar utilizando interrupciones para activar el software y establecer los pines de salida complementarios. La cantidad de error ('jitter') se puede eliminar cuando no hay ningún otro procesamiento (con interrupción). La desventaja de este enfoque es que, si desea agregar un procesamiento adicional, o incluso simplemente depurar los mensajes, el jitter puede aumentar significativamente. Mi interpretación de sus niveles aceptables de deriva o jitter es que esto aún debería estar bien siempre y cuando no confíe en los mensajes de depuración.
Si está familiarizado con las MCU y la programación de C / C ++ en general, y solo es nuevo en Arduino, es posible que desee obtener una MCU mejor, con mejores temporizadores para el trabajo. Si este es el caso, y desea un factor de forma pequeño, le recomiendo que busque en las placas de desarrollo MCU compatibles con mbed. Mbed tiene un IDE y una biblioteca más difíciles de usar que Arduino. Sin embargo, proporciona mucho mejor acceso al hardware de MCU mucho mejores.
Como ejemplo concreto, mire ST Micro Nucleo-32. Pueden hacer todo lo que puede hacer con el hardware Arduino Nano y mucho más. Son más largos que un Arduino Nano, pero tienen un pin-out muy similar. ST Nucleo-32 son CPU ARM, y tienen temporizadores mucho mejores, que no solo deberían ser capaces de generar esas señales PWM con un pequeño error (mejor que +/- 0.1% para 50kHz) sino que también serán autónomos, por lo que no habrá fluctuaciones. Algunas partes ST tienen temporizadores que pueden generar un tiempo "muerto" entre las señales complementarias, lo que puede ser útil. Todos tienen ADC aproximadamente 100 veces más rápido o mejor que un Arduino Nano (Nano es peor que 10k muestras / segundo). Algunos también tienen varios comparadores analógicos y DAC, por lo que generar una señal de retroalimentación también puede ser mucho más fácil.