How to Read the Signal from a Hall Effect Sensor Using an Arduino

Como ler o sinal de um sensor de efeito Hall usando um Arduino

Adam Morissette
Adam Morissette
PA Engineer

Os sensores de efeito Hall são uma das opções de Feedback que oferecemos em nossos atuadores lineares para fornecer informações de posição e velocidade. Nossos PA-04-HS e PA-100 têm sensores de efeito Hall nas unidades padrão. Já vários de nossos outros atuadores podem ser encomendados sob medida com sensores de efeito Hall.

Explore nossa linha de microcontroladores Arduino para o máximo controle de atuadores!

O QUE É UM SENSOR DE EFEITO HALL?

Um sensor de efeito Hall é um componente eletrônico que gera uma tensão com base na intensidade do campo magnético que passa por ele. Quando esse sensor é combinado com um circuito de detecção de limiar de tensão, pode-se produzir um sinal com dois estados. Em nossos atuadores, o sensor de efeito Hall é projetado para gerar um sinal de dois canais, com as formas de onda quantificadas em um de dois estados binários: ligado ou desligado. Esses dois sinais sobem e descem à medida que o motor elétrico gira, com uma diferença de fase de 90° entre eles, como mostrado abaixo. A frequência desses pulsos em relação à mudança de posição no atuador depende de sua resolução geral e varia entre nossos diferentes atuadores.

Sensores de efeito Hall 

COMO ESSES SINAIS DE EFEITO HALL SÃO LIDOS?

Como usar um sensor de efeito Hall

Ao ler um sinal digital em um microcontrolador, há dois métodos principais: polling e interrupções. Polling é um método programado em que um microcontrolador verifica periodicamente o estado de uma entrada para ver se houve alguma mudança. Já as interrupções são um mecanismo de hardware que muda imediatamente o foco do programa do microcontrolador quando o sinal muda em uma entrada. Cada um desses métodos tem prós e contras, e cada um tem aplicações para as quais é mais adequado. No nosso caso, queremos saber o momento exato em que um sinal muda de estado, portanto usaremos interrupções. Para usar um sensor de efeito Hall com microcontroladores Arduino, utiliza-se uma interrupção. Criando uma ISR (Interrupt Service Routine), é possível fazer com que o Arduino execute imediatamente uma seção de código quando uma mudança definida for detectada em uma entrada específica. A seguir está um exemplo de uma ISR para um Arduino; uma versão modificada que direciona os sinais detectados para LEDs é uma forma de testar um sensor de efeito Hall.

Programando um Arduino para ler sensores de efeito Hall - método por interrupção

// global volatile variables are needed to pass data between the

// main program and the ISR's

volatile byte signalA;
volatile byte signalB;

// the pins that can be used with interrupts depend on the board you

// are using
const byte inputA = 2;
const byte inputB = 3;

void setup() {
  // enable internal resistors on the input pins
  pinMode(inputA, INPUT_PULLUP);
  pinMode(inputB, INPUT_PULLUP);
  // read the initial state of the inputs
  signalA = digitalRead(inputA);
  signalB = digitalRead(inputB);

  // will detect a rising or a falling edge
  attachInterrupt(digitalPinToInterrupt(inputA),signalA_ISR,CHANGE);
  attachInterrupt(digitalPinToInterrupt(inputB),signalB_ISR,CHANGE);

}

void loop() {
  // This is where the signal information can be used in a program
}

void signalA_ISR() {
  // when a change is detected it will always be

  // to the opposite of the current state

  signalA = !signalA;
}

void signalB_ISR() {
  signalB = !signalB;
}

Nosso PA-04-HS vem com Feedback de efeito Hall integrado!

O QUE PRECISA SER CONSIDERADO NA APLICAÇÃO?

Como os sinais que estamos lendo serão de alta frequência, é preciso levar em conta algumas considerações. Primeiro, quanto tempo o programa levará para executar o código na ISR? Quantos sinais separados precisam ter ISRs? Qual é a velocidade do clock do microcontrolador?

Um problema que pode ocorrer em um programa com uma ISR longa é a ISR ser acionada novamente antes de ter concluído o código da execução anterior. Recomenda-se manter o mínimo de código necessário em uma ISR para ajudar a evitar esse problema.

No código de exemplo acima, dois sinais são configurados com interrupções separadas. Ambos os sinais são necessários para detectar a direção do movimento do atuador linear; isso é feito verificando qual sinal muda de nível baixo para alto antes do outro. A desvantagem de habilitar interrupções em ambos os sinais é que haverá o dobro de código de ISR sendo executado. Em aplicações em que a direção do movimento do atuador não é necessária ou já é evidente no programa em execução, apenas um sinal precisaria ser configurado com uma rotina de serviço de interrupção.

Alguns microcontroladores permitem aumentar a velocidade do clock. A velocidade do clock altera a taxa na qual o microcontrolador pode executar o programa. Se a frequência dos sinais lidos for alta, pode ser necessário aumentar a velocidade do clock para acompanhar. No entanto, é mais eficiente em termos de energia usar a velocidade de clock mais baixa que a aplicação permitir.

O QUE ACONTECE SE O MICROCONTROLADOR NÃO FOR RÁPIDO O SUFICIENTE?

Depois de considerar os pontos acima, às vezes o microcontrolador simplesmente não é rápido o suficiente para percorrer o código principal e acompanhar as ISRs. Nesses casos, pode ser interessante usar um microcontrolador adicional. Um microcontrolador pode ser usado para executar as ISRs, ler os dados e então transmitir os dados necessários para outro microcontrolador, onde o código principal pode ser executado sem ser interrompido.