14
TUTORIAL XIV OBJETIVOS Crear códigos en C de mayor complejidad. Aprender a usar el modulo CCP del PIC16F877A Realizar el Proyecto 15: Medición de distancia con sensor de Ultrasonido y el Proyecto 16: Control de motor DC Repasar y reafirmar los conceptos vistos hasta el momento. PROYECTO 15: Medición de distancia con Sensor Ultrasonido En este proyecto vamos a medir distancia con el sensor de ultrasonido, haciendo uso del modulo CCP del PIC16F877A en modo captura. La medición de distancia con este tipo de sensores se basa en la medición exacta del tiempo que transcurre entre la emisión de una señal de ultrasonido y su retorno debido a la reflexión de esta con un obstáculo. Ese intervalo de tiempo es proporcional a la distancia ya que la velocidad del sonido en el aire se considera constante. El PIC tiene 2 de estos módulos CCP (Input Capture/Output Compare/PWM). Cada uno de esos módulos contiene un registro de 16 bits (CCPRxH:CCPRxL) que puede operar como: Registro de Captura de 16 bits Registro de Comparación de 16 bits Registro de ciclo de dureza de PWM. Ambos módulos, el CCP1 Y el CCP2 operan exactamente igual con una única excepción asociada al disparo de un evento especial del que hablaremos mas adelante. El subíndice x que aparece en algunos de los registros y pines hace referencia a 1 ó 2, para denotar que no existe diferencia entre los 2 módulos. Para su correcto funcionamiento, los 2 CCP del PIC16F877A usan los módulos Timers según su modo de operación, tal como se muestra en la tabla. Es posible que los 2 CCP estén operando en modos distintos, su interacción se muestra a continuación:

Tutorial XIV - Ultrasonido y motor DC-

Embed Size (px)

Citation preview

Page 1: Tutorial XIV - Ultrasonido y motor DC-

TUTORIAL XIV OBJETIVOS

• Crear códigos en C de mayor complejidad.

• Aprender a usar el modulo CCP del PIC16F877A

• Realizar el Proyecto 15: Medición de distancia con sensor de Ultrasonido y el Proyecto 16: Control de motor DC

• Repasar y reafirmar los conceptos vistos hasta el momento. PROYECTO 15: Medición de distancia con Sensor Ultrasonido En este proyecto vamos a medir distancia con el sensor de ultrasonido, haciendo uso del modulo CCP del PIC16F877A en modo captura. La medición de distancia con este tipo de sensores se basa en la medición exacta del tiempo que transcurre entre la emisión de una señal de ultrasonido y su retorno debido a la reflexión de esta con un obstáculo. Ese intervalo de tiempo es proporcional a la distancia ya que la velocidad del sonido en el aire se considera constante. El PIC tiene 2 de estos módulos CCP (Input Capture/Output Compare/PWM). Cada uno de esos módulos contiene un registro de 16 bits (CCPRxH:CCPRxL) que puede operar como: Registro de Captura de 16 bits Registro de Comparación de 16 bits Registro de ciclo de dureza de PWM. Ambos módulos, el CCP1 Y el CCP2 operan exactamente igual con una única excepción asociada al disparo de un evento especial del que hablaremos mas adelante. El subíndice x que aparece en algunos de los registros y pines hace referencia a 1 ó 2, para denotar que no existe diferencia entre los 2 módulos. Para su correcto funcionamiento, los 2 CCP del PIC16F877A usan los módulos Timers según su modo de operación, tal como se muestra en la tabla. Es posible que los 2 CCP estén operando en modos distintos, su interacción se muestra a continuación:

Page 2: Tutorial XIV - Ultrasonido y motor DC-

Los registros asociados al modulo CCP en modo captura/comparacion son: Veamos el registro CCPxCON registro de configuración del modulo CCP bit a bit:

bit 7-6 No implementados. Se leen como ‘0’ bit 5-4 CCPxX:CCPxY

Modo Capture: No se usan. Modo Compare: No se usan. Modo PWM: Son los 2 bits menos significativos del ciclo de dureza del

PWM. Los 8 de mayor peso se encuentran en el registro CCPRxL.

bit 3-0 CCPxM3:CCPxM0 (CCPx Mode Select bits) 0000 = Deshabilita el modulo CCPx 0100 = Modo captura cada flanco de bajada 0101 = Modo Captura cada flanco de subida 0110 = Modo de Captura cada 4to flanco de subida 0111 = Modo de Captura cada 16vo flanco de subida 1000 = Modo de Comparación, Pin de salida en 1 en caso de coincidencia (bit

CCPxIF se pone en 1) 1001 = Modo de Comparación Pin de salida en 0 en caso de coincidencia (bit

CCPxIF se pone en 1) 1010 = Modo de Comparación, genera interrupción por software por

