Generador PWM de 10 bits de alta velocidad (>30 KHz)

Estoy buscando una manera de generar una señal PWM de alta velocidad en un IC de controlador de puerta de entrada de alta impedancia. Esto se usaría para reemplazar un generador de forma de onda de banco de laboratorio. Preferiblemente, usaría algo como un Arduino para poder usar también el ADC y hacer mis comentarios digitalmente. Desafortunadamente, Arduino no tiene esa combinación de frecuencia y resolución.

La siguiente mejor opción sería un controlador PWM que se pueda controlar con algo como I2C, así que podría controlarlo con algo como un Arduino.

He mirado alto y bajo, pero hasta ahora estoy ponchando. Necesito al menos 10 bits de resolución porque mi ciclo de trabajo es bajo (3-5 %) y es relativamente sensible a pequeños cambios.

Cualquier microcontrolador decente (quizás incluso algunos arduinos) puede generar PWM a esta frecuencia.
@EugeneSh. En realidad, para lograr una salida de 30 kHz con el módulo HW PWM, en el modo Fast PWM, necesita, a 10 bits, 1024*30 kHz = 30,7 MHz de reloj PWM. Todavía hay muchos que lo permiten (incluso ATTiny), pero no es cualquier MCU decente . Y por inteligentes que sean, Arduino no ha construido plataformas Tiny o XMega que lo hagan realmente fácil de hacer. Por lo que puedo ver. Aunque el Mega328 en el Pro y el Pro mini permiten una gran cantidad de PWM de tamaño variable, pueden llegar hasta 500 kHz con unos pocos bits y 19 kHz con 10 bits y cualquier otro número.
Para ampliar lo anterior: parece que Arduino Zero y Due pueden hacerlo, ya que ejecutan un núcleo ARM a> 40 MHz. Pero, a 8 bits HW (10 bits se pueden hacer con un firmware inteligente), el Tiny45 puede hacerlo a 250 kHz, con su reloj periférico rápido de 64 MHz, PLL incorporado.
@Asmyldof Parece que Arduino Due tiene una frecuencia de reloj de 84MHz. Hasta donde yo sé, si configuro la resolución en 10 bits, la frecuencia PWM será un conjunto de 84 MHz/1024 = 82 KHz. ¿Habría entonces una forma de ajustar la frecuencia a algo así como 60 KHz? O si lo configuro para 11 bits (84 MHz/2048 = 41 KHz), ¿puedo ajustar la frecuencia a 30 KHz?
LTC6992 utiliza analógico como entrada para generar PWM.

Respuestas (4)

Dado que Arduino Due se mencionó anteriormente (y aún no puedo comentar), lo mencionaré aquí.

En Arduino Due, puede usar el módulo de comparación para PWM, por ejemplo. Al cambiar el "TOP" (lo que cuenta el temporizador, esto establece la frecuencia) usando el registro RC en el chip AT91SAM, puede ajustar la frecuencia (y la resolución). Para obtener 30 kHz, termina teniendo una resolución de más de 10 bits (con un preescalador de 1:1).

Veo que también hay un bloque PWM separado en el chip. No he jugado con eso, pero la hoja de datos debería revelar más.

Sí, parece que puedo configurar el preescalador en 64 para reducir el reloj de 84 MHz a 1,3125 MHz. Dividido por 256, que es aproximadamente 5 KHz por, entonces podría configurar el "superior" en 6 para obtener 30 KHz. ¿Eso suena bien? Y luego, ¿sabe si puedo establecer la resolución del ciclo de trabajo usando analogWriteResolution() para establecer el ciclo de trabajo en 10 bits de precisión?
TOP limita su resolución ya que su temporizador cuenta hasta ella. Su resolución es log2 (TOP). Desea que TOP sea al menos 1023 para tener una resolución de ciclo de trabajo mínima de 10 bits. Para analogWriteResolution(), aquí hay algo de información: arduino.cc/en/Reference/AnalogWriteResolution Para el Due, no parece que pueda establecer la resolución en 10 bits. Hace tiempo que no uso este chip. Podría escribir un código de demostración simple si puedo encontrar mi Due.
Básicamente, solo necesito que la salida PWM tenga un ciclo de trabajo que pueda variar entre aproximadamente el 3 % y el 10 % en incrementos del 0,1 % o menos. Este PWM debe tener una frecuencia de 30 KHz, e idealmente podría variar entre 30 KHz y 60 KHz en incrementos de 10 KHz. ¿Esto va a ser posible con el Due?

Varios microcontroladores pueden hacer esto. Desea PWM de 30 kHz con 10 bits de resolución de ciclo de trabajo. Eso significa que el generador PWM necesita un reloj de (30 kHz)(1023) = 30,7 MHz. Un dsPIC 33 o PIC 24 de la serie EP puede funcionar y sincronizar sus generadores pwm a casi el doble de esa frecuencia. También hay algunos generadores PWM de "alta velocidad" disponibles en estas partes que tienen su propio oscilador y PLL, y ejecutan el PWM a aproximadamente 1 GHz.

Lo que estás pidiendo realmente no es tan exótico.

Sé que un PWM de 30 KHz a 10 bits no es exótico, pero estoy tratando de encontrar una solución relativamente simple. Tengo experiencia tanto con PIC como con PSOC, pero preferiría encontrar una solución simple que tener que escribir el firmware. ¿Está familiarizado con alguno de estos generadores PWM de alta velocidad que se pueden controlar con algo como I2C o uART? Prefiero usar un circuito de retroalimentación digital.
Esto es casi idéntico a la respuesta que iba a dar. @BrettPrudhom realmente no hay trabajo que hacer con este periférico más que configurarlo. Simplemente escribe el deber requerido en un registro y listo. Lo he usado para el control de motores. Puede obtener 15 bits a 30 kHz. Ideal para un generador de forma de onda. Esto es mucho más fácil que escribir una interfaz de comunicaciones para enviar instrucciones a un dispositivo externo a través de I2C, etc.

No es la solución más elegante, pero los controladores LED disipadores actuales son una opción si necesita un chip que proporcione una salida PWM sin terminar con muchos canales. Simplemente puede usar una resistencia pull-up para subirla si decide hacer esto.

Como se indicó anteriormente, hay varios micros que pueden hacer esto, por ejemplo, la mayoría de los ARM. Tienden a tener también algunos ADC integrados y algunos temporizadores de alta resolución que funcionarán a decenas de MHz.

Sin embargo, si sabe que su ciclo de trabajo siempre es "bajo", entonces en realidad no está usando 10 bits de resolución. Suponiendo que tiene un filtro de salida que convierte el PWM en un voltaje analógico, un PWM de 8 bits le dará una resolución 4 veces más gruesa que 10 bits en un rango de voltaje fijo... o la misma resolución en 1/4 del rango de voltaje .

Si su ciclo de trabajo siempre está por debajo de 1/4, puede usar un PWM de 8 bits a 8 MHz con un filtro y luego reducir la salida 4 veces usando un opamp, un divisor de voltaje o lo que sea. Eso le daría 31250Hz sin necesidad de un temporizador más rápido y más amplio.