Ir ao conteúdo
  • Cadastre-se

Frequencímetro com 16F877A, avaliação!


MatheusLPS

Posts recomendados

Olá galera, estou aqui mais uma vez para pedir um conselho...

Sempre quis fazer um frequencímetro com PIC, já tinha tentado de tudo.. ai hj resolvi ler sobre os timers e as interupções (tem uns 4 meses que estou estudando PIC sozinho). Até que consegui fazer alguma coisa.. mas não sei se tá certo...

O código ficou muito pequeno, acho q foi fácil de mais para estar certo, por isso estou pedindo ajuda de vocês.

Programei no CCS em C.

Se eu colocar um clock na entrada, a frequencia sai certinha.... Mas se for um sinal não estão perfeito como o clock, por exemplo um sinal quadrado mas com tempo de subida e queda de 1uS, já dá errado.

Minha ideia é contruir um Tacômetro.. o apartelho que lê RPM. Se o circuito estiver correto.. fica fácil dae p frente..

O circuito:

freqm.jpg

O código:

#include <16F877a.h>
#use delay (clock=4000000)
#fuses NOWDT,PUT,BROWNOUT,NOLVP

#include <LCD.C>

#define LED1 PIN_A0
#define LED2 PIN_C3
#define ENTRADA PIN_B0

int conta=0;
int freq=0;
int periodo=0;
int tempo_t1=0;
int tempo_0=0;

#int_timer0
void trata_t0 ()
{
conta++;
if (conta == 63)
{
conta=0;
freq=tempo_t1;
set_timer1(0);
tempo_t1=0;
}
}

void main ()
{
lcd_init();
set_timer0(131);
set_timer1(0);
setup_timer_1 (T1_EXTERNAL);
setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_64);
enable_interrupts (global | int_timer0);

while (true)
{
tempo_t1=get_timer1();

lcd_gotoxy (1,1);
printf (lcd_putc,"Entrada:" "%u",tempo_t1);
lcd_gotoxy (1,2);
printf (lcd_putc,"Frequencia:" "%u" "Hz",freq);
}
}

Obrigado!

Link para o comentário
Compartilhar em outros sites

Matheus,

ja pensou em usar o modulo CCP do PIC no modo capture? ele permite que você consiga medir periodos, com isso basta calcular seu inverso e obter a frequencia.

Para sinais estranhos, o ideal é fazer um circuito wave shaper de modo que o sinal estranho passe por ele e na saida aparece um sinal digital TTL quadradinho.

Estude essa possibilidade, creio que seja bem interessante.

Bons projetos.

Abs.

Link para o comentário
Compartilhar em outros sites

opa, obrigado pela dica pessoal!

Fui pesquisar e achei um código exatamente dizendo como fazer usando o módulo CCP, testei aqui e funcionou perfeitamente:

#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);
}

resolvido!

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!