Escolar Documentos
Profissional Documentos
Cultura Documentos
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 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
Modo óptico: 60 a 60.000 rpm
Faixa de velocidades de rotação
(ou equivalente mecânico)
Fonte de alimentação 6 a 30 Volts (possui regulador interno)
Sensor Reflexão e Interrupção
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.
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 inte
rno
CCP1CON = 0b00000101; // CCP1 em modulo CAPTURA e borda de SUBI
DA
//CCP1CON = 0b00000100; // CCP1 em modulo CAPTURA e borda de DESC
IDA
PIR1.CCP1IF = 0; // Limpa a flag para nova captura
PIR1.TMR1IF = 0; // Limpa a flag do TIMER1 para uma nova c
ontagem
// Atribuição ***********************************************************
*******
TMR1H = 0b00001011; // Inicializa os registradores do TMR1
TMR1L = 0b11011011; // (65535 - 3035) x (1 (Fosc / 4)) x Pres
caler
// 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 C
CP1
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 CCP
1
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;
}
26 de agosto de 2013