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
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 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 SETUP de algumas variáveis importantes do microcontrolador:
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);
Depois de realizados os cálculos resta ao programa embutido exibir os resultados no display de movimento.
Exibição do vetor resultado:
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