Вы находитесь на странице: 1из 3

PWM E MEDIO DE TEMPO DE EVENTOS (MDULOS CCP)

Raniere Lira
Raniere Lira de Sousa Martins acadmico de Engenharia Eltrica pela UFPI (ranieresystem@hotmail.com)
Resumo Pretende-se mostrar com este trabalho a
programao avanada em linguagem C para o PIC
16F877A bem como a familiarizao com os comandos
de configurao do mdulos CCP sendo compilado no
CCS.
Palavras-chave Linguagem C, Mdulos CCP,
16F877A, duty cycle, PIC C Compiler(CCS).
I. INTRODUO
A. Mdulo Comparador
O mdulo comparador contm dois comparadores
analgicos com entradas multiplexadas em RA0 RA3,
podendo utilizar fonte de referncia externa ou interna no
chip com resoluo de 4 bits permite 16 valores de
referncia. Por sua vez o comparador pode disparar no flanco
positivo o negativo, tendo suas configuraes controladas
pelo registro CMCON no endereo 01Fh.
A Operao de comparao (no confundir com
comparador CCP) ocorre com dois sinais analgicos em
sua(s) porta(s), quando a tenso analgica em Vin+ for
menor que em Vin-, a sada do comparador ser 0 (zero) e
quando a tenso analgica em Vin+ for maior que em Vin-, a
sada do comparador ser 1 (um), sada esta digital que
apresenta uma pequena rea incerta (conforme vemos na figura ao lado) em resposta do tempo de aquisio que 150
ns(tpico e 400ns mximo).

Fig. 1 Entrada onda senoidal e sada digital

V = Vdd - Vss
V = Vref(+) - Vref(-)
Sadas digitais
Como podemos variar, a qualquer momento, a tenso de
referncia temos uma possibilidade interessante que a
construo de gatilho via hardware, onde a tenso ao disparar
o comparador aciona flag de interrupo CMIF bit 6 do
registro PIR1, procedendo a captura de um sinal inclusive
com ajuste de disparo na subida ou descida do pulso.
A funo que nos permite ajustar as opes dos
comparadores Setup_comparator( modo ), onde modo pode
ser uma das seguintes constantes internas.
Tabela 1.

O Reset coloca os comparadores em default (CM2:CM0 =


000) e desconecta suas sadas. Quando em repouso ou
SLEEP o com-parador continua funcionando e tendo
habilitado a interrupo, uma variao em qualquer de suas
sadas ir gerar um pedido de interrupo, tirando o PIC do
repouso.
Caractersticas do mdulo comparador
Voltagem de referncia interna selecionvel em 16 nveis.
Tempo de ajuste da voltagem de referncia de
10us(mx)
Tempo de resposta do comparador de 400ns (mx)
Entradas analgicas (devem estar entre Vdd e Vss)
Possveis valores para seleo de voltagem

Exemplo:
setup_comparator (A0_A3_A1_A2);
setup_comparator(A0_VR_A1_VR); //A0 e A1 com
voltagem de referncia interna.
B. Tenso de Referncia
Este mdulo consiste em uma rede de 16 resistores de
preciso em srie que provm 16 valores de tenso com sada
no pino RA2, controlados pelo registro VRCON, endereo
9Fh.

Os valores de tenso obtidos neste mdulo alm de


utilizados como fonte de referncia para os comparadores
analgicos, esto tambm disponveis para uso externo se o
bit VROE estiver em 1. O reset desabilita a tenso de
referncia, limpando o bit VREN (VRCON <7>), desconecta
a Vref do pino RA2 limpando o bit VROE (VRCON
<6>),seleciona a faixa de alta voltagem limpando o bit VRR
(VRCON <5>) e limpa os bit VR3,VR2,VR1, VR0. j o
repouso ou o estouro de WDT no afeta o registro.
A funo para que nos permite ajustar a tenso de
referncia Setup_Vref( modo | valor ), onde modo uma
das seguintes constantes internas do compilador.
Tabela2.

set_tris_c(0b00000000);
// TODO: USER CODE!!
setup_ccp1(CCP_PWM);
while(1)
{
int16 x,t;
delay_ms(10);
//Conforme o valor lido, o
duty cycle do PWM alterado a cada 10 ms
x=read_adc();
//Efetua uma converso A/D
set_pwm1_duty((x*200)/1023);
//
output_bit(pin_c2,x);
}
}

Em combinao com a constante podemos opcionalmente


utilizar uma constante para valor podendo ser um inteiro de 0
15, que em conjunto com a retorna o valor setado para
referncia.
Para VREF_LOW, temos Vref = (VDD * valor / 24)
Para VREF_HIGH, temos Vref = (VDD *
valor/32)+VDD/4

II. DESENVOLVIMENTO
Foi escrito um programa em C para o PIC 16F877A para
efetuar a leitura de tenso de um potencimetro, utilizando
um conversor A/D e gerar um sinal PWM com frequncia de
20 kHz atravs do mdulo CCP1.
Neste programa conforme cada valor lido, o duty cycle do
PWM alterado a cada 10 ms. O cdigo fonte encontra-se
abaixo:
#include <PWM.h>
void main()
{
setup_adc(adc_clock_internal);
//configura o
conversor A/D com clock interno
setup_adc_ports(AN0);
//configura a porta A0
como entrada analgica
set_adc_channel(0);
//seleciona o canal 0
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|
RTCC_DIV_1);
//clock interno: Fosc/4
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
//clock interno: Fosc/4
setup_timer_2(T2_DIV_BY_1,49,1);
//
(Fosc(4.000.000)/4)/(49+1) = 20.000 Hz
setup_vref(FALSE);

Outro programa foi escrito para configurar o mdulo


CCP2 para gerar um PWM na frequncia de 20 kHz e ento,
utilizado o mdulo CCP (no modo CAPTURA) para receber
o sinal PWM gerado pelo mdulo CCP2 acendendo um led
caso o tempo em alto seja maior que 25 us. O Cdigo fonte
pode ser visto abaixo:
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)

// Para inicializao rapida dos ports

#byte porta = 0x05


#byte portb = 0x06
#byte portc = 0x07
#byte portd = 0x08
#define trisc 0b00000000 // 1 e 2 output
//
#bit captura = 0x0C.2 //CCP1IF
#bit interrupcao = 0x8C.2 //CCP1IE
#bit cap_lsb = 0x0F.2 //CCPR1L
#bit cap_msb = 0x10.2 //CCPR1H
void main()
{
set_tris_a(0b11111111); // configurao da direo dos
pinos de I/O
set_tris_b(0b00000000); // 0b R7 R6 R5 R4 R3 R2 R1
R0
set_tris_c(0b00000000); // 0 = SAIDA
1 =
ENTRADA

setup_adc(adc_clock_internal);
conversor A/D com clock interno

//configura o

setup_adc_ports(AN0);
//configura a porta A0
como entrada analgica
set_adc_channel(0);
//seleciona o canal 0
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
//clock interno: Fosc/4
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
//clock interno: Fosc/4
setup_timer_2(T2_DIV_BY_1,49,1);
//
(Fosc(4.000.000)/4)/49 = 20408,16 Hz~ 20kHz
setup_ccp2(CCP_PWM);
//Configura o
modulo CCP2para gerao PWM
setup_ccp1(CCP_CAPTURE_RE);
//Configura
o modulo CCP2 para modo captura borda de subida
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
// TODO: USER CODE!!
Set_tris_b(trisc);
//direo dos bits do portB
portc = 0; //zera todos os bits
while(true)
{
int16 tempo,x,cap;
float temp_cap;
delay_ms(10);
//Conforme o valor lido, o
duty cycle do PWM alterado a cada 10 ms
x=read_adc();
//Efetua uma converso
A/D
set_pwm2_duty((x*200)/1023);
//
output_bit(ccp_2,x);
captura = 0; //zera flag de captura
interrupcao= 0; //zera flag de interrupo
set_timer1(0); //zera o timer1 , incremento a cada 1us.
while( ! captura ); //executa enquanto no capturou
temp_cap=0.000026;
cap=cap_msb<<256+cap_lsb;
if(temp_cap>cap)
{
setup_ccp1(CCP_CAPTURE_FE);
//conf.
p borda de descida
tempo = ccp_1;//houve um evento em portc
capturou o tempo

printf("tempo (us) = %2X\n\r", tempo); //envia ao


PC
delay_ms(200);
output_bit(ccp_1,cap);
}
}
}
No softaware PROTEUS foi efetuada a montagem do
HARDWARE necessria para simulao do programa. Todos
os cdigos-fonte e arquivos de montagem do proteus esto
em anexos na pasta do relatrio.
III. CONCLUSO
Com esta prtica foi possvel observar e analisar um
cdigo em linguagem C que efetua a leitura de tenso de um
potencimetro e gera um sinal PWM. Esta operao
realizada graas a configurao do Mdulo CCP que gera,
compara e captura sinais PWM.
Observou-se na simulao do PROTEUS que o sinal
PWM foi gerado podendo ser observado atravs do
osciloscpio ligado ao pino CCP1.
O cdigo proposto em laboratrio foi realizado de certa
forma sem problemas porm, para o modo captura as
dificuldades aumentaram pois o led no piscou como
esperado.
Portanto, v-se que a prtica em laboratrio ocorreu como
planejado, apesar das difculdades encontradas foi possvel
implementar o programa.
REFERNCIAS
[1] Milan Verle, PIC Microcontrollers - Programming in C,
1a Ed., MikroElektronika, 2009.
[2] Andrew S. Tanenbaum, Organizao Estruturada de
Computadores, 5a Ed., Pearson, 2006.
[3] J. L. Hennessy & D. A. Patterson, Arquitetura de
Computadores - Uma Abordagem Quantitativa, Editora
Campus, 2003.
[4] Introduo as Linguagens de Programao Assembly.
Disponvel
em:
http://pt.wikiversity.org/wiki/IntroduCA0s_Linguagens_d
e_ProgramCA3o/Assembly. Acessado em: 06/12/13

Вам также может понравиться