Ir ao conteúdo
  • Cadastre-se

Medindo Frequencia com o PIC


Posts recomendados

Um metodo fácil seria a utilização do modulo CCP do PIC em compare mode, esse modo de operação permite com que ele meça periodos entre duas bordas e retorne o valor no registros CCP1Rh:CCP1Rl depois basta fazer o calculo da frequencia e exibir em uma tela usando a relação f = 1/T onde T é o periodo medido.

Abs.

Link para o comentário
Compartilhar em outros sites

Apenas complementando o que disse o Mestre Felipe :

O sinal a ser aplicado tem de ser perfeitamente quadrado, com transições de descida e de subida bem abruptas.

E lembre-se de fazer um tipo de média para apresentar o valor calculado, para evitar um possível erro estatístico. Medir apenas uma vez e apresentar é muito arriscado !

Outra maneira estatísticamente precisa seria contar as transições de subida ( ou de descida ) durante um certo intervalo de tempo, pois já representa a média de vários ciclos do sinal. Use o TIMER para controlar o tempo, além da interrupção do sinal pela borda escolhida.

Paulo

Link para o comentário
Compartilhar em outros sites

Se você conseguir medir a duração do pulso, você tem a frequencia, como foi mencionado acima. Os dois códigos-exemplo abaixo fazem isso, eles medem a largura do pulso.

EDIT: os dois são para o compilador CCS! :D

Código 1, medindo largura de 1 pulso com o Timer1 e interrupção externa:


#fuses XT,NOWDT
#use delay(clock=4000000)
#include <lcd.c>

Int16 TFB; // Tiempo flanco de bajada
float AP; // Valor final del ancho de pulso
int1 nuevopulso=0; // Entra outro pulso
int1 cambio=0; //Cambio de flanco de disparo

#int_ext
void funcion_ext_int(){ //Función Interrupción
if(cambio==0){ // Flanco de Subida
set_timer1(0); //Inicializa TMR1
ext_int_edge(0,H_TO_L); // Configurar para flanco bajada
cambio=1; // Control de cambio de flanco
} else { // Flanco de Bajada
TFB=get_timer1(); //Valor del Timer1 para el Flanco de bajada
ext_int_edge(0,L_TO_H); //Configurar para flanco subida
cambio=0; //Control de cambio de flanco
if(nuevopulso==0){ //Fin de pulso...
nuevopulso=1; //Pulso a calcular
}
}
}
void main() {
lcd_init();
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); // Configuración TIMER1
ext_int_edge(0,L_TO_H); // Configurar para flanco subida
cambio = 0; // Control de cambio de flanco
enable_interrupts(int_ext); //Habilitación interrupción RB0
enable_interrupts(global); //Habilitación general
do {
if(nuevopulso==1){ // ¿Pulso nuevo?
AP = TFB*1.0; // Ancho de pulso en microsegundos de Timer1…
// a 4MHZ el T=1us*Timer1
printf(lcd_putc,"\nPulso = %6.1fuS ", AP); //Visualiza medida en LCD

nuevopulso=0; //Pulso medido
}
} while (TRUE); //Bucle Infinito
}
#include <16f876.h>

Código 2: Medindo um pulso com o modulo CCP


#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);
}
#include <16f876.h>

Fonte: Livro Compilador C Ccs Y Simulador Proteus Para Microcontroladores Pic por Eduardo García Breijo

Link para o comentário
Compartilhar em outros sites

Particularmente eu uso esse algoritmo em assembly:



COnfigura PIC;
Ports;
Modulo CCP para Capture;

loop:
aguarda interrupção
escreve valor da frequencia na tela

interrupção:
recupera valor em CCP1RH:CCP1Rl
formata valor para fractional
converte para ponto flutuante
multiplica pelo menor valor de periodo possivel para 1MHz por exemplo por 10^-6 (flutuante)
divide 1 por esse valor (ainda em floating)
coverter resultado para inteiro
converte para ASCII
guarda em variaveis teemporaria
retorna da int.

Abs.

Link para o comentário
Compartilhar em outros sites

  • 10 meses depois...
  • 3 anos depois...

Apesar do tópico ser de 2009 não custa tentar.

 

No trecho 

 

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

 

Isso quer dizer que para cada valor binário do timer 0 teremos 1us, correto?

Só não entendi o porque de multiplicar por 1.0, é porque cada bit vale 1uS? Se cada bit valesse 4uS eu multiplicaria por 4.0 para armazenar na variável float?

Link para o comentário
Compartilhar em outros sites

Apesar do tópico ser de 2009 não custa tentar.

No trecho

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

Isso quer dizer que para cada valor binário do timer 0 teremos 1us, correto?

Só não entendi o porque de multiplicar por 1.0, é porque cada bit vale 1uS? Se cada bit valesse 4uS eu multiplicaria por 4.0 para armazenar na variável float?

Por que nao usar a eletronica analogica em conjunto com a digital pra fazer esse trabalho com perfeicao? Dai ate com um pic 12 dá kkkkkk (eu acho)

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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!