Ir ao conteúdo
  • Cadastre-se

Dúvida com Frequêncimetro usando Capture do PIC


Felipe M.R

Posts recomendados

Olá ,estou há algum tempo tentando desenvolver um código para implementação de um frequêncimetro.

Dando algumas olhadas no forum vi um exemplo muito usado pelo pessoal da internet

assim como mostrado no tópico abaixo:

http://forum.clubedohardware.com.br/resolvido-frequencimetro-16f877a/814557

usando o código:

#include <16f876.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#include <lcd.c>
#byte PIR1=0x0C

int1 nuevopulso=0; //Entra outro pulso
int16 TFB=0,TFS=0,TF=0; //Tiempo flancos
float AP=0.0; //Valor final del ancho de pulso
int1 cambio=0; //Cambio de flanco de disparo

#int_ccp1
void ccp1_int(){ //Función interrupción
if(cambio==0){ //Flanco de subida
TFS=CCP_1; //Carga del valor del registro CCPR1 en flanco subida
setup_ccp1(CCP_CAPTURE_FE); //Configuración modo Captura en flanco de bajada
cambio=1; //Control de cambio de flanco
} else { //Flanco de Bajada
TFB=CCP_1; //Carga del valor del registro CCPR1 en flanco bajada
setup_ccp1(CCP_CAPTURE_RE); //Configuración modo Captura en flanco de subida
cambio=0; //Control de cambio de flanco

if(nuevopulso==0){ //Fin de pulso...
nuevopulso=1; //pulso a medir
}
}
}

void main() {

lcd_init();
setup_timer_1(T1_INTERNAL); //Configuración TMR1
setup_ccp1(CCP_CAPTURE_RE); //Configuración modo Captura en flanco de subida
cambio = 0; //Control de cambio a 0

enable_interrupts(int_ccp1); //Habilitación interrupción modulo CCP
enable_interrupts(global); //Habilitación interrupción global

do {
if(nuevopulso==1){ //¿Pulso nuevo?
TF=(TFB-TFS); //Ancho de pulso.
AP = TF*1.0; //Ancho de pulso en microsegundos (a 4MHz:1us)
printf(lcd_putc,"\nPulso = %6.1fuS ", AP);
nuevopulso=0; //Pulso ya medido, espera nuevo
}
} while (TRUE);
}

Uso o Proteus com uma fonte de clock de 1 HZ 1 borda de subida a cada 1s no pino RC2/CCP1

e com a ajuda do virtual terminal observo sua variavel.

porém a variavel que carrega os dados da frequência apresenta sempre o valor de Pulso=41248.0 uS.

Gostaria de saber o que está causando esse erro na medição da Frequência.

Obrigado.

Link para o comentário
Compartilhar em outros sites

Fala colega,

Bom, nãos sei como está testando esse código acima, mas ele deveria estar funcionando Ok.

De toda forma, o código que postei acima só funciona para sinais com 50% de duty cicle. Teste o código melhorado abaixo:

#include <16F876.h>             //O PIC utilizado, obigatório!
//ser utilizado de 8 bits também.
#FUSES NOWDT //Sem Watch dog, evitando reset
#FUSES XT //Crystal de oscilação igual a 4mhz
#FUSES PUT //Tempo de início do PIC
#FUSES NOPROTECT //Codigo sem proteção de leitura, software livre!
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=4000000) //Meu clock

#define use_portb_lcd TRUE

#include <LCD.C> //Rotina de LCD modo 4 vias. Obrigatório!

int1 nuevopulso=0;
int16 T_descida_1=0,T_subida_1=0,T_ON=0,T_total=0,T_subida_2=0;
float32 AP=0.0,freq, d;

int flag;


#int_ccp1
void ccp1_int(void)
{
if (flag == 3)
{
flag = 0;
}

if(flag==0)
{
T_subida_1=CCP_1;
setup_ccp1(CCP_CAPTURE_FE);
}

if (flag == 1)
{
T_descida_1=CCP_1;
setup_ccp1(CCP_CAPTURE_RE);
}

if(flag==2)
{
T_subida_2=CCP_1;
setup_ccp1(CCP_CAPTURE_RE);

if(nuevopulso==0)
{
nuevopulso=1;
}
}
flag++;
}

void main()
{
lcd_init();
setup_timer_1(T1_INTERNAL);
setup_ccp1(CCP_CAPTURE_RE);
flag = 0;

enable_interrupts(int_ccp1);
enable_interrupts(global);
nuevopulso=0;

do
{
if(nuevopulso==1)
{
T_ON=(T_descida_1-T_subida_1);
T_total = (T_subida_2-T_subida_1);

AP = (float)T_total;

freq=(float)1/(AP)*1000000;

d = (float)T_ON*100/T_total;

printf(lcd_putc,"\fFreq = %fHz\nDuty = %2.2f%%", freq,d);
delay_ms (200);
nuevopulso=0;
}
}
while (TRUE);
}

.

Qualquer dúvida é só perguntar.

Falou

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!