Ir ao conteúdo
  • Cadastre-se

PIC 16F877A conta giros


Delphing

Posts recomendados

Olá pessoal, gostaria de construir um conta giros para moto que mostre a rotação em display de 7 segmentos.

Possuo certo conhecimento com PIC e pretendo usar o 16F877A, o que realmente preciso é de umas idéias de como fazer isso.

Sei que no caso da moto como é uma moto de 1 cilindro e 4 tempos, então é a relação de pulso de ignição para voltas é de 1 pulso para cada 2 voltas

então a quantidade de pulsos é exatamente a metade da quantidade de voltas.

Eu estava pensando em fazer da seguinte forma, verificar quando ocorrer 2 pulsos de ignição e contar qual a diferença de tempo entre eles e através disto eu poderia definir a rotação.

O problema neste caso é que não sei se teria uma precisão pois, sei que com os PICs não é muito simples de lidar com tempo :D

Alguém teria alguma outra ideia de como fazer isto?

Gostaria que fosse algo bastante preciso e com um atraso de no máximo 500 ms entre uma contagem e outra.

Desde já, agradeço a atenção. Obrigado.

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

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