Sistemas Embebidos 2015 MODULO 3: TIMER - PWM 1. Objetivos: Interpretar funcionamiento del Timer/Counter. Empleo del Timer en modo Fast PWM. Configurar sus registros. Empleo del Timer en modo Phase Correct PWM. Configurar sus registros. Generar señales analógicas a partir de PWM y su posterior filtrado. Almacenar tablas en memoria Flash. 2. Introducción. Esta práctica se divide en dos partes. En primer lugar utilizaremos el Timer 1 en modo Fast PWM y su salida OC1A en conjunto con un micro servo. Utilizando un osciloscopio visualizaremos el ancho de pulso de la señal PWM y la relacionaremos con el ángulo de giro del servo. En segundo término, utilizaremos nuevamente la salida OC1A en modo no inversor configurado como Phase Correct PWM con TOP programado por ICR1 (Modo 10). Partiendo de una tabla de valores grabada en memoria flash obtendremos una señal PWM con modulación senoidal de ciclo completo de 50Hz. La señal PWM será filtrada por un filtro RC pasabajos del cual se obtendrá la señal moduladora (síntesis digital de señales). 3. Desarrollo de la Práctica 3.1. Manejo de un micro servo con PWM. 3.1.1. Configure el Timer 1 como salida Fast PWM y TOP fijo. Determine la resolución del timer y el valor del prescaler para obtener un período de 20 ms. 3.1.2. Genere una señal con período de 20 ms y configure el OC1A para tener un duty del 50%. Compruebe la salida de señal con el osciloscopio. 3.1.3. Genere una rutina que varíe en 18 pasos el valor del duty, desde un mínimo que mantenga la salida en alto durante 1 ms (-90°) y un máximo de 2 ms (+90°). Conecte el micro servo a la placa arduino. 3.1.4. Modifique la rutina para incorporar 2 pulsadores con los cuales se pueda incrementar y decrementar el ángulo del brazo del microservo en pasos de 10°. 3.1.5. Las especificaciones del micro servo 9g marca Power Pro, modelo SG90 se puede bajar de la web. (http://datasheet.sparkgo.com.br/SG90Servo.pdf). Practica 3 Página 1 Sistemas Embebidos 2015 Imagen ilustrativa. 3.2. Implementación de un DAC con PWM. 3.2.1. Diseñe un filtro RC pasabajos con frecuencia de corte una década por arriba de la frecuencia a filtrar (50Hz). Tomar como punto de partida un capacitor entre 100nF y 10uF. 3.2.2. Conecte la salida PWM del Timer/Counter1 a la entrada del filtro. 3.2.3. Desarrolle código para generar una señal senoidal de 50Hz. Para esto debe calcular el valor del ICR1 que definirá el TOP. Se deberá trabajar con una tabla que represente el valor del seno en 256 instantes. Esta misma se podrá generar con la ayuda de una planilla de cálculo. 3.2.4. Corra el programa y observe la forma de onda a la salida del filtro. Notas adicionales: Para trabajar con variables en memoria Flash se debe incluir la librería <avr/pgmspace.h>, la cual tiene implementadas las siguientes funciones: #define PGM_P const char _ Usado para declarer una variable que es un puntero a una cadena en espacio de memoria. #define pgm_read_byte( address short ) pgm_read_byte_near(address short) Lee un byte desde memoria flash con una dirección de 16-bit (dirección cercana). Nota Esta dirección es una dirección de 8 bits. La dirección está en espacio de memoria. #define pgm_read_dword( address short ) pgm_read_dword_near(address short) Lee una palabra doble desde memoria flash con una dirección de 16-bit (dirección cercana). Nota Esta dirección es una dirección de 8 bits. La dirección está en espacio de memoria. #define pgm_read_float( address short ) pgm_read_float_near(address short) Lee un flotante desde memoria flash con una dirección de 16-bit (dirección cercana). Practica 3 Página 2 Sistemas Embebidos 2015 Nota Esta dirección es una dirección de 8 bits. La dirección está en espacio de memoria. #define pgm_read_word( address short ) pgm_read_word_near(address short) Lee una palabra desde memoria flash con una dirección de 16-bit (dirección cercana). Nota Esta dirección es una dirección de 8 bits. La dirección está en espacio de memoria. Ejemplo para leer una palabra desde memoria flash: uint16_t variable; ... variable = pgm_read_word(&tabla_seno[i]); ... Para almacenar una tabla en memoria flash, se debe declarar antes de la función main(), el array de datos como se muestra a continuación: const uint8_t tabla_seno[] PROGMEM= //256 valores { //xx valores } La directiva “const” establece que no se va a poder alterar el contenido del array. La macro PROGMEM establece que se va a almacenar en espacio de memoria (Flash). Para mayor información sobre el compilador, librerías, funciones y demás, referirse al AVR Libc Reference Manual. (http://www.atmel.com/webdoc/AVRLibcReferenceManual/index.html) . También se pueden obtener de la web, versiones anteriores en formato pdf. Practica 3 Página 3
© Copyright 2024