Датчик Холла — это датчик магнитного поля. Он был так назван из-за принципа своей работы — эффекта Холла: если в магнитное поле поместить пластину с протекающим через неё током, то электроны в пластине будут отклоняться в направлении, перпендикулярном направлению тока. В какую именно сторону будут отклоняться электроны, зависит от полярности магнитного поля:
- Электроны
- Пластина
- Магниты
- Магнитное поле
- Источник тока
Различная плотность электронов на сторонах пластины создаёт разность потенциалов, которую можно усилить и измерить, что датчики Холла и делают.
Датчики Холла (далее просто ДХ) бывают аналоговыми и цифровыми. Аналоговый преобразует индукцию магнитного поля в напряжение, знак и величина которого будут зависеть от полярности и силы поля. Цифровой же выдаёт лишь факт наличия/отсутствия поля, и обычно имеет два порога: включения — когда значение индукции выше порога, датчик выдает логическую единицу; и выключения — когда значение ниже порога, датчик выдаёт логический ноль. Наличие зоны нечувствительности между порогами называется гистерезисом и служит для исключения ложного срабатывания датчика на всяческие помехи — аналогично работает цифровая электроника с логическими уровнями напряжения. Цифровые ДХ делятся ещё на униполярные и биполярные: первые включаются магнитным полем определённой полярности и выключаются при снижении индукции поля; биполярные же включаются полем одной полярности, а выключаются полем противоположной полярности.
Аналоговый ДХ SS49E
Его размер — всего 4×3 мм, и он имеет три вывода:

Как видно, питание датчику нужно биполярное — тогда на южный полюс магнита датчик будет реагировать положительным уровнем на выходе, на северный — отрицательным, а на отсутствие поля — нулевым. Однако можно обойтись однополярным питанием — в этом случае уровень на выходе (Vo) в половину напряжения питания (Vdc/2) будет означать отсутствие магнитного поля, Vo > Vdc/2 — южный полюс, Vo < Vdc/2 - северный. Характеристики при однополярном питании 5 В и температуре от -40 до 85 °C:
- Потребляемый ток: от 6 до 10 мА
- Выходной ток: от 1.0 до 1.5 мА
- Выходное напряжение: от 1.0 до 1.75 мВ/Гс, в среднем 1.4 мВ/Гс (милливольт на гаусс)
- Нулевая точка: от 2.25 до 2.75 В, в среднем 2.5 В
- Магнитный диапазон: от ±650 Гс до ±1000Гс
- Время отклика: 3 мс
Из этих данных следует, что при стандартном питании от Arduino (+5V, GND) при 25 °C датчик в отсутствие магнитного поля будет выдавать 2.5 В, а на поле силой 1000 Гс — 2.5 ± 1.4 В. Соответственно, если воспользоваться АЦП, разброс значений будет примерно в диапазоне от 280 до 800 со нулевой точкой в 512.
Приступим к экспериментам. Подключаем вывод “+” к 5V Arduino, вывод “-” к GND, оставшийся — к Analog 0:
Заливаем в Arduino следующий скетч:
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.println(analogRead(0));
delay(500);
}
Не спеша подносим магнит вплотную сначала одним полюсом, потом другим, глядя в Serial monitor:

Цифровой биполярный ДХ TLE4945L
Выглядит он точно так же, как и аналоговый, даже выводы расположены так же:

Тут можно не бояться, биполярный он только в магнитном смысле, а питание ему можно подавать вполне себе обычное, однополярное. К слову, питание этот датчик принимает в довольно широком диапазоне — от 3.8 до 24 В, а ток может отдавать до 100 мА, что позволяет непосредственно от него запитывать управляемые им устройства (например, реле). Чувствительность у него почти точь-в-точь как у аналогового SS49E: от -600 Гс до -1000 Гс (северный полюс магнита) и от 600 Гс до 1000 Гс.
Подключается он чуть посложнее, чем аналоговый: выход датчика Q нужно подтянуть к питанию резистором в 10 кОм, так как выход у него с открытым коллектором:
А вот и суперсложное подключение, где выход Q подключен к цифровому пину 2:
Зальём в Arduino ещё один крутой скетч:
void setup()
{
Serial.begin(9600);
}
void loop()
{
static uint8_t prev_state = LOW;
uint8_t state = digitalRead(2);
if (state != prev_state)
{
prev_state = state;
Serial.println(state == LOW ? "OFF" : "ON");
}
}
Теперь подносим магнит то одним полюсом, то другим и смотрим в Serial monitor:

