Capitulo 9 PWM 9.0 Introducción. Una señal analógica tiene un intervalo variable de valores con una resolución infinita ya que puede tomar cualquier valor real; mientras que una señal digital solamente puede tomar valores dentro de un intervalo predeterminado y finito de posibilidades. El control analógico no siempre es la mejor opción en la industria pues es más propenso a alteraciones por ruido y con el tiempo suele presentarse cambios lo cual complica la sincronización de los mismos. Los controles analógicos de alta precisión suelen ser muy caros, y voluminosos. La modulación por ancho de pulso, o PWM (Pulse Width Modulation) por sus siglas en ingles, es una técnica para control de circuitos analógicos utilizando una señal digital. En este caso la señal digital del microcontrolador. Vista de una forma sencilla la PWM es una forma de codificar señales analógicas de una forma digital. A través del uso de contadores una señal cuadrada es modulada para obtener un determinado nivel analógico.
9.1 Tipos de PWM del ATmega48. Señales PWM. Una señal PWM (Pulse Width Modulation) o modulación por ancho de pulso tiene las siguientes características: el periodo de la señal es fijo, lo que cambia es el ancho de pulso. PWM no invertida, en esta figura se aprecia que el periodo de la señal es fijo y lo que se modifica es el ancho de pulso, en el primer ciclo la modulación está al 50%, esto es que durante todo el 50% del periodo de la señal estará en 1 el pulso, en el siguiente ciclo se encuentra la modulación es del 75%, así que estará en 1 durante ¾ partes del periodo de la señal, y en el último ciclo está al 100% la modulación, así que está en 1 todo el tie mpo que dura el peri odo de la señal.
Las señales PWM son muy utilizadas en control de energí a de CA y CD. Si c onectáramos un LED con un PWM al 50% veríamos que está ligeramente encendido, si subimos el ancho de pulso el LED prendería con mayor intensidad, y si la modulación está al 100% el LED prendería al máximo de intensidad luminosa.
PWM invertida. En una señal PWM invertida, la modulación del 50% del periodo la señal estará en 0 la señal. Cuando está al 75% significa que ¾ partes del periodo de la señal estará en 0. Vea la siguiente figura de una señal PWM invertida al 50%, 75% y 100%.
PWM con Modulación no invertida al centro. En determinados tipos de control de motores la modulación no se hace con respecto al inicio del periodo, sino con respecto al centro. En la siguiente figura se aprecia PWM con modulación no invertida al centro con modulación al 50%, 75% y 100%.
En la figura anterior se nota que el pulso va creciendo con respecto al centro, y que si la modulación es del 50% entonces durante 50% del tiempo del ciclo estará en 1 pero centrado con respecto al periodo de la señal. PWM con Modulación invertida al centro. En este tipo de modulación la modulación es el tiempo que está en 0 con respecto al centro del periodo, y en la siguiente figura se tienen este tipo de modulación al 50%, 75% y 100%.
Estos modos de modulación del PWM se ilustran y explican debido a que con el timer del Atmega48 es posible generarlos. El microcontrolador Atmega48 posee 6 canales de PWM (OC1A, OC1B, OC2A, OC2B, OCOB y OC0A), las dos primeras son canales de 16 bits mientras que las otras son de 8 bits.
9.2.1 Características de PWM en modo CTC (Clear timer on compare match). En el modo CTC (WGM13:0 = 4 o 12), el OCR1A es empleado para manejar la resolución del contador. En el modo CTC el contador (TCNT1) es llevado a cero ya sea cuando éste alcanza el valor o se iguala a OCRIA (WGM13:0 = 4) o a el valor de ICR1 (WGM13:0 =12). El OCR1A o ICR1 definen el valor máximo del contador, y por lo tanto su resolución. Este modo permite un mayor control de la igualación en comparación de la frecuencia de salida. También simplifica el conteo de los eventos de conteo externos. El diagrama para el modo CTC se muestra a continuación. El valor del contador TCNT1 se incrementa hasta que ocurre una comparación ya sea con OCR1A o ICR1, para entonces TCNT1 es puesto a cero.
La frecuencia de la forma de onda está definida por la siguiente expresión matemática.
Donde la variable N representa el factor del pre-escalador (1, 8, 64,256 0 10 24).
9.2.2 Características de PWM rápida.
PWM de alta frecuencia Modo de operación de una sola pendiente o cuesta simple Modo de operación invertido y no invertido
Resolución de 8,9, y 10 bits, o bien, definida por ICR1 o OCR1A (resolución mínima de 2 bits o 16 bits).
La PWM rápida (WGM13:0 = 5, 6, 7, 14, o 15) proporciona la opción de una generación de forma de onda PWM de alta frecuencia. Debido a su pendiente sencilla, la frecuencia de operación de la PWM rápida puede ser el doble de rápida que la PWM de fase correcta o PWM de fase y frecuencia correcta que emplean doble pendiente. Esta alta frecuencia permite que la PWM rápida sea ideal para el control de potencia, rectificación, aplicaciones de DAC. Altas frecuencias permiten pequeñas componentes externas, tales como bobinas y capacitores, reduciendo los costos totales del sistema donde se aplique.
La frecuencia de la forma de onda está definida por la siguiente expresión matemática.
Donde la variable N representa el factor del pre-escalador (1, 8, 64,256 0 10 24).
9.2.3 Características de PWM con corrección de fa se.
Alta resolución Modo de operación invertido doble pendiente o doble cuesta Modo de operación invertido y no invertido Resolución de 8,9 y 10 bits, o bien, definida por ICR1 o OCR1A (resolución mínima de 2 bits o 16 bits).
La PWM de fase correcta o corrección de fase (WGM13:0 = 1, 2, 3,10, o 11) proporciona una alta resolución. Al igual que la PWM de fase y frecuencia correcta la PWM de fase correcta, están basadas en doble pendiente. La operación de doble pendiente tiene una frecuencia de operación menor que la de pendiente sencilla: Sin embargo debido a las características simétricas de la doble pendiente la PWM de doble pendiente son preferidas para el control de motores.
La frecuencia de la forma de onda está definida por la siguiente expresión matemática.
Donde la variable N representa el factor del pre-escalador (1, 8, 64,256 0 10 24).
9.2.4 Características de PWM con corrección de fa se y frecuencia.
Alta resolución Modo de operación invertido doble pendiente o doble cuesta Modo de operación invertido y no invertido Resolución de 8,9 y 10 bits, o bien, definida por ICR1 o OCR1A (resolución mínima de 2 bits o 16 bits).
La PWM de frecuencia y fase correcta (WGM13:0 = 8 o 9) proporciona una opción de generación de forma de onda de alta resolución y frecuencia correcta. La PWM de fase y frecuencia correcta es de doble pendiente. La principal diferencia entre la fase correcta y la fase y frecuencia correcta es el tiempo de actualización del registro OCR1x por el buffer del registro.
Como se puede observar en la última figura la salida generada, es en contraste con la PWM de corrección de fase, simétrica en todos los periodos. Ya que los registros OCR1x son actualizados en la parte baja del conteo, la longitud tanto de la cuesta de subida como de la cuesta de bajada son siempre iguales. Lo que da una salida simétrica en pulsos y por lo tanto la frecuencia correcta. La frecuencia de la forma de onda está definida por la siguiente expresión matemática.
Donde la variable N representa el factor del pre-escalador (1, 8, 64,256 0 10 24).
9.3 Configuración de la PWM. Los registros que interviene en la configuración son los mismos que intervienen en la configuración de los temporizadores contadores 0, 1 y 2.
Sólo se estudian los bits referentes al PWM.
9.3.1 registro de control A, TCCR1A.
Bit 7:6 – COM1A1:0, modo de salida de comparación para canal A. Bit 5:4 – COM1B1:0, modo de salida de comparación para canal B. Bit 1:0 – WGM11:10, modo de generación de formas de onda.
Los bits COM1A1:0 y COM1B1:0 controlan el comportamiento de las terminales de comparación de salida (OC1A y OC1B respectivamente). Si uno o ambos bits de COM1A1:0 están en el valor de uno lógi co, la salida OC1A sobrepasa la funcionalidad del puerto I/O al cual está conectado. Si uno o ambos de los bits COM1B1:0 están en el valor lógico de uno, la salida OC1B sobrepasa la funcionalidad del puerto I/O al cual está conectado. Sin embargo, hay que tomar en cuenta que el DDR del bit correspondiente a los pines de OC1A u OC1B debe de tener el valor de uno lógico, para permitir la salida de la información. Cuando OC1A o OC1B están conectados al pin correspondiente, la función de los bits COM1x1:0 depende de los bits WGM13:10. La siguiente tabla muestra la funcionalidad de los bits COM1x1:0 cuando los bits WGM13:10 están en el valor lógico uno o el modo CTC [clear time on compare; pon en cero en el momento de la comparación] (no PWM). Tabla de modo de comparación de salida, no PWM COM1A1/ COM1A0/ Descripción COM1B1 COM1B0 0 0 Operación regular del puerto, OC1A/OC1B desconectada 0 1 Conmutación OC1A/OC1B en igualación de comparación 1 0 Limpiar OC1A/OC1B en igualación de comparación (salida en nivel bajo) 1 1 Poner a uno a OC1A/OC1B en igualación de comparación (salida en nivel alto) Tabla de modo de comparación de salida, PWM rápida. COM1A1/ COM1A0/ Descripción COM1B1 COM1B0 0 0 Operación regular del puerto, OC1A/OC1B desconectada 0 1 WGM13:10 = 14 o 15, conmuta OC1A en modo de comparación, OC1B desconectado (operación puerto regular), para todas las otras WGM, operación del puerto regular, OC1A/OCIB desconectadas 1 0 Poner en cero OC1A/OC1B en igualación de comparación, poner en uno OC1A/OC1B en bottom (valor mínimo), modo no invertido. 1 1 Poner en uno OC1A/OC1B en igualación de comparación, poner en cero OC1A/OC1B en bottom (valor mínimo), modo no invertido.
Tabla de modo de comparación de salida, PWM de fase correcta y PWM de fase y frecuencia correcta COM1A1/ COM1A0/ Descripción
COM1B1 0 0
COM1B0 0 1
1
0
1
1
Operación regular del puerto, OC1A/OC1B desconectadas WGM13:10=9 o 11, conmutar OC1A en igualación de comparación, OC1B desconectada (operación regular del puerto). Para todas las otras WGM, operación regular del puerto, OC1A/OC1B desconectadas Poner en cero OC1A/OC1B en igualación de comparación cuando se tenga conteo ascendente. Poner en uno a OC1A/OC1B en igualación de comparación en conteo descendente. Poner a uno a OC1A/OC1B en igualación de conteo en conteo ascendente. Poner en cero a OC1A/OC1B en igualación de conteo en conteo descendente
9.3.2 Registro de control B, TCCR1B.
Bit 4:3 – WGM13:12, modo de generación de formas de onda. Bit 2:0 – CS12:10, fuente del reloj para el timer 1. Estos últimos tres bit, configuran la fuente de reloj que utilizará el timer 1, de acuerdo a la siguiente tabla.
Tabla de generación de formas de onda, descripción de los bits
9.4 Practica de PWM. 9.4.1 Objetivo. Conocer el funcionamiento de la PWM y de los registros que intervienen en la configuración de la PWM del microcontrolador AT mega48.
9.4.2 Material. Cantidad 1 1 1 1 1
Descripción Puente H L298N Motor de CD de 12 V. o un led Resistencia de 10 KΩ
Programador de avr Microcontrolador atmega48 Fuente de alimentación, cables, protoboard
9.4.3 Desarrollo
9.4.4 Código. //____________________inicio del programa #include
#include char data,parametro; void init_PWM(void) { TCCR1A= (1<
void incrementa(void) { if (parámetro!=255) parametro++; OCR1A=parametro; } void decrementa(void) { if (parametro!=0) parametro--; OCR1A=parametro; } void para(void){ PORTB=0; } void avanza(void) { PORTB=1; } ISR (SIG_UART_RECV){ //interrupción de recepción USART data = UDR; // leer dato recibido switch(data){ // determinar acción a seguir case(‘i’): incrementa(); break; case(‘d’):decrementa(); break; case(‘p’):para(); break; case(‘a’): avanza(); break; } } int main() { DDRB=255; init_PWM(); init_USART(); while(1); } //_________________________fin de programa
9.5 Información adicional 9.5.1 Practica de la PWM
Uso del PWM Descripción. En este ejemplo se presenta la forma de empleo del PWM, o modulación por ancho de pulso, la cual consiste en modificar el ancho del pulso dejando la frecuencia intacta, el programa acepta dos entradas, las cuales son los Push Buttons conectados al microcontrolador, y cuenta con una salida, que es el LED, el cual indica el nivel de modulación, a más ancho el pulso mas ciclo de trabajo y el LED se ilumina con mayor intensidad.
Diagrama Esquemático.
Materiales. 1 1 2 2 1
LED. Resistor de 220 Ohms. Push Button. Resistores de 10Kohms. Microcontrolador ATmega48.
Introducción.
Modulación por ancho de pulso o PWM (Pulse-Width Modulation), de una señal, se presenta cuando se modifica el ciclo de trabajo o el ancho del pulso de una señal periódica, en este caso representado por una señal cuadrada, uno de los usos del PWM entre muchos otros, es controlar la cantidad de energía, en este caso el voltaje promedio es mayor conforme aumenta el ciclo de trabajo, lo cual se puede emplear para controlar un motor de CD.
En la imagen anterior se puede observar, que el periodo de la señal permanece fijo, por lo tanto, la frecuencia también, solamente cambia el ciclo de trabajo, en la primera se observa que el ciclo de trabajo es de aproximadamente 50% lo cual indica que es el porcentaje de voltaje promedio entregado a la carga.
El PWM se puede utilizar en varias cosas, como el control de la velocidad de motores de DC, la posición de un servomotor, fuentes conmutadas, entre otras cosas más.
Programa en C. #include #include
//librería de entrada salida. //librería de retardos.
int main(void){ DDRB=0x02; DDRD=0x00; TCCR1A=0b10000011; TCCR1B=0b00000001; TCNT1 =0b00000000; OCR1A=0; for(;;){
//inicia el programa principal. // la terminal 1 del puerto B como salida. //todas las terminales del puerto D como entradas. //configurar el PWM en modo de fase. //sin pre escalador. //no se modifica. //inicializar el TOP en cero. //inicia ciclo infinito.
if ( PIND == 0x01 ) { OCR1A++; _delay_us(500); }
//si el botón 1 esta activado. //incrementar la modulación. //retardo de 500 microsegundos. //fin del primer if.
if ( PIND == 0x02 ) { OCR1A--; _delay_us(500); }
//si el botón 2 esta activado. //decrementar la modulación. //retardo de 500 microsegundos. //fin del segundo if. //fin del ciclo infinito.
} }
//fin del programa principal.
Detalles del programa. #include Se incluye la librería avr/io que contiene la información de las entradas y salidas del microcontrolador.
#include Esta librería es necesaria para poder utilizar los retardos de tiempo.
int main (void){ El main es la función principal, es donde el programa inicia, siempre es necesario declarar la función main.
DDRB=0x02;
DDRD=0x00; Se declaran el bit 1 del puerto B como salida y el puerto D como entrada.
TCCR1A=0b10000011;
Los primeros dos bits del TCCR1A los cuales se observa que tanto en el registro como en la tabla sonWGM11 y WGM10, y como en este caso ambos están activados, se puede comprobar que el modo de operación es el de PWM en fase de 10 bits.
Acerca del bit 7 este depende de qué tipo de PWM se esté trabajando, ya que en este caso se está trabajando el de corrección de fase, al consultar la tabla anterior se observa que se tiene el COM1A1 habilitado el cual indica que limpia el OC1A en la comparación al incrementar y ajusta el OC1A en la comparación al decremento.
TCCR1B=0b00000001;
Se ajusta el PWM para que no se emplee pre escalador desde el Clk, se puede ver en la tabla de los últimos tres bits del registro.
OCR1A=0; Se inicializa el valor al que llega el PWM, como se puede ver en la imagen anterior los picos del TCNTn dependen del OCRnx, en este caso es el OCR1A el cual se inicializa en cero.
for(;;){ En este caso, es otro manera de generar un loop infinito, esta instrucción es equivalente al while(1){ .
if ( PIND == 0x01 ) { OCR1A++; _delay_us(500); } if ( PIND == 0x02 ) { OCR1A--; _delay_us(500); } En general lo que se hace en esta sección de código, es que primero verifica si el Push Button1 está siendo presionado al comparar el puerto con un 0x01, en caso de que si este, se incrementa el valor del OCR1A el cual define el ancho del pulso en la modulación, por consiguiente, como se vio previamente, a mayor ancho del pulso se entrega un mayor voltaje promedio. El segundo if
funciona de la misma manera, sólo que para activarlo hay que presionar el otro botón, y dentro de este el OCR1A se decrementara.
El retardo se emplea ya que como el microcontrolador corre a una velocidad de 1Mhz, para limitar la velocidad del incremento, si no hubiera algún retardo, no se podría observar que es lo que esta pasado debido a la velocidad del incremento, ya que con sólo presionar algún botón un instante de tiempo, el código se repetiría cientos de veces y el OCR1A se incrementaría o decrementaria muy rápido.