Sistemas Embebidos

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