Обратите внимание — датчик не переключается, пока не поднесёшь магнит другим полюсом, а ещё он очень чувствительный и переключается магнитом, вытащенным из дохлого CD-ROM’а, на расстоянии около 2 см!
Применение
Датчики Холла используются в качестве бесконтактных выключателей, как замена герконам, для бесконтактных замеров тока в проводниках, управления моторами, чтения магнитных кодов, измерения уровня жидкости (магнитный поплавок) и т.д.
Ну а я, имея два цифровых биполярных ДХ, сделаю бесконтактный магнитный энкодер. Принцип прост: на вращающийся диск лепим рядышком два магнита разными полюсами вверх (для униполярных ДХ хватит одного), а над ними размещаем цифровые ДХ и снимаем показания. Можно использовать скетч из статьи про энкодеры, но смотреть на стрелочки скучно, ведь хочется ещё посчитать обороты, так что напишем новый:
#include <LiquidCrystal.h>
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
/* Пины, к которым подключен энкодер */
enum { ENC_PIN1 = 2, ENC_PIN2 = 3 };
enum { FORWARD = 1, BACKWARD = -1 };
/* Если что, revolutions здесь и далее - обороты, а не революции (: */
long revolutions = 0, revolutions_at_last_display = 0;
int direction = FORWARD;
uint8_t previous_code = 0;
/* Реакция на событие поворота */
void turned(int new_direction)
{
if (new_direction != direction)
{
revolutions = 0;
revolutions_at_last_display = 0;
}
else
++revolutions;
direction = new_direction;
}
/* Объеденил чтение кода Грея с энкодера с его декодированием */
uint8_t readEncoder(uint8_t pin1, uint8_t pin2)
{
uint8_t gray_code = digitalRead(pin1) | (digitalRead(pin2) << 1), result = 0;
for (result = 0; gray_code; gray_code >>= 1)
result ^= gray_code;
return result;
}
void setup()
{
pinMode(ENC_PIN1, INPUT);
pinMode(ENC_PIN2, INPUT);
lcd.begin(8, 2);
}
void loop()
{
/* Читаем значение с энкодера */
uint8_t code = readEncoder(ENC_PIN1, ENC_PIN2);
/* Обрабатываем его */
if (code == 0)
{
if (previous_code == 3)
turned(FORWARD);
else if (previous_code == 1)
turned(BACKWARD);
}
previous_code = code;
/* Раз в секунду выводим накопленную информацию */
static unsigned long millis_at_last_display = 0;
if (millis() - millis_at_last_display >= 1000)
{
/* Выводим на экран направление вращения */
lcd.clear();
lcd.print(direction == FORWARD ? ">> " : "<< ");
/* ... скорость вращения в оборотах в секунду */
lcd.print(revolutions - revolutions_at_last_display);
lcd.print("/s");
/* ... и общее число обротов в текущем направлении */
lcd.setCursor(0, 1);
lcd.print(revolutions);
millis_at_last_display = millis();
revolutions_at_last_display = revolutions;
}
}
Выглядеть конечная установка может так:
Я разобрал старый нерабочий жёсткий диск и установил на его пластину два магнита от системы позиционирования головки CD-ROMа на расстоянии ~5 мм друг от друга, а датчики разместил на креплении над пластиной, на расстоянии ~15 мм друг от друга. Вот как оно работает:
Если не нужно знать направление вращения, а хочется просто считать обороты, то можно обойтись вообще одним униполярным датчиком и одним магнитом (:







0 комментариев на «“Датчики Холла”»
Спасибо за статью. Как раз то что нужно именно сейчас.
Спасибо за статью.
А как подсчитать кол-во оборотов в единицу времени, т.е. скорость вращения?
Так у меня же в скетче написано:
lcd.print(revolutions — revolutions_at_last_display);
Я сделал просто — каждую секунду отнимаю от текущего числа оборотов запомненное секундой ранее. Можете считать общее количество оборотов делить на время, прошедшее с последнего момента смены направления — тогда получите среднюю скорость вращения. Например, можете засекать время в фукции turned() в условии if (new_direction != direction).
Спасибо за статью. Подскажите, а эти датчики могут не только переключаться при изменении магнитного поля, но и регистрировать промежуточные значения? Т.е. например, определять расстояние до магнита.
Аналоговые так могут, и те, что доступны мне (SS49E), реагируют на достаточно сильный магнит начиная с расстояния в 2 см. Так что сильно точно и далеко с ними не померишь. Перечитайте статью, там на скриншоте в описании аналогового датчика прекрасно видно, что значения меняются плавно в зависимости от расстояния до магнита.
Ну, а в цифровых датчиках промежуточные значения игнорируются умышленно, ибо сие есть суть цифровых устройств (:
Спасибо за быстрый ответ. В статье увидел, что меняются, но было небольшое сомнение.
А что делать с датчиками Холла у которых 4 вывода?
Такие датчики стоят под обмотками у двигателей CD-ROM.
Там 3 датчика и как узнать, какие именно датчики там стоят, сильно ли они отличаются?
Как всегда — пользуясь Google и интуицией. Если датчики не имеют никакой маркировки, тогда больше интуиция поможет. Могу только посоветовать сначала снимать с них сигнал, как с аналоговых, а там уж по значениям analogRead() будет ясно, какой датчик на самом деле. Выложите фотку этих датчиков, если не трудно — хоть полюбуемся все на такое чудо (:
К сожалению уже 3 прошло, но если кто нибудь тут есть, скажите как можно реализовать счетчик оборотов на SS49E
А как будет выглядеть скетч, если после остановки, при вращении в обратную сторону обороты уменьшаются до «0» затем меняют направление и начинают отчёт оборотов в другую сторону?
Cпасибо! Просто и со вкусом. А можно ли так же считывать показания двух датчиков для контроля вращения двух объектов?