coincidencia (bit CCPxIF se pone en 1, pin CCPx pin no se ve afectado) 1011 = Modo de Comparación dispara evento especial (bit CCPxIF se pone en

1, pin CCPx no se ve afectado); CCP1 resetea TMR1; CCP2 resetea TMR1 y empieza una conversión análogo digital si ese modulo está habilitado.

11xx = Modo de PWM

Page 3: Tutorial XIV - Ultrasonido y motor DC-

En modo de captura los registros CCPRxH:CCPRxL capturan el valor de 16 bits de los registros TMR1H:TMR1L cuando ocurre un evento en el pin RC2/CCP1 (pin17) ó en el RC1/T1OSCI/CCP2 (pin16) según sea el caso. Un evento es definido como: • un flanco de bajada. • un flanco de subida • cada 4 flancos de subida • cada 16 flancos de subida El evento se configura con los bits <3:0> del registro CCPxCON. Cuando se efectúa una captura el bit bandera del modulo, CCPxIF, se pone en 1.Tal bit se halla en el registro PIR1. Esa bandera debe ser borrada por software. Si otra captura ocurre antes que el valor almacenado en CCPRRxH:CCPRxL sea leído, será sobrescrito por el nuevo valor

Diagrama de Operación del modulo CCP en modo Captura

En modo de captura el pin que recibe el evento debe ser configurado como entrada digital con el registro TRISC. Timer1 debe estar trabajando en modo temporizador o en modo contador síncrono para que el modulo CCP se pueda usar en modo Captura. En modo de conteo asíncrono el modo de captura podría no trabajar. Cuando el modulo de captura es cambiado una falsa interrupción pude ser generada. Se debe mantener el bit de habilitación de interrupción del modulo, CCPxIE, del registro PIR1 en 0, así como con la bandera CCPxIF al cambiar de modo de operación en el modulo CCP. Hay 4 opciones de prescaler configurables con los bits CCPxM3:CCPxM0. Siempre que el modulo CCP es apagado, ó si el modulo CCP no está en modo de captura el conteo del prescaler es borrado. Cualquier reset borra el conteo del prescaler. Cambiar de un prescaler de captura a otro puede generar interrupción. En modo Comparación los registros CCPRxH:CCPRxL son comparados constantemente con los registro TMR1H:TMR1L. Cuando ocurre coincidencia el pin RC2/CCP1 (pin17) ó en el RC1/T1OSCI/CCP2 (pin16) según sea el caso: • Se pone en alto • Se pone en bajo • No cambia de estado lógico

Page 4: Tutorial XIV - Ultrasonido y motor DC-

Esta acción se basa en el valor de los bits de control <3:0> del CCPxON. Al mismo tiempo la bandera de interrupción CCPxIF se pone en 1. Diagrama de Operación del modulo CCP en modo Comparación Timer1 debe estar trabajando en modo temporizador, o en contador síncrono si el modulo CCP esta en modo Comparación. En modo Contador asíncrono la operación de comparación podría no funcionar. Cuando el modo de generación de interrupción por software en elegida el pin CCPxno se afecta. La bandera CCPIF se pone en 1 causando la interrupción (en caso de estar habilitado). Es posible generar un “disparo” interno por hardware que puede ser usado para iniciar una acción. El evento especial del modulo CCP1 pone los registros TMR1H:TMR1L en cero. Esto permite a los registros CCPRxH:CCPRxL ser registros de periodo programable para Timer1. El evento especial para el modulo CCP2 hace lo mismo que para el otro modulo y además inicia una conversión análogo/digital (si el modulo de A/D esta habilitado) Ambos eventos especiales no ponen en 1 la bandera TMR1IF. El sensor de ultrasonido que vamos a usar para este proyecto es el Devantech SRF04 de Acroname. Este posee 5 pines para conexionado: Pin1: Tierra (0V) Pin2: No se conecta Pin3: Entrada del pulso disparador Pin4: Salida del eco Pin5: Vcc (5V)

Page 5: Tutorial XIV - Ultrasonido y motor DC-

El sensor funciona de la siguiente manera:

1. Se envía un pulso en alto desde el PIC al pin3 del sensor de mínimo 10 µs de duración. El sensor emite la onda de ultrasonido al ambiente cuando detecta el flanco de bajada de la señal.

2. La onda de ultrasonido viaja y choca contra el obstáculo mas próximo (hasta 3

metros) y retorna al sensor.

