Así que he estado jugando con un ATtiny45, y se me ocurre que probablemente podría usar PWM de fuerza bruta al preescalar un temporizador a sysclock/64, luego ejecutar un código ISR que enciende o apaga manualmente las salidas dependiendo de las variables globales establecidas en otro lugar en código o vía IO. A una velocidad máxima de sysclock de 20 MHz, debería obtener una resolución decente, y podré usar todos mis pines IO como PWM en lugar de los dos que proporciona el chip, así que la gran pregunta es... ¿por qué no? Aparte de usar muchos ciclos de sysclock, realmente no veo desventajas... ¿alguien podría darme algunas?
Las tres desventajas son el consumo de energía, atar un temporizador e interrumpir otro código. Si no le importan los modos de bajo consumo, no necesita el temporizador y no tiene un código crítico que no pueda soportar algunos ciclos de reloj para dar servicio a la interrupción, no hay ninguna desventaja. Algunos proyectos son bastante simples y no consumen ni una décima parte de la potencia del microcontrolador, así que no dejes que nadie te diga que lo estás haciendo mal aprovechando los temporizadores de esa manera. El software PWM está bien si se ajusta a sus necesidades.
Recientemente he estado jugando con un montón de cosas de fuente de alimentación de conmutación PWM, y tienes razón, hay razones perfectamente válidas para "bit bang" señales moduladas por ancho de pulso. Pero una de las principales fallas de este método es cuando necesita un control de retroalimentación inmediato del ciclo de trabajo generado.
Incluso con un reloj integrado de 20 MHz, el tiempo de ciclo es de 50 nanosegundos. Computacionalmente, tendría que adquirir la señal que se está monitoreando, restarla del nivel de referencia y luego reanudar la generación del ciclo de trabajo. Esto creará "inestabilidad" donde el ciclo de trabajo es inconsistente. El uso de un DAC integrado no está descartado, pero consume ciclos. Para reducir esto, puede agregar un DAC externo, pero luego ha asignado quizás 8 o 12 pines del microcontrolador al DAC externo para una lectura rápida (dependiendo de la resolución que desee). Luego, debe preocuparse por el retraso adicional en la propagación de la señal a través de los componentes de conmutación.
Si lo que desea es un control de retroalimentación rápido, es difícil vencer a un IC de ciclo de trabajo independiente. El retraso del amplificador de error integrado es tan pequeño que le preocupa más el cambio de ganancia a altas frecuencias. La propagación de la señal a través de la conmutación sigue siendo el mismo riesgo, por supuesto, y debe diseñarse en torno a ella.
También vale la pena señalar que muchos paquetes PWM IC tienen funciones de apagado y entradas de control de tiempo muerto que pueden hacer cosas realmente ingeniosas cuando se combinan con un microcontrolador, todo en un paquete de 8 o 16 pines.
Depende de usted decidir si el método de explosión de bits puede satisfacer sus necesidades. En realidad, puede aumentar la frecuencia bastante alto si usa un preescalador más bajo. El ciclo de trabajo que obtenga mostrará un error de cuantización, pero eso puede no ser un gran problema dependiendo de lo que esté haciendo y qué tan alta tome la resolución; pero, de nuevo, una mayor resolución tiene el costo de una menor frecuencia. Si no necesita un control de retroalimentación instantáneo y su aplicación puede manejar cierta fluctuación, entonces el bit-banging puede ser el camino a seguir.
El objetivo de tener dispositivos de hardware en el chip es liberar el procesador para otras tareas. Si usa hardware PWM, puede realizar simultáneamente otras tareas del microcontrolador.
Ahora creo que se ha dado cuenta de esto porque está preguntando sobre el uso de un ISR en lugar de ejecutar un contador de fuerza bruta de bucle for/while, pero nuevamente es la misma respuesta. Si no cambiamos el ancho del pulso, ¿por qué querríamos interrumpir nuestras otras tareas innecesariamente?
Puedes hacer fácilmente lo que dices, lo he hecho varias veces. Es más útil si desea cambiar su PWM en momentos predecibles; puede hacer esto contando la cantidad de ciclos de PWM, y necesitaría un temporizador para hacerlo de todos modos.
Sin embargo, existe una compensación entre la resolución de PWM/# de salidas frente a la cantidad de tiempo de procesador libre. Llegará a un punto en el que no tendrá suficiente CPU libre para que funcione.
Recomiendo conectar un alcance a un pin libre y luego configurar ese pin alto al comienzo de la ISR y bajo al final. Esto le permitirá ver la proporción del tiempo que está usando su rutina.
El software PWM no tiene que hacer un uso intensivo de la CPU si se hace de la manera correcta, como usar la modulación de código binario . Con esta técnica agradable y simple, puede tener muchos canales SoftPWM sin una gran sobrecarga de CPU.
Personalmente, descubrí que los PWM del temporizador son más rápidos y consistentes (en el rango completo de 256, si no necesita esa resolución, el software ["fuerza bruta"] puede ser más rápido), y cuando he necesitado más de 2 I probé el PWM suave junto con los PWM duros y no fue muy fluido, así que opté por hacer todo el PWM en el software y resultó genial.
Lo único es que cuando se realizan cálculos/procesamientos/interrupciones intermedias que toman un poco de tiempo, el PWM suave se detiene y puede ser muy notorio.
Ignacio Vázquez-Abrams
scordova88
usuario3125280
nick t