Tacômetro ( conta-giros )


O Tacômetro é um instrumento que tem como função básica medir o número de voltas que um eixo irá realizar em determinado tempo. O tacômetro pode ser chamado também de conta-rotações, conta-voltas ou conta-giros. Em aplicações industriais ou mesmo no projeto de determinados tipos de equipamentos eletrônicos de medida é necessário saber a velocidade com que gira um eixo, uma engrenagem ou qualquer outra peça.

A unidade RPM (Rotações Por Minuto), é utilizada de modo geral, para máquinas rotativas de qualquer natureza e ainda pra máquinas geradoras ou motoras. Trata-se de uma unidade prática. De fato, a unidade SI equivalente é o radiano por segundo.

O projeto consiste em um microcontrolador PIC16f628A fabricado pela Microchip Technology, que verifica quantos pulsos são gerados pelo sensor. Para isso é utilizado o modulo CPP, configurado para fazer a captura a cada borda de subida durante 1 (um) segundo. Para definir este 1 segundo com precisão, utilizamos o modulo TIMER1, configurado no modo temporizador. Assim temos o numero de pulsos ocorridos em um segundo, que multiplicados por 60 (sessenta), obtemos o numero de eventos ocorridos durante um minuto. De posse deste valor utilizamos um simples Display LCD 16x2, no qual exibimos a cada 1 (um) segundo, o numero de rotações por minuto.

O Display LCD 16x2 torna o projeto muito mais amigável ao usuário, além de aumentar a gama de funções e operações com um custo relativamente baixo. Por ultimo temos os sensores que neste caso foi desenvolvido de duas maneiras: detecção por reflexão e detecção por interrupção de feixe. Para maiores informações acesse: Sensor Infravermelho
 

Dados técnicos
Designação
Tacômetro Digital
Mostrador Display LCD 16x2 
Faixa de velocidades de rotação Modo óptico: 60 a 60.000 rpm
(ou equivalente mecânico)
Fonte de alimentação 6 a 30 Volts (possui regulador interno)
Sensor Reflexão e Interrupção

A lista de componentes necessários:



Componentes somente para Tacômetro
Quantidade
Componente
Código
1
Capacitor
100 uF / 50v
1
Conector
Jack J4 (2,1 x 5,5 mm)
1
Placa
6 x 10 cm
1
Regulador
LM 7805
1
Trimpot
10 K ohms
2
Capacitor
0.1 uF
2
Led
5 mm
1
Diodo
1N4004
1
Microcontrolador
PIC16f628A
1
Cristal
4 MHz
2
Capacitor
22 pF
2
Resistor
470 ohms
1
Resistor
150 ohms
2
Resistor
10 K ohms
2
Push-button
5 mm
1
Soquete de Barra
180 Graus 2,54mm
1
Barra de Pinos
11,2mm 180 graus
1
Conector
KK 3 Vias Macho
1
Display
Display LCD 16x2
Componentes somente para sensor ( reflexão )
Quantidade
Componente
Código
1
Resistor
470 ohms
1
Resistor
47 K ohms
1
Receptor infra-red
TIL78 ( 5mm )
1
Emissor infra-red
TIL32 ( 5mm )
1
Capacitor
1 nF
Componentes somente para sensor ( interrupção )
Quantidade
Componente
Código
1
Resistor
470 ohms
1
Resistor
47 K ohms
1
Capacitor
1 nF
1
Sensor
Phct203 ou Itr8102

E por fim o esquemático, para isso foi utilizado o 
EAGLE Software Design PCB disponivel para download no site:
Ferramenta fácil de usar, e muito poderosa para projetar placas de circuito impresso.

 Este é o Schematic do Tacômetro ( conta-giros ) elaborado no 

EAGLE Version 5.10.0 ou superior. 

 

 

E assim ficou o Tacômetro ( conta-giros ) 

 

Com as seguintes dimensões: 
Altura: 28 mm 
Largura: 59 mm 
Comprimento: 98 mm 








Se desejar, veja o vídeo abaixo com o Tacômetro ( conta-giros ) em funcionamento.



Para este projeto é recomendado a utilização do seguinte display: Powertip PC 1602-F ou similar desde que possua a mesma sequencia de conexão.

Segue abaixo as configurações da conexão do display


Sensor - 01 (Detecção por Interrupção )




Com as seguintes dimensões:
Altura: 10 mm
Largura: 20 mm
Comprimento: 40 mm 

Este é o Schematic do Sensor - 01 (Detecção por Interrupção ) elaborado no 

EAGLE Version 5.10.0 ou superior 




Sensor – 02 (Detecção por Reflexão) 



Com as seguintes dimensões:
Altura: 10 mm
Largura: 17 mm
Comprimento: 35 mm 

Este é o Schematic do Sensor – 02 (Detecção por Reflexão) elaborado no 

EAGLE Version 5.10.0 ou superior

 



Se quiser ter acesso ao arquivo basta clicar em download:
Código-fonte. Compilador: mikroC PRO for PIC ver 5.60 ou superior.
Download

Se quiser ter acesso ao arquivo basta clicar em download:
CONTEÚDO COMPLETO elaborado no EAGLE - Version 5.10.0 ou superior. 
Download


Segue abaixo o código-fonte. Compilador utilizado: mikroC PRO for PIC ver 5.60 ou superior.
////////////////////////////////////////////////////////////////////////////////
//          Programa Projeto Tacômetro ( Conta-giros )                        //
//          Microcontrolador PIC16f628A                                       //
//          Compilador mikroC PRO for PIC ver 5.60                            //
//          Autor: Jeferson Alves Oliveira                                    //
//          Site: http://eletricamentefalando.blogspot.com.br/                //
////////////////////////////////////////////////////////////////////////////////

// Declara as Variáveis Globais ************************************************
sbit LCD_RS at RB1_bit;         // Determina o bit de instruções ou dado
sbit LCD_EN at RB2_bit;         // Determina o bit de "enable" do LCD
sbit LCD_D4 at RB7_bit;         // Determina pino de dados do LCD
sbit LCD_D5 at RB6_bit;         // Determina pino de dados do LCD
sbit LCD_D6 at RB5_bit;         // Determina pino de dados do LCD
sbit LCD_D7 at RB4_bit;         // Determina pino de dados do LCD

sbit LCD_RS_Direction at TRISB1_bit; // Direção dos pinos do LCD
sbit LCD_EN_Direction at TRISB2_bit; // Direção dos pinos do LCD
sbit LCD_D4_Direction at TRISB7_bit; // Direção dos pinos do LCD
sbit LCD_D5_Direction at TRISB6_bit; // Direção dos pinos do LCD
sbit LCD_D6_Direction at TRISB5_bit; // Direção dos pinos do LCD
sbit LCD_D7_Direction at TRISB4_bit; // Direção dos pinos do LCD

// Declara as variáveis  *******************************************************
const char character[] = {4,10,14,17,17,17,14,0};
unsigned char txt[10];
unsigned int pulsos = 0;
unsigned int total = 0;
int timer = 0;

// Protótipos de funções *******************************************************
void CustomChar(char pos_row, char pos_char);
void interrupt();
void RPM();