3. Cuando el receptor del sensor detecta el eco emite un pulso por el pin4 del sensor.

4. Para repetir los pasos 1 a 3 se debe esperar mínimo 10 ms.

Con el modulo CCP1 del PIC en modo Captura haremos lo siguiente:

1. Vamos a contar el tiempo que transcurre entre el flanco de bajada de la señal que enviamos para activar el emisor de ultrasonido y el eco de retorno. Para ello debemos:

1.1 Habilitar interrupciones por modulo CCP1 1.2 Configurar puertos: Pin de entrada de eco en el PIC (RC2), Pin de salida de

señal de activación en el PIC (RB7), Bus de datos para lcd (RB0 a RB5) 1.3 Configurar TMR1 con prescaler 1:1 de modo que cada incremento del

conteo denote un µs transcurrido dado que la frecuencia interna de trabajo es de 1 MHz con un cristal externo de 4 MHz

1.4 Configurar modulo CCP en modo captura cada flanco de bajada, el del eco. 1.5 Empezar el conteo del TMR1 en el flanco de bajada de la señal que activa

el sensor. 1.6 Atender por interrupciones el evento de captura. Leer el dato almacenado

en CCPR1H:L

2. Una vez se tenga el tiempo transcurrido en µs se debe traducir a ft. Esto se logra aplicando sucesivamente los siguientes factores de conversión:

CCCPR1H:L [µs] * 1 * 1 ms * 9 ft * 12 in 2 1000µs 10 ms 1 ft El primer factor sale de considerar que el tiempo transcurrido es el de ida y vuelta de la onda, cuando en realidad solo nos interesa el de ida (o el de vuelta que consideramos igual al de ida ya que la velocidad del sonido en el aire es constante e igual a 0,9 ft/ms) El segundo factor convierte µs a ms, para poder aplicar el tercer factor que convierte ms en ft (de milisegundos a pies) con el dato de la velocidad del sonido en el aire. El cuarto factor es opcional, convierte ft a in (pies a pulgadas) ya que los ft es una medida grande.

Page 6: Tutorial XIV - Ultrasonido y motor DC-

3. Se sigue una rutina de visualización de la distancia en la lcd, de forma similar a

lo trabajado en tutoriales anteriores. 4. Se repiten pasos 1.5 a 3 para hacerlo continuamente.

Se hacen las conexiones respectivas y se elabora el codigo en C, que debe quear como sigue: #include <pic.h> #include "delay.h" #include "delay.c" #include "lcd.h" unsigned int BAN=0; unsigned long TOTAL=0, CM=0, milesimas=0, centenas=0, decenas=0, unidades=0; void interrupt inter(void) {if (CCP1IF==1) //Si la interrupción fue por CCP entonces... {TOTAL=(CCPR1H<<8)+CCPR1L; //Almaceno dato del CCPRH:L TMR1ON=0; //Apago conteo del TMR1 BAN=1; //Activo bandera de visualización en lcd CCP1IF=0; //Bandera de interrupción a 0 } //Fin if parte positiva } //Fin de servicio a interrupciones void main(void) {INTCON=0b11000000; //Habilita Interrupciones Externas PIE1=0b00000100; //Habilita interrupción por Capture/Compare/PWM TRISC2=1; //Pin RC2 como entrada de señal de eco del sensor TRISB=0x00; //Bus de datos del lcd lcd_init(); //Inicializa la lcd lcd_clear(); //Borra la lcd TMR1H=0x00; //Borra conteo del TMR1 TMR1L=0x00; T1CON=0b00000000; //Prescaler 1:1, oscila con cristal externo, apagado CCP1CON=0b00000100; //Modo Captura cada flanco de bajada RB7=1; //Envío señal para activar pulso de ultrasonido en el sensor DelayUs(10); //Delay OBLIGATORIO mínimo para activación TMR1ON=1; //Empiezo el conteo de tiempo ya que... RB7=0; //...la activación del sensor se da en el flanco de bajada while(1) //Ciclo infinito {if(BAN==1) //Si la bandera de visualización esta activada entonces... {DelayMs(50); //Delay que controla frec. de toma de datos (mín 10 ms) lcd_goto(0x0); //Ir a posición 0 de la primer línea del lcd CM=(TOTAL*9*2)/10000; //Conversión de ms a ft milesimas=CM/1000; //Rutina de Visualización en lcd

Page 7: Tutorial XIV - Ultrasonido y motor DC-

centenas=(CM-milesimas*1000)/100; decenas=(CM-milesimas*1000-centenas*100)/10; unidades=CM-milesimas*1000-centenas*100-decenas*10; lcd_putch(milesimas+0x30); lcd_putch(centenas+0x30); lcd_putch(decenas+0x30); lcd_putch('.'); lcd_putch(unidades+0x30); lcd_puts("ft"); TMR1H=0x00; //Conteo del TMR1 a ceros TMR1L=0x00; RB7=1; //Repito rutina de DelayUs(10); //Delay OBLIGATORIO TMR1ON=1; RB7=0; }//Fin if parte positiva }//Fin while interno }//Fin main

Page 8: Tutorial XIV - Ultrasonido y motor DC-

DIAGRAMA DE CONEXIONES

Page 9: Tutorial XIV - Ultrasonido y motor DC-

PROYECTO 16: Control de Motor DC En este proyecto vamos controlar un motor DC con una señal de PWM, cuyo ciclo de dureza varia con un potenciómetro haciendo uso de conversión Análogo digital. PWM ó Pulse Width Modulation (Modulación de ancho de pulso) es una técnica eficaz para controlar dispositivos como triacs y motores. Se basa en la variación del nivel alto (ciclo de dureza) de un impulso lógico, dando una señal cuadrada que se repite con una frecuencia determinada. El PIC16F877A en tiene 2 módulos iguales capaces de generar el PWM. Se trata del modulo CCP ó Capture/Compare/PWM en modo PWM. La señal de impulso alto variable sale por el pin RC2 ó RC1 según sea el modulo CCP1 ó CCP2. Para lograr el cambio en el respectivo pin el modulo usa un comparador que pone a uno un flip-flop cuando el registro PR2 coincide con la parte alta del TMR2. Cuando esto ocurre TMR2 reinicia el conteo, y luego el flip-flop se pone en cero cuando otro comparador detecta igualdad entre CCPR1H y la parte alta el TMR2. Entonces al variar los valores cargados en PR2 y CCPR1L (que luego pasa a CCPR1H) se modifica el tiempo en el que el pin RCx está en alto y bajo. Tales operaciones se muestra en la figura a la derecha.

Page 10: Tutorial XIV - Ultrasonido y motor DC-

El periodo del PWM se especifica cargando el registro PR2, según la siguiente formula:

Periodo PWM = [(PR2) + 1] • 4 • TOSC • (Valor del Prescaler del TMR2) (1) Frecuencia PWM = 1/ [Periodo PWM]. (2) Cuando TMR2 es igual a PR2 el pin CCP1 se pone en 1 a menos que el ciclo de dureza del PWM sea del 0% El ciclo de dureza del PWM se especifica escribiendo el registro CCPR1L (bits de mas peso) y los bits <5:4> del registro CCP1CON (bits de menor peso). Ciclo de dureza PWM [s] = (CCPR1L:CCP1CON<5:4>) •TOSC • (PrescalerTMR2) (3) La máxima resolución en bits para una frecuencia dada de PWM es: Resolucion = log(FOSC / FPWM ) bits (4) log(2) Los pasos siguientes deben ser realizados para configurar el modulo CCP para operar con PWM: 1. Configurar la Frecuencia de la señal, cargando PR2 con el valor que de de la formula 2. Configurar el Ciclo de Dureza del PWM cargando los registros CCPR1L y los bits

<5:4> del CCP1CON 3. Colocar el pin CCP1 como salida al colocar TRISC2 en 0. 4. Configurar el valor de Prescaler de TMR2 y habilitar Timer2 configurando T2CON. 5. Configurar el modulo CCP1 module para PWM.

Para controlar el motor DC se debe implementar una interfaz de potencia (de manera similar al motor Paso a Paso visto en tutoriales anteriores) que permita controlar sentido de giro, y alimentación, en este caso un Puente H. El puente H es un arreglo de 4 transistores dispuestos de modo que al enviar dos señales de control se consiga que el motor varíe su sentido de giro o se detenga. Esto se consigue jugando con la activación y desactivación (saturación y corte) de los transistores, en este caso todos de tipo NPN.

Page 11: Tutorial XIV - Ultrasonido y motor DC-

En el mercado se consiguen circuitos integrados que contienen internamente por lo general 2 puentes H. Estos integrados ocupan menor espacio que los 4 transistores y reducen a un mínimo los problemas que se generan al trabajar con transistores. Comercialmente los circuitos integrados puente H más conocido son los siguientes: L293 (soporta 1A), L298 (soporta 2A), TA7291 S/F (0.4A), TA7291P (1A) Una diferencia adicional entre las referencias mencionadas es que las 2 primeras tienen 2 puentes H internos mientras que los TA solo tienen 1. En esta práctica usaremos el TA7291S para controlar un pequeño motor DC similar a los que se encuentran en los juguetes. Puente H Algunas de las características de los TA7291:

� Estos integrados contienen 1 circuito puente H interno. � 4 modos posibles de control: Stop, CW (sentido horario), CCW (sentido

antihorario), Frenado � Corriente de salida : - Tipo P 1A (promedio) y soporta picos de 2A

- Tipos S/F 0.4A (promedio) soporta picos de 1ª � Rangos de voltaje de funcionamiento: Vcc = 4,5 ~ 20 V Vs = 0 ~ 20V Vref = 0 ~ 20 V � Modo de stand-by o bajo consumo (en modo stop) � Estos integrados puente H ya contienen en su interior diodos de protección

en cada transistor para evitar quemar el PIC.

Page 12: Tutorial XIV - Ultrasonido y motor DC-

En el anterior diagrama de bloques podemos apreciar la configuración de los pines del integrado, y el circuito, a grandes rasgos, del puente H que contiene en su interior. En la siguiente tabla se tiene la configuración de los pines, su símbolo y su función para los 3 tipos de TA7291:

Vs es el voltaje con que serán alimentado los motores, este voltaje puede ser mayor a 5V (voltaje de funcionamiento del PIC) si se nenecita, dependiendo del requerimiento del motor que se usa. El Vref será la señal de control que determine o el voltaje de salida de los motores o la alimentación del mismo. Si las entradas del integrado serán controladas por un microcontrolador, es recomendado hacer Vcc = 5V, debido a que es el nivel compatible TTL con que trabajan los PIC. La tabla de control del TA7291S es la siguiente: INPUT = ENTRADAS OUTPUT = SALIDAS H = Vcc (Nivel alto) L = GND (Nivel bajo) Si se desea realizar un control del voltaje de salida hacia los motores (Vout), se puede hacer por medio de Vref. La relación entre el Vref y el Vout es la siguiente:

Page 13: Tutorial XIV - Ultrasonido y motor DC-

Vout = Vref + VBE (VBE = 0.7V) En caso que no se desee un control del voltaje de salida, el fabricante recomienda que el voltaje de referencia se haga igual o menor a Vs, (Vref ≤ Vs) si se desea que el motor se alimente con todo el voltaje de Vs, hacer Vref = Vs Para hacer un control de velocidad de los motores por PWM, solo basta con ingresar el pulso PWM por Vref, con esto conseguimos que el motor solo encienda cundo el pulso esta en alto. El control de giro sigue siendo exactamente el mismo. El pulso de control por PWM será generado por el microcontrolador, pero hay que tener extremado cuidado de no ir a conectar el pulso del PWM a Vs por que se corre un alto riesgo de dañar el PIC. Para el proyecto vamos a iniciar el motor al 50% del ciclo de dureza, a una frecuencia de 244 Hz. Para el Timer2 vamos a usar prescaler 1:16, además el evento de finalización de conversión análogo-digital la vamos a trabajar por polling y no por interrupciones para simplificar mas el código en C, que debería quedar como se muestra a continuación: #include <pic.h> #include "delay.h" void main (void) { TRISA0=1; //Pin RA0 como entrada TRISC2=0; //Pin de Salida de Señal de PWM TRISB7=0; //Pines de control del sentido de giro del motor como salida TRISB6=0; PR2=255; //Frecuencia 244Hz CCPR1L=32; //Inicio con 50% del ciclo de dureza CCP1CON=0b00001111; //Modo PWM, 2 LSB en 0 T2CON=0b00000110; //Prescaler 1:16 RB7=0; //Señal de control del sentido del Motor. RB6=1; ADCON0=0b01000001; //Trabajo con AN7 y F/8 ADCON1=0b00000000; //Todas la salidas posibles como entradas Análogas... // y justificación a la izquierda en los ADRESH y ADRESL for(;;) //ciclo infinito {ADGO=1; //Inicia Conversión análogo digital while(ADGO==1){ }; //No haga nada mientras conversión CCPR1L = ADRESH; //Parte alta del ciclo de dureza (8bits) CCP1CON = CCP1CON&0b11001111; CCP1CON = CCP1CON|(ADRESL>>2); //Parte baja del ciclo de dureza (2bits) } }

Page 14: Tutorial XIV - Ultrasonido y motor DC-

DIAGRAMA DE CONEXIONES

Nota: El fabricante del TA291 recomienda probar con varios valores de C4 hasta encontrar el valor del condensador mas

optimo. Este condensador puede ser variado entre 1 y 10uF. El integrado fue probado con un condensador de 10uF

y se garantiza un buen funcionamiento.