Cómo generar PWM desfasado de 4 canales con una frecuencia de 150 kHz

Estoy diseñando una PCB en la que necesito generar 4 señales PWM 'independientes':

  • Todos alimentados con el mismo reloj.
  • Frecuencia fija, cualquiera entre 97kHz y 150kHz (idealmente)
  • Al menos 256 pasos del ciclo de trabajo (más - mejor)
  • Todo con horarios de encendido y apagado independientes.
  • No va a conducir LED, por lo que no puede ser una solución de corriente constante

PWM

Al principio estaba mirando PCA9685. Se adapta a todas mis necesidades, excepto la frecuencia máxima = ~2kHz, que es 50 veces menor.

Luego, se me ocurrió PCA9635, que es lo suficientemente rápido (97kHz máx), sin embargo, no permite establecer tiempos de encendido y apagado independientes.

Mi siguiente idea fue usar dos señales PCA9635 para cada canal y poner compuertas lógicas y flip-flops para habilitar la salida por pendiente de las primeras señales y deshabilitar por segundos. Sin embargo, esto va a ser muy complejo, ya que el pestillo SR activado por borde consta de al menos 8 puertas.

En este momento también tengo atmega88pa a bordo, así que:

  • Estoy buscando algo con interfaz digital (spi/i2c/...)
  • No puedo usar el temporizador incorporado porque su resolución y frecuencia son demasiado bajas
  • No puedo usar bit-bang porque el uC tiene otras tareas
¿ADP1046 o su hermano mayor?
¿Para qué es esto? Un pequeño FPGA sería bueno para esto. O mira los chips PLL.
@winny, ¿puedo usarlo como un generador PWM, nada más?
Cosa segura. Son muy flexibles. Si desea programar libremente los cuatro canales, necesita el hermano mayor de la misma serie. Si no planea cambiar, cambiar de fase y regular, quizás sea mejor con una MCU o FPGA rápida. Son más baratos pero se tarda más en empezar. Los ADP son caros pero muy fáciles de poner en marcha.

Respuestas (2)

Así que se me ocurrieron soluciones yo mismo.

En lugar de atmega88pa, voy a usar AT90PWM3B . Tiene 3 'Controladores de etapa de potencia', cada uno implementado como generador PWM de alta frecuencia de 12 bits doble, alimentado por PLL de 64 MHz.

Con una frecuencia de 150 kHz, puedo obtener ~ 450 pasos.

Todas las etapas de potencia se pueden sincronizar, cada canal tiene un valor S(et) y R(eset).

Podrías considerar un 25 METRO H z MSP430 con un temporizador B7. (El temporizador B es bastante elegante y en muchas partes incluye 7 registros separados de captura/comparación vinculados a un contador). 97 k H z × 256 = 24.832 METRO H z , por lo que esto sugiere que es factible con estas piezas MSP430. Algunos pueden funcionar 32 METRO H z cristales, también, lo que permitiría una frecuencia más alta. (O una fuente externa puede suministrar ese reloj). Entonces, hay algún margen disponible. (Puede haber algunos aún más rápidos que no conozco en este momento). Si sigue esta ruta, DEBE seleccionar un dispositivo con un temporizador B, ya que son los únicos que conozco que admiten cuatro o más capturas/comparaciones. fuera de un solo reloj.

La cadena de herramientas IAR Kickstart es completamente gratuita y es extremadamente buena, muy fácil de usar y admite ensamblaje, C y C++. Tendría que mantener el código bajo algún límite de tamaño cuando use C o C++, pero no hay límite con la codificación ensambladora, con su versión gratuita. El ensamblador también es de primera calidad, con todas las características que podrías desear.

Pero sería una cadena de herramientas separada para agregar y eso complica las cosas. También podría contratar esa tarea de software; para ser honesto, es realmente un proyecto fácil. Lo he hecho tantas veces que es casi factible mientras duermo, es así de fácil de lograr.

Esto permitiría que una sola pieza hiciera el trabajo. Necesitaría definir las comunicaciones, por supuesto. Pero eso es menor. Puede haber un cambio de fase notable, las salidas relativas a la fuente de reloj de conducción, si maneja el MSP430 desde una fuente de reloj externa.