sexta-feira, abril 15, 2011

Pequenos Imãs e Micro Controladores - Parte 5

Neste post vamos começar a ver como conectar os sensores magnéticos a um microcontrolador, no caso um PIC.


Como ambiente de teste decidi usar a centrífuga que montei para futuramente usar na confecção de placas de circuito impresso. Variando a tensão de alimentação de uma ventoinha de PC eu consigo (grosseiramente) variar a velocidade.


Para ativar os sensores eu fixei dois dos meus pequenos imãs; com auxílio de uma bússola eu garanti que polos opostos estão na parte externa.


Vamos começar com o sensor de efeito Hall que vimos no post anterior. Colocando na saída um resistor de pull-up, teremos um sinal digital que mudará cada vez que um dos dois imãs for detectado. Todo o trabalho de debounce é feito dentro do sensor.

Isto possibilita usar o recurso de interrupção na mudança de um pino de entrada, disponível no modelo do PIC escolhido (PIC16F686). Neste primeiro teste vamos simplesmente piscar um LED cada vez que um imã for detectado. O circuito é bastante simples, no diagrama abaixo incluí um conector de programação para poder alterar o software sem precisar tirar o PIC do circuito.

O software deste primeiro exemplo é bastante simples. Feita a iniciação dos periféricos, o PIC fica apenas tratando as interrupções de mudança de sinal (que acende o LED e inicia um contador) e de tempo real (que usa o contador para apagar o LED após um pequeno período de tempo).
#include <16F676.h>
#device adc=8
#use delay(clock=4000000)
#fuses NOWDT, NOCPD, NOPROTECT
#fuses INTRC_IO, PUT, BROWNOUT, MCLR

#define SENSOR PIN_A5
#define LED PIN_A4

volatile int cntLed;

void main()
{

// Iniciações do hardware
set_tris_a (0xEF); // A4 output
#use fast_io(A)

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC);
setup_vref(FALSE);
setup_adc(ADC_OFF);

output_low (LED);

enable_interrupts(INT_RA5);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);


for (;;)
;
}

#int_ra
void Sensor_ISR ()
{
output_high (LED);
input_a();
clear_interrupt (INT_RA5);
cntLed = 600;
}

// Interrupção do timer
// Ocorre a cada 256 uSeg
#int_RTCC
void RTCC_isr()
{
if (cntLed)
{
if (--cntLed == 0)
output_low (LED);
}
}

O vídeo abaixo mostra o funcionamento deste primeiro teste.



Embora bastante simples, este teste mostra que estamos conseguindo detectar os imãs. No próximo post vamos aperfeiçoar este exemplo, incluindo um display para contar as rotações.

Nenhum comentário: