Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
Delphing

PIC 16F877A conta giros

Recommended Posts

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.

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Opa Matheus, cara obrigado pela resposta, vou dar uma verificada nos códigos passados, quanto ao CCS é exatamente este que estou usando ficou perfeito HE HE HE

    Qualquer coisa posto aqui novamente

    Abraço

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×