// Inicio  *********************************************************************
void main()
{
// Configura as Portas *********************************************************
   TRISA = 0b00100000;          // define PORTA como ssesssss
   TRISB = 0b00001000;          // define PORTB como ssssesss
   INTCON.GIE = 1;              // Habilita chave geral das interrupções
   INTCON.PEIE = 1;             // Habilita Interrupção dos periféricos
   PIE1.TMR1IE = 1;             // Habilita interrpções de TMR1
   PIE1.CCP1IE = 1;             // Habilita Interrupção do módulo CCP
   T1CON = 0b00110001;          // Liga TIMER1, prescaler 1:8, Clock interno
   CCP1CON = 0b00000101;        // CCP1 em modulo CAPTURA e borda de SUBIDA
   //CCP1CON = 0b00000100;      // CCP1 em modulo CAPTURA e borda de DESCIDA
   PIR1.CCP1IF  = 0;            // Limpa a flag para nova captura
   PIR1.TMR1IF = 0;             // Limpa a flag do TIMER1 para uma nova contagem

// Atribuição ******************************************************************
   TMR1H = 0b00001011;          // Inicializa os registradores do TMR1
   TMR1L = 0b11011011;          // (65535 - 3035) x (1 (Fosc / 4)) x Prescaler
   
// Configura LCD ***************************************************************
   Lcd_Init();                  // Inicializa o LCD
   Lcd_Cmd(_LCD_CLEAR);         // Limpa o display
   Lcd_Cmd(_LCD_CURSOR_OFF);    // Desliga o Cursor

   Lcd_Cmd(_LCD_CLEAR);         // Limpa o display
   Lcd_Out(1,5,"Jeferson");     // Escreve o texto na primeira linha
   Lcd_Out(2,5,"Projetos");     // Escreve o texto na segunda linha
   Delay_ms(2000);

   Lcd_Cmd(_LCD_CLEAR);         // Limpa o display
   Lcd_Out(1,4,"Tacômetro");    // Escreve o texto na primeira linha
   CustomChar(1,7);             // Escreve o Caractere ô
   Lcd_Out(2,3,"Conta-giros");  // Escreve o texto na segunda linha
   Delay_ms(2000);
   
   Lcd_Cmd(_LCD_CLEAR);         // Limpa o display
   Lcd_Out(1,4,"Tacômetro");    // Escreve o texto na primeira linha
   CustomChar(1,7);             // Escreve o Caractere ô
   Lcd_Out(2,3,"RPM = ");       // Escreve o texto na segunda linha

// Loop ************************************************************************
do {
   if (timer == 2)
      {
      timer = 0;
      RPM();
      }
      else if (timer > 2)
           {
           timer = 0;
           PORTB.F0 = 1;        // Em caso de erro de leitura liga o led(pino 6)
           Delay_ms(20);
           PORTB.F0 = 0;
           }
   } while(1);
}

// Funções *********************************************************************
void CustomChar(char pos_row, char pos_char){
  char i;
    Lcd_Cmd(64);
    for (i = 0; i<=7; i++) Lcd_Chr_CP(character[i]);
    Lcd_Cmd(_LCD_RETURN_HOME);
    Lcd_Chr(pos_row, pos_char, 0);
}

void interrupt()
{
if(PIR1.CCP1IF)
{
  PIR1.CCP1IF = 0;              // Limpa a flag para nova captura
  pulsos ++;
}
else if(PIR1.TMR1IF)
     {
     PIE1.TMR1IE = 0;           // Desabilita interrpções de TMR1
     PIE1.CCP1IE = 0;           // Desabilita interrupção - periféricos CCP1
     TMR1H = 0b00001011;        // Inicializa os registradores do TMR1
     TMR1L = 0b11011011;
     timer ++;
     PIR1.TMR1IF = 0;           // Limpa a flag do TIMER1
     PIE1.CCP1IE = 1;           // Habilita interrupção - periféricos CCP1
     PIE1.TMR1IE = 1;           // Habilita interrpções de TMR1
     }
}

void RPM()
{
  total = pulsos * 60;
  WordToStr(total, txt);        // Converte em texto para impressão
  Lcd_Out(2,9,"        ");      // Limpa a segunda linha
  Lcd_Out(2,9,txt);             // Imprime valores no display
  pulsos = 0;
}

41 comentários:

Paulo disse...

Cara muito bom, obrigado por disponibilizar o código fonte.

ricardo karkow disse...

na placa aparece um transistor, na lista de componentes não tem, nem no schematic. para que ele serve? Ricardo Karkow. email, ricardo.karkow@gmail.com

Jeferson Alves Oliveira disse...

Caro Ricardo, imagino que você esteja se referindo ao regulador de tensão LM7805 que tem o mesmo encapsulamento (TO-220) de alguns transistores.

Rafael Obara disse...

Você poderia disponibilizar o código em assembly?

Jeferson Alves Oliveira disse...

Caro Rafael, o código em assembly está disponível para download em conjunto com o código fonte.

Adriano disse...

Boa noite amigo,
Gostei muito do blog e desse projeto, ja vi outros mas esse ficou muito bom mesmo.
Estou precisando de um tacometro que tenha uma maior resolução, pelo menos 1 RPM de resolução... quero dizer que ele varie pelo menos 1 RPM e não 60 como nesse caso...poderia me ajudar nessa situação?

Jeferson Alves Oliveira disse...

Caro Adriano, uma solução simples seria substituir a multiplicação, por um acumulador de 1 (um) minuto e assim o display seria atualizado somente neste momento. Mas em breve disponibilizarei uma solução mais elaborada. Espero ter ajudado.

Guilherme Negrello disse...

ola, Parabéns pelo blog, eu não sou formado em eletrônica nada, mais gosto muito disso, vc não tem esses projetos em kits para vender??obrigado

Gerardo Inostroza disse...

hola amigo, que buen trabajo hiciste con esto, pero tengo una pregunta, ¿Cómo se conecta la pantalla ? la fotografía dice algo diferente a lo que dice el archivo de eagle que he descargado, muchas gracias. También me gustaría saber el datasheet de la pantalla que tu estas usando, saludos.

Jeferson Alves Oliveira disse...

Caro Guilherme, obrigado por se interessar em nossos projetos, mas infelizmente este não esta disponível para venda, pois o objetivo do blog no momento é somente compartilhar circuitos e informações.

Jeferson Alves Oliveira disse...

Caro Gerardo, Muito obrigado por relatar o nosso erro, realmente os bits D4 á D7 estavam com os nomes no esquemático invertidos, porem isso não impossibilitava o funcionamento e sim o entendimento do projeto. As devidas alterações foram realizadas. Espero ter ajudado.

Rotricia disse...

preciso do seu contato

Guilherme Marcelino disse...

oi tudo bem gostaria de saber se é possível transformar o código para o pic 18f4520? muito obrigado.

Jeferson Alves Oliveira disse...

Caro Guilherme, é possível sim, mas deve ser feito algumas alterações na parte onde as portas são configuradas o restante não necessita de alterações.

Israel Prateano disse...

Boa noite.

Estamos montando seu projeto, porém estamos utilizando um outro tipo de display(Ampire 1628D) e surgiu uma dúvida em relação a pinagem pois no tutorial a sequencia da pinagem é uma e no esquema é outra. exemplo no tutorial começa com 15 e 16 depois 1,2,3,4etc. no esquema a sequencia é de 1 a 16. existe alguma diferença pois estamos com dúvidas...

Jeferson Alves Oliveira disse...

Caro Israel, Pode seguir a configuração da ultima imagem, pois na verdade não existe diferença alguma, pois no esquemático está a configuração de um Soquete de Barra, do mesmo utilizado no Arduino por exemplo. Caso a ordem dos pinos do seu display seja diferente do display que nos utilizamos então uma boa solução seria você utilizar um cabo flat, por exemplo, ao invés da barra de pinos. Espero ter ajudado.

FaBiOoOo disse...

olá, primeiro parabens, bom estou querendo montar o meu tacometro, porém quero faze-lo com display e leds e ainda gostaria de colocar potenciomentros ao invez de botoes, onde os pulsos tem que ser retirados do cabo que vai para vela, eu pediria encarecidamente que voce me ajude, poderia me responder via email? fabio.musicosax@gmail.com por favor fico no seu aguardo

Luã Sena disse...

Jeferson. por favor me tire uma dúvida: qual seria a função do capacitor na saída do sensor ir?Eu não poderia colocar direto?

Luã

Neofito disse...

Ei uma pergunta os dois resistores que vão nos trilhos da placa que são de valor

Neofito disse...

Olá jefferson queria perguntar se o que está nas trilhas da placa são capacitores ou resistores e valor que são devidos

Jeferson Alves Oliveira disse...

Caro Neofito, os componentes que você imagina que seja “ capacitores ou resistores ” na verdade são Jumper SMD, ou seja são resistores SMD com resistência zero ohm, espero ter ajudado.

Neofito disse...

Obrigado felicitar jefferson excelente projeto que é que eles são apenas pontes entre as placas se eles me ajudaram e graças a você, eu modifiquei para lcd 1602 A, tenha um bom dia

Neofito disse...

Obrigado felicitar jefferson excelente projeto que é que eles são apenas pontes entre as placas se eles me ajudaram e graças a você, eu modifiquei para lcd 1602 A, tenha um bom dia

Luiz Gustavo disse...

Caro Jefinho,
Show de bola, esse projeto!
Vejo sempre os projetos.
Abraços...
Att
Mineiro

Gabriel Humberto Graciano Martínez disse...

Jefferson Olá, primeiro quero parabenizá-lo por seu projeto, é uma grande contribuição. Eu estou tentando fazer, mas quando eu queimar o flash PIC aparece um erro, você poderia me ajudar?

Gabriel Humberto Graciano Martínez disse...

Primeiro de tudo, quero parabenizá-los pela contribuição, é um grande projeto. Mas a tentativa e eu tenho um problema quando queimar o PIC, o programa que você usa para gravar o PIC?

Jeferson Alves Oliveira disse...

Mineiro, muito obrigado.

Jeferson Alves Oliveira disse...

Caro Gabriel Humberto, você não especificou qual o problema e também não falou qual a gravadora. A gravadora mais simples que pode ser utilizada seria a JDM. Se for essa que você está utilizando, será necessário que além dos 5 pinos de gravação do padrão ICSP, será necessário também garantir que o pino RB4/PGM esteja em nível baixo.
E a respeito da gravadora que eu utilizo é a PICkit™2 apresentada aqui no blog. Espero ter ajudado.

Elcio Oliveira disse...

Jeferson, muito bom este projeto. Tentei utilizar o mesmo codigo para o pic 16f877a mas não funcionou quando simulei no proteus. Já fiz algumas alterações que julguei necessárias em função do pic mas mesmo assim não funcionou na simulação. Vc pode dar alguma dica? Desde já agradeço!!!

Jeferson Alves Oliveira disse...

Caro Elcio, sugiro que utilize a opção de contato e envie o seu código para que possamos analisá-lo.

Matheus Brutti disse...

Caro jeferson, gostei muito do seu projeto e gostaria da sua ajuda, queria incrementar ele e por um controle de velocidade e ainda uma função para inverter o sentido da rotação do motor cc e mostrar na tela lcd. Se puder me ajudar com o circuito e algoritmo. Desde já agradeço. Grande abraço.

Adilson Matos disse...

boa tarde amigo, gostaria de saber qual equipamento utilizar para interromper um motor por números de giros? exemplo interromper na vigésima volta...

Fellipy Albuquerque disse...

Caro amigo Jeferson Alves , meu pai é eletricista automotivo , e gostaria de saber se este conta-giros também pode ser instalado em painéis automotivos ?

Marcelo Silva disse...

Parabéns Jeferson por compartilhar o seu conhecimento.

Elailson Santos disse...

cara, muito bom seu projeto parabéns, publicações como essa, me faz acreditar que existe pessoas engajadas em passar conhecimento, sem se preocupar com o ''eu consegui tenho que ficar só para mim''.

Bruno Souza disse...

Seria possivel fazer isso no arduino Uno?

Ana Paula de Carvalho disse...

OI tudo bem para Pic18f2550 como fica

Aureo Chaves disse...

porque o meu da erro no arduino?

Jorge Vander disse...

Olá, muito bom seu projeto gostaria de saber como ficaria o código para leituras a partir de 1rpm?

Jorge Vander disse...

Olá Jéferson, muito bom seu projeto, gostaria de saber como ficaria o código para leituras a partir de 1rpm?

stagenspool.com disse...

Amigo, qual posso usar para receber o sinal enrolando um fio 5 vezes no cabo de vela do primeiro cilindro? (capacitivo)

obrigado!

Postar um comentário

Todos os comentários são lidos e moderados previamente.
- Para solicitação de algum material não disponível no blog utilize o formulário de CONTATO.

Compartilhando Circuitos e Informações