Práctica: Modulación ancho de pulso en C 1. Objetivos Aprender a generar un PWM en lenguaje C. 2. Trabajo previo Realizar un pseudocódigo para el programa del apartado 5 3. Programa ejemplo Crear una nueva carpeta en el directorio de trabajo. Volcar al directorio de trabajo los ficheros la página web http:// www.iit.upco.es/˜cesar/servoc Hacer doble click sobre el icono: servoc.Uv2 Ejecutar en tarjeta. 4. Ejemplo de generación de onda El siguiente programa genera una señal periódica de periodo 2 ms y 50 % de “duty-cycle” utilizando una rutina de retardo. Analizar y comprobar el funcionamiento del mismo conectando un osciloscopio a la salida P7.0 (en la tarjeta lleva el nombre Borna 2: “B2”). /* Generación de onda de T=2 ms, 50% duty-cycle. usando timer 0, en lenguaje C por polling con máscaras Departamento de Electrónica y Automática DEA-ICAI Prof. Cesáreo Fernández Martı́nez */ #include <reg167.h> #include <stdio.h> #define CUENTA -2500 void retraso(int seg); void main(void) { DP7 = 0x0001; P7 = 0x0000; while(1) { retraso(CUENTA); P7 = P7 ˆ 0x0001; } } void retraso(int tiempo) { T0REL = 0; T01CON = 0x00; T0 = tiempo; 1 T0REL = tiempo; T01CON = T01CON | 0x40; // arranca timer while (!(T0IC & 0x80)); T0IC = T0IC & 0x7f; T01CON = T01CON & 0xbf; // bucle de espera de rebose // borra flag de rebose // para el timer } 5. Ejercicio 2: Servo, posición variable Modificar el programa anterior de forma que el tiempo que está la señal en nivel alto sea un tiempo entre 500µs y 2 ms, manteniendo el periodo de 20ms. Este tiempo se podrá cambiar utilizando los dos interruptores menos significativos del puerto 2. ¿Qué resolución tenemos a la hora de definir el nivel alto?. Comprobar el funcionamiento con un osciloscopio. Una vez comprobado que el programa funciona correctamente se podrá gobernar un servo con la ayuda de los interruptores. (Pedir el servo al profesor). 6. Opcional I Realizar el mismo ejercicio usando los cuatro interruptores menos significativos del puerto P2. 2