PWM On The ATmega328

PWM en el ATmega328 INTRODUCCIÓN: Sabemos que el AVR nos permite encender y apagar salidas, pero ¿y si queremos controla

Views 201 Downloads 1 File size 1MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

PWM en el ATmega328 INTRODUCCIÓN: Sabemos que el AVR nos permite encender y apagar salidas, pero ¿y si queremos controlar el brillo de un LED o la velocidad de un motor? Bueno, la forma más fácil de hacer esto es cambiar el voltaje de la salida, pero podemos fingirlo. Si tomamos una fuente de voltaje y la conectamos por un segundo y luego la desconectamos por un segundo ... estará encendida por un segundo y luego apagada por un segundo. PERO, si logramos acelerar esto para que conectemos / desconectemos la fuente de alimentación más de 1000 veces por segundo, podemos engañar a la fuente de alimentación para que piense que nuestra señal es la mitad del valor de la fuente de alimentación. Esto se llama Modulación de ancho de pulso o PWM para abreviar.

TEORÍA DE OPERACIÓN:

Figura 1: Pines PWM ATmega168 / 328

Cuando tomas una onda cuadrada, está encendida por un tiempo y apagada por un tiempo. Si dividimos el encendido por el apagado y lo multiplicamos por 100% obtendremos lo que se llama ​ciclo de trabajo​.

Duty_Cycle = [ ON_time / (ON_time + OFF_time)] * 100 Entonces, si estamos encendidos durante 1 ms y luego apagados durante 1 ms, terminaremos con un ciclo de trabajo del 50%; Si estamos encendidos durante 1 ms y apagados durante 3 ms, terminamos con un ciclo de trabajo del 25%.

Output_Voltage = Duty_Cycle * Input_Voltage

Ahora, si tomamos nuestro ciclo de trabajo y lo multiplicamos por nuestro voltaje, obtendremos el voltaje de salida. Entonces, si tenemos una fuente de alimentación de 5V y activamos un PWM en un ciclo de trabajo del 25%, haremos que un dispositivo analógico se comporte como si estuviera recibiendo una señal de 1.25V. Al igual que las funciones de contador, PWM se puede simular en software, sin embargo, se prefiere la versión de hardware porque simplemente hace lo suyo y, con muy poca codificación, puede obtener una onda cuadrada constante. El prescaler, su rol es ralentizar las cosas. Esto nos permite ejecutar el PWM a diferentes frecuencias. Esto es importante porque algunos dispositivos son sensibles a las velocidades PWM. Un motor, por ejemplo, se calentará si la forma de onda PWM es demasiado rápida, y vibrará si la PWM es demasiado lenta.lo tipo es comenzar en 10 kHz. Diferentes motores como diferentes frecuencias, pero 10 kHz los mantendrá estable. El ATmega168 / 328 tiene 6 salidas PWM, 2 están ubicadas en cada temporizador / contador. El temporizador PWM del AVR puede funcionar en 3 modos diferentes: PWM rápido, PWM con corrección de fase y PWM con corrección de fase y fase.

Modo PWM rápido: Fast PWM funciona de la misma manera que el contador normal. La lógica de control recibe la señal e incrementa el registro TCNTn. Cuando se detecta una coincidencia, se activa la bandera OCFnx y la señal se envía al generador de forma de onda. El generador de forma de onda cambia el estado del pin OCnx (el estado está determinado por el modo seleccionado). Cuando el registro TCNTn pasa el valor TOP (0xFF u OCRnA), simplemente se desborda (o desborda) de nuevo a 0, al mismo tiempo que se activa la bandera OCFnx. La bandera OCFnx se puede configurar para activar una interrupción. La bandera OCFnx se puede borrar por software, pero como siempre se borra automáticamente cuando se activa una solicitud de interrupción.

Debido a la alta frecuencia de este modo, se utiliza mejor para DAC, LED de desvanecimiento, rectificación y regulación de potencia. La frecuencia del PWM rápido se puede calcular mediante la siguiente ecuación. PWM_fequency = clock_speed / [Prescaller_value * (1 + TOP_Value)]

Modo PWM con corrección de fase: El modo de fase corregida es un poco extraño, cuenta hacia arriba hasta que llega al valor SUPERIOR (FIXED, OCRnA o ICRn) y luego comienza la cuenta atrás hasta que llega al BOTTOM (0). La lógica de control recibe la señal e incrementa el registro TCNTn. Cuando se detecta una coincidencia, se activa la bandera OCFnx y la señal se envía al generador de forma de onda. El generador de forma de onda cambia el estado del pin OCnx (el estado está determinado por el modo seleccionado). Cuando el registro TCNTn alcanza el valor TOP (FIXED, OCRnA o ICRn), se activa la bandera OCFnx. La bandera OCFnx se puede configurar para activar una interrupción. El indicador OCF1x se puede borrar mediante software, pero como siempre se borra automáticamente cuando se activa una solicitud de interrupción. Este modo puede invertirse o no invertirse. En el modo sin inversión, el pin OCn es BAJO (GND) en la coincidencia de comparación entre TCNTn y OCRnx mientras se cuenta hacia arriba, y ALTO (VCC) en la coincidencia de comparación mientras se cuenta hacia abajo. En el modo de inversión, el pin OCn es ALTO (VCC) en la comparación de coincidencias entre TCNTn y OCRnx mientras se realiza el conteo ascendente, y BAJO (GND) en la comparación de coincidencias mientras se realiza la cuenta regresiva. Este modo se recomienda para el control de motores. La frecuencia del PWM con corrección de fase se puede calcular mediante la siguiente ecuación. PWM_frequency = clock_speed / (2 * Prescaller_value * TOP_value)

Modo PWM con corrección de fase y frecuencia: Los modos PWM con corrección de fase y con corrección de frecuencia y fase funcionan de la misma manera si no estamos planeando cambiar nuestro valor TOP una vez que se inicia el modo PWM. La única diferencia que pude ver en la hoja de datos es que el modo de corrección de fase y frecuencia actualiza su valor SUPERIOR cuando llega al fondo, mientras que el modo de corrección de fase actualiza su valor SUPERIOR cuando llega al principio. Si alguien sabe algo más (o si me equivoco) sobre estos 2 modos, hágamelo saber. Este modo se recomienda para el control de motores.

La frecuencia del PWM con corrección de fase y frecuencia se puede calcular mediante la siguiente ecuación. PWM_frequency = clock_speed / (2 * Prescaller_value * TOP_value)

TEMPORIZADOR0 (8BIT PWM)

Figura 2: ATmega328 Timer0 (8 bits)

Timer / Counter0 tiene 2 salidas, OC0A y OC0B. Dado que ambas salidas funcionan con el mismo temporizador y los generadores de forma de onda, tanto OC0A como OC0B, están sincronizados, esto hace que el temporizador sea perfecto para hacer robots de tanque (me encantan los robots de tanque). Timer / Counter0 no tiene un dispositivo 32 o 128 en su prescaler. Debido a esto, está algo limitado a las frecuencias que podría producir. Si necesita una frecuencia específica en su PWM, use Timer / Counter2 que tiene todos sus valores de preescalador. Timer / Counter0 es capaz de ejecutar en 4 modos: Fast PWM con un TOP máximo (0xFF), un modo Fast PWM con un TOP variable (OCR0A), un modo PWM con

corrección de fase con un TOP máximo (0xFF) y un PWM con corrección de fase modo con una variable TOP (OCR0A). Cada uno de estos modos se puede invertir o no invertir.

ATmega168/328 Code: // this code sets up counter0 for an 8kHz Fast PWM wave @ 16Mhz Clock #include int main(void) { DDRD |= (1