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
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:
Cara muito bom, obrigado por disponibilizar o código fonte.
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
Caro Ricardo, imagino que você esteja se referindo ao regulador de tensão LM7805 que tem o mesmo encapsulamento (TO-220) de alguns transistores.
Você poderia disponibilizar o código em assembly?
Caro Rafael, o código em assembly está disponível para download em conjunto com o código fonte.
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?
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.
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
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.
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.
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.
preciso do seu contato
oi tudo bem gostaria de saber se é possível transformar o código para o pic 18f4520? muito obrigado.
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.
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...
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.
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
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ã
Ei uma pergunta os dois resistores que vão nos trilhos da placa que são de valor
Olá jefferson queria perguntar se o que está nas trilhas da placa são capacitores ou resistores e valor que são devidos
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.
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
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
Caro Jefinho,
Show de bola, esse projeto!
Vejo sempre os projetos.
Abraços...
Att
Mineiro
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?
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?
Mineiro, muito obrigado.
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.
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!!!
Caro Elcio, sugiro que utilize a opção de contato e envie o seu código para que possamos analisá-lo.
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.
boa tarde amigo, gostaria de saber qual equipamento utilizar para interromper um motor por números de giros? exemplo interromper na vigésima volta...
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 ?
Parabéns Jeferson por compartilhar o seu conhecimento.
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''.
Seria possivel fazer isso no arduino Uno?
OI tudo bem para Pic18f2550 como fica
porque o meu da erro no arduino?
Olá, muito bom seu projeto gostaria de saber como ficaria o código para leituras a partir de 1rpm?
Olá Jéferson, muito bom seu projeto, gostaria de saber como ficaria o código para leituras a partir de 1rpm?
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.