Ir ao conteúdo

Posts recomendados

Postado

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.

Postado

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

Postado

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

Postado

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.

  • 10 meses depois...
Postado

gostaria de saber como posso ter a porcentagem do ciclo no lcd?

porque pretendo usa-lo em um circuito que vai ficar ligando e desligando em uma freqüência que vai variar de 100Hz a 200Hz

desde já agradeço.

  • 3 anos depois...
Postado

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?

Postado

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)

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