quinta-feira, 19 de janeiro de 2012

Projeto: Tacômetro de LEDs

O projeto está baseado no microcontrolador de oito bits 16F628 do fabricante Microchip®, mas poderia ter sido feito com um AVR ou qualquer processador pequeno.
O experimento consta de um tacômetro que medirá a rotação (rpm) de um ventilador comum. O resultado desta medição será apresentado através de uma linha de oito LEDs acoplada ao eixo de giro do ventilador aproveitando a rotação do próprio ventilador como varredura. Os números serão então projetados pelo acionamento sincronizado dos LEDs de maneira a produzir cada um dos caracteres numéricos de 0 a 9.

Display de movimento:
O display de movimento pode ser obtido a partir do acionamento preciso de cada pixel sincronizado com o movimento de rotação (caso do experimento em questão).
O movimento de rotação funciona como varredura e o acionamento dos LEDs como estrutura do pixel (On/Off).

Hardware

 O hardware é bem simples está baseado nos testes feitos no Kit com o modulo de LEDs e o conversor série-paralelo 74HC595. O circuito desenvolvido está no anexo 2.
O Microcontrolador utilizado foi o 16F628. O hardware apresenta ainda um cristal de 4MHz, um conversor série/paralelo e um sensor de infravermelho (foto-transistor) para monitoramento o pulso de medição do período de uma volta completa do ventilador.

Software

A metodologia utilizada para desenvolvimento do sistema foi a de máquina de estado. O diagrama de estados abaixo reproduz as condições de estados do sistema.


O sistema

 O funcionamento do sistema esta baseado nas interrupções impostas pelo sensor em RB3. A cada giro do ventilador um pulso será gerado e consequentemente uma interrupção no modulo CCP.

 O SETUP de algumas variáveis importantes do microcontrolador:

    set_tris_A(0x00);
   enable_interrupts(INT_CCP1);   // Habilitação de interrupção CCP1
   enable_interrupts(GLOBAL);     // Habilitação Flag de interrupções globais
   setup_ccp1(CCP_CAPTURE_FE);    // Interrupção CCP1 (modo captura) em bordadescida
   output_high(CLEAR);            // Limpa Latch (buffer de saida)
   output_low(CLOCK);             // Garante clock em nivel lógico zero
   output_low(LATCH);                   // LATCH inicial em zero
   flagPulso=0;                                      // Flag de registro de interrupção
   flagMontado=0;                // Flag de vetor montado
   indVet=1;                              // Indice do vetor
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);

 Habilitado flag de interrupções globais e interrupções de CCP1 (borda de descida), ainda como auxiliar na contagem será utilizado o TMR1 (sincronizado pelo clock interno do MPU) e “prescaler” divisor 8.Através do uso da variável “flagPulso” são capturadas duas medidas de TMR1 entre dois pulsos sucessivos o calculo do período de rotação do ventilador se dá através da seguinte equação
A partir da obtenção do período de rotação poderemos determinar a freqüência e sua rotação em rpm.
Depois de realizados os cálculos resta ao programa embutido exibir os resultados no display de movimento.

Exibição do vetor resultado:

Foram criados no arquivo  “numeros.h” os caracteres numéricos de 0 a 9 de maneira e serem utilizados no display. A montagem visual destes caracteres bem como o arquivo .h a ser utilizado na diretiva "#include" são mostrados na figura:
Cada caractere corresponde a uma matriz de 48bits (8 linhas x 6 colunas) e podem ser representados por uma seqüência de 6 bytes (representados na figura por seus valores hexadecimais).
O arquivo cabeçalho define cada um dos caracteres como uma constante matricial [1x6] de bytes, lembrando que cada byte pode representar 8 bits.

-numeros.h

const byte zero[6]= {
0x3C,0x42,0x81,0x81,0x42,0x3C
};

const byte um[6]= {
0x00,0x04,0x82,0xFF,0x80,0x00
};

const byte dois[6]= {
0x84,0xC2,0xA1,0x91,0x8A,0x84
};

const byte tres[6]= {
0x00,0x81,0x89,0x89,0x89,0xFF
};

const byte quatro[6]= {
0x18,0x14,0x12,0x11,0x11,0xFF
};

const byte cinco[6]= {
0x8F,0x89,0x89,0x89,0x89,0x70
};

const byte seis[6]= {
0x78,0x94,0x92,0x91,0x91,0x60
};

const byte sete[6]= {
0x01,0x01,0x01,0x01,0xFF,0x00
};

const byte oito[6]= {
0x76,0x89,0x89,0x89,0x89,0x76
};

const byte nove[6]= {
0x06,0x89,0x49,0x29,0x19,0x0E
};

const byte space= 0x00;

Agora que se têm disponíveis os caracteres para exibição no display, pode-se então através da rotação calculada, decompor o número em seus devidos caracteres de  milhar,centena,dezena e unidade.
Definidos os caracteres após decomposição monta-se um vetor-exibição que será transferido ao display através do latch 74HC595 (bit a bit) de saída série/paralelo.
Cada um dos bytes é então transferido ao latch até que se passem mais 3 interrupções quando um novo valor é inserido no vetor-exibição.

Testes:

Esquemático:



Nenhum comentário:

Postar um comentário