Sie sind auf Seite 1von 13

PICS

PRACTICA 6

“IMPLEMENTACIÓN DE UN CONVERTIDOR A/D Y D/A CON


LOS MODULOS A/D Y PWM DEL PIC16F877”

PROFESOR:

CARLOS CELAYA BORGES


IMPLEMENTACIÓN DE UN CONVERTIDOR A/D Y D/A CON LOS MODULOS
A/D Y PWM DEL PIC16F877.

- INTRODUCCIÓN

CONVERTIDOR A/D DEL PIC16F877

El PIC16F877 cuenta con un convertidor A/D de 10 bits. La configuración se


realiza a través de los registros ADCON0 y ADCON1.

El módulo A/D tiene las siguientes características: utiliza aproximaciones


sucesivas, resolución de 10 bits y ocho entradas analógicas. La entrada analógica
pasa por un Muestreador / Sujetador ( S/H = Sample and Hold) y la salida del S/H
es la entrada al convertidor. Se seleccionan los niveles de referencia o límites
superior e inferior del voltaje de entrada, eligiendo una pareja de las líneas: VDD,
VSS, RA2 y RA3. La figura 1 muestra el diagrama de bloques del A/D, que para
su configuración dispone de los cuatro registros siguientes:

A/D Control Register0 (ADCON0)


A/D Control Register1 (ADCON1)
A/D Result High Register (ADRESH)
A/D Result Low Register (ADRESL)

El registro ADCON0 se muestra a continuación:

bit 7-6 ADCS1:ADCS0: A/D Conversion Clock Select bits


00 = FOSC/2
01 = FOSC/8
10 = FOSC/32
11 = FRC (clock derived from the internal A/D module RC oscillator)
bit 5-3 CHS2:CHS0: Analog Channel Select bits
000 = channel 0, (RA0/AN0)
001 = channel 1, (RA1/AN1)
010 = channel 2, (RA2/AN2)
011 = channel 3, (RA3/AN3)
100 = channel 4, (RA5/AN4)
101 = channel 5, (RE0/AN5)(1)
110 = channel 6, (RE1/AN6)(1)
111 = channel 7, (RE2/AN7)(1)
bit 2 GO/DONE: A/D Conversion Status bit
If ADON = 1:
1 = A/D conversion in progress (setting this bit starts the A/D conversion)
0 = A/D conversion not in progress (this bit is automatically cleared by hardware
when the A/D
conversion is complete)
bit 1 Unimplemented: Read as '0'
bit 0 ADON: A/D On bit
1 = A/D converter module is operating
0 = A/D converter module is shut-off and consumes no operating current

El registro ADCON1 se muestra a continuación:

bit 7: ADFM. Muestra la justificación del resultado

1 – ajustado a la derecha
0 – ajustado a la izquierda

Los bits 3-0 muestran la configuración del número de canales de entrada analógicos
de acuerdo a la siguiente tabla:
El tiempo de conversión por bit TAD, se debe seleccionar menor a 1.6 µs, y el
tiempo mínimo para realizar la conversión a 10 bits es: 12 TAD. El valor de TAD lo
determina la fuente del reloj al convertidor A/D y puede tomar cuatro posibles
valores:

• TAD = 2TOSC del oscilador del microcontrolador


• TAD = 8TOSC del oscilador del microcontrolador
• TAD = 32TOSC del oscilador del microcontrolador
• TAD = 2-6 µs del oscilador interno de uso específico del A/D

Tiempo de adquisición del S/H

El módulo A/D dispone de un S/H que utiliza un capacitor para mantener el valor de
la señal de entrada fijo durante el tiempo que tarde la conversión. Para cargar el
capacitor se requiere un tiempo TACQ, que se calcula de la siguiente forma:

TACQ = Amplifier Settling Time + Hold Capacitor Charging Time + Temperature


Coefficient
= TAMP + TC + TCOEF
=2µs + TC + [(Temperature -25°C)(0.05µs/°C)]

donde:
TC = CHOLD (RIC + RSS + RS) Ln(1/2047) =- 120pF (1k+ 7k+ 10k)
Ln(0.0004885) =16.47µs

Por lo tanto:
TACQ =2µs + 16.47µs + [(50°C -25°C)(0.05µs/°C)
=19.72µs
El diagrama de bloques del convertidor esta mostrado en la siguiente grafica:

Modo de Compara

El modo compara se utiliza para coordinar actividades en forma periódica.


En el modo de comparación, se utiliza la configuración de bloques mostrada en la
siguiente figura; al limpiar el registro de configuración CCP1CON, se fuerza al
latch de salida a su valor inicial de cero.
El timer1 debe ser configurado en el modo timer o en el modo contador
sincronizado; el dato en el par de registros CCPR1H:CCPR1L se compara con la
cuenta de 16 bits de TMR1 y cuando ocurre una coincidencia, alguno de los
siguientes eventos se puede generar:
• Transición positiva ( cambio de 0 a 1 ) en la línea RC2/CCP1
• Transición negativa ( cambio de 1 a 0 ) en la línea RC2/CCP1
• Se genera interrupción por software pero no cambia la línea RC2/CCP1
• Se genera un disparo de evento especial que no cambia la línea RC2/CCP1, pero
genera una señal interna que se utiliza para generar una acción.
La línea RC2/CCP1, debe ser configurada como salida, haciendo TRISC<2> = 0. El
tipo de evento se indica en los bits CCP1M3:CCP1M0 = CCPCON1<3:0>. Al
presentarse una coincidencia (Match), se prende la bandera de interrupción CCP1IF
= PIR1<2>. El programa de servicio a la interrupción debe limpiar la bandera de
interrupción.
Cuando se selecciona el modo de generación de interrupción por software,
mediante la configuración: CCP1M3:CCP1M0 = CCPCON1<3:0>=1010, al ocurrir
una coincidencia se pone a uno el bit de interrupción CCPIF, pero no se genera
evento por la línea RC1/CCP1.
En el modo disparo por evento especial, mediante la configuración:
CCP1M3:CCP1M0 = CCPCON1<3:0>=1011, se dispara un evento por hardware
interno y esto puede usarse para iniciar alguna acción dentro del programa. El
evento especial resetea TMR1, lo que hace posible que el registro CCPR1 actúe
como registro de periodo para el timer1. En el mòdulo CCP2, además de resetear
TMR1, se inicia una conversión A/D, si el módulo A/D está habilitado. El evento
especial no activa la bandera de interrupción PIR1<0>, en ninguno de los módulos
CCP.
- DESCRIPCIÓN DE LA PRACTICA.

Se implementa la utilización del convertidor analógico-digital del PIC16F877 para


leer una señal analógica en el rango de 0v – 5v, procesarla y enviarla al modulo
PWM para su salida a través de un filtro pasabajas para su conversión nuevamente a
señal analógica.

Para esta practica se utilizo una resolución de 10 bits, es decir que se incremento la
velocidad de muestreo a 19.6KHz. Este muestreo fue implementado por medio del
modulo COMPARE del PIC, donde cada cruce por cero del TIMER1 el modulo
COMPARE manda una interrupción activando al mismo tiempo el convertidor A/D.
El periodo del muestreo es implementado en el MODULO CCP2 con los valores de
los registros CCPR2H y CCPR2L.

La configuración del convertidor A/D s realizo con los voltajes internos como
referencias y solo el canal AN0.

El modulo PWM se configuro en la salida CCP1 con la misma frecuencia para


sincronizar las dos señales 19.6KHz y así utilizar los 10 bits del ciclo de trabajo.

Para alcanzar esta velocidad de muestreo se utilizo un cristal de 20MHz.

El filtro utilizado fue diseñado para una frecuencia de corte de 15KHz, acoplado a
un amplificador no inversor con ganancia de 2.

Las siguientes ecuaciones muestran la configuración del modulo PWM:

Fpwm = 19.6 KHz


Tpwm = 51 uS
Preescala TMR2 = 1;

PR2 = 51 / (4*Tosc*1) - 1 = 51uS / (4 * 0.05 uS) = 255 = 0xFF

PR2 = 0xFF;

100% = (1.00)(51uS)/(0.05uS*1) = 1020

1% = (0.01)(51uS)/(0.05uS*1) = 10.2

el incremento del porcentaje es cada 10.2 unidades es decir cada 0x0A.


Ciclo de trabajo inicia en 1%:

Ctpwm = 1%

CCPR1L:CCP1CON<5:4> = 0000 0010:1:0 = 10 = 0x0A

Resolucion= log(Fosc/Fpwm)/log(2)

Fosc = 20 000 000


Fpwm = 19 600

log(Fosc/Fpwm)=log(20000000/19600) = log(1020) = 3.008

Resolución = 3.008 / log(2) = 9.99 bits

El ciclo de trabajo para el 100% se muestra a continuación:

Ct = 100 % = 1020 d = 11 1111 1100 b

CCPR1L = 0xFF
CCP1X = 0
CCp1Y = 0

El ciclo de trabajo para el 1% se muestra a continuación:

Ct = 1 % = 10 d = 0 0000 1010 b

CCPR1L = 0x02
CCP1X = 1
CCP1Y = 0

El incremento del porcentaje es múltiplo de 10 decimal.

Para la frecuencia del modulo COMPARE se utiliza el mismo periodo que


para el PWM:

MUESTREO = 51 / (4*Tosc*1) - 1 = 51uS / (4 * 0.05 uS) = 255 = 0xFF

PERIODO DE MUESTREO DE 51 uS

CCPR2H = 0x00;
CCPR2L = 0xFF;
El software creado para la practica tendrá el siguiente desarrollo:

• El convertidor A/D se configura con una entrada analógica AN0.


• Los voltajes de referencia son los internos.
• La señal de entrada será muestreada cada 51uS lo cual provoca una
interrupción.
• Cuando el convertidor A/D termine la conversión será enviada al Ciclo de
Trabajo para su salida por el CCP1 (PWM)
• El PWM será convertido a señal analógica equivalente con el filtro pasabajas
y el amplificador no inversor.
• La señal de salida tendrá un retraso de 51uS.

- CIRCUITO COMPLETO

El circuito completo implementado en el PIC16F877 con el filtro de salida.


- PROGRAMA CODIFICADO EN LENGUAJE C:
//programa para establecer el A/D y el D/A del pic 16f877
//cristal 20MHz
//Fpwm = 19.6 KHz
//Fcom = 19.6 KHz

#include <pic.h>
#define PORTBIT(adr,bit) ((unsigned)(&adr)*8+(bit))

/*BITS DEL PWM*/


static bit pwm7 @ PORTBIT(CCPR1L,7);
static bit pwm6 @ PORTBIT(CCPR1L,6);
static bit pwm5 @ PORTBIT(CCPR1L,5);
static bit pwm4 @ PORTBIT(CCPR1L,4);
static bit pwm3 @ PORTBIT(CCPR1L,3);
static bit pwm2 @ PORTBIT(CCPR1L,2);
static bit pwm1 @ PORTBIT(CCPR1L,1);
static bit pwm0 @ PORTBIT(CCPR1L,0);

/*BITS DEL CONVERTIDOR*/


static bit bit7 @ PORTBIT(ADRESH,1);
static bit bit6 @ PORTBIT(ADRESH,0);

static bit bit5 @ PORTBIT(ADRESL,7);


static bit bit4 @ PORTBIT(ADRESL,6);
static bit bit3 @ PORTBIT(ADRESL,5);
static bit bit2 @ PORTBIT(ADRESL,4);
static bit bit1 @ PORTBIT(ADRESL,3);
static bit bit0 @ PORTBIT(ADRESL,2);

static bit bitx @ PORTBIT(ADRESL,1);


static bit bity @ PORTBIT(ADRESL,0);

main()
{
/*************************************/
/* CONFIGURACION DE LOS PUERTOS */

TRISA = 0xFF; //puerto A como entrada


TRISC = 0x00; //PUERTO C COMO SALIDA
TRISD2 = 0;

/*************************************/
/* CONFIGURACION DEL CONVERTIDOR A/D */
//ADCON1
ADFM = 1; //justificado a la derecha

/* CONFIGURACION RA0/AN0 ENTRADA, RA3 -> Vref+ , RA2 -> Vref- */


PCFG3=1; //SOLO RA0 ES CANAL ANALOGICO
PCFG2=1;
PCFG1=1;
PCFG0=0;

//ADCON0
ADCS1 = 0;
ADCS0 = 1; //conversion en Fosc/8

CHS2 = 0; //seleccion del canal analogico AN0


CHS1 = 0;
CHS0 = 0;

ADON = 1; //habilita el convertidor A/D

/***************************************/
/* CONFIGURACION DEL MODULO COMPARE */

//CCP2CON CONFIGURACION PARA INTERRUPCION CON A/D


CCP2M3 = 1;
CCP2M2 = 0;
CCP2M1 = 1;
CCP2M0 = 1;

//PERIODO DE MUESTREO DE 51 uS
CCPR2H = 0x00;
CCPR2L = 0xFF;

//CONFIGURACION DEL TIMER1


//PRE-ESCALA=1
T1CKPS1 = 0;
T1CKPS0 = 0;

//APAGA OSCILADOR PROPIO DE TMR1


T1OSCEN = 0;

//UTILIZA OSCILADOR INTERNO Fosc/4


TMR1CS = 0;

TMR1H = 0;
TMR1L = 0;

TMR1ON = 1;

T1SYNC = 0;

/*********************************************/
/* CONFIGURACION DEL MODULO PWM */

// Fpwm = 19.6 KHz


// Tpwm = 51 uS
// Preescala TMR2 = 1;
//Fpwm = 19.6KHz
//PR2 = 51 / (4*Tosc*1) - 1 = 51uS / (4 * 0.05 uS) = 255 = 0xFF

PR2 = 0xFF;

// 100% = (1.00)(51uS)/(0.05uS*1) = 1020


// 1% = (0.01)(51uS)/(0.05uS*1) = 10.2
// el incremento del procentaje es cada 10.2 unidades
// es decir cada 0x0A.

// Ctpwm = 1%
// CCPR1L:CCP1CON<5:4> = 0000 0010:1:0 = 10 = 0x0A

//Resolucion= log(Fosc/Fpwm)/log(2)

//Fosc = 20 000 000


//Fpwm = 19 600
//log(Fosc/Fpwm)=log(20000000/19600) = log(1020) = 3.008

//Resolucion = 3.008 / log(2) = 9.99 bits

//Ct = 100 % = 1020 d = 11 1111 1100 b

//CCPR1L = 0xFF
//CCP1X = 0
//CCp1Y = 0

//Ct = 1 % = 10 d = 0 0000 1010 b

//CCPR1L = 0x02
//CCP1X = 1
//CCP1Y = 0

//El incremento del porcentaje es multiplo de 10 decimal.

CCPR1L = 0x02;
CCP1X = 1;
CCP1Y = 0;

//Post-escala = 1 del TMR2


TOUTPS3 = 0;
TOUTPS2 = 0;
TOUTPS1 = 0;
TOUTPS0 = 0;

//Pre-escala = 1 del TMR2


T2CKPS1 = 0;
T2CKPS0 = 0;

//Enciende TMR2
TMR2ON = 1;

//Configuracion del CCP1 como PWM


CCP1M3 = 1;
CCP1M2 = 1;
CCP1M1 = 0;
CCP1M0 = 0;

/**************************************************/
/* SE CONFIGURAN LAS INTERRUPCIONES */

CCP2IE = 1;
PEIE = 1;
CCP2IF = 0;
GIE = 1;

/*************************************************/
/* INICIA CICLO DE ESPERA */

for(;;)
continue;
}
//rutina de interrupcion, aqui se hace la lectura del A/D y se
//envia al D/A para su salida en el CCP1
void interrupt CONTROL(void)
{
//La interrupcion cada 51uS
if (CCP2IF)
{
CCP2IF = 0;

while(ADGO); //espera el fin de la conversion

pwm7 = bit7; // MSB


pwm6 = bit6;
pwm5 = bit5;
pwm4 = bit4;
pwm3 = bit3;
pwm2 = bit2;
pwm1 = bit1;
pwm0 = bit0;
CCP1X = bitx;
CCP1Y = bity; //LSB

if (RD2 == 0) RD2 = 1;
else RD2 = 0;
}
}

Das könnte Ihnen auch gefallen