Датчики Холла


Датчик Холла — это датчик магнитного поля. Он был так назван из-за принципа своей работы — эффекта Холла: если в магнитное поле поместить пластину с протекающим через неё током, то электроны в пластине будут отклоняться в направлении, перпендикулярном направлению тока. В какую именно сторону будут отклоняться электроны, зависит от полярности магнитного поля:

  1. Электроны
  2. Пластина
  3. Магниты
  4. Магнитное поле
  5. Источник тока

Различная плотность электронов на сторонах пластины создаёт разность потенциалов, которую можно усилить и измерить, что датчики Холла и делают.

Датчики Холла (далее просто ДХ) бывают аналоговыми и цифровыми. Аналоговый преобразует индукцию магнитного поля в напряжение, знак и величина которого будут зависеть от полярности и силы поля. Цифровой же выдаёт лишь факт наличия/отсутствия поля, и обычно имеет два порога: включения — когда значение индукции выше порога, датчик выдает логическую единицу; и выключения — когда значение ниже порога, датчик выдаёт логический ноль. Наличие зоны нечувствительности между порогами называется гистерезисом и служит для исключения ложного срабатывания датчика на всяческие помехи — аналогично работает цифровая электроника с логическими уровнями напряжения. Цифровые ДХ делятся ещё на униполярные и биполярные: первые включаются магнитным полем определённой полярности и выключаются при снижении индукции поля; биполярные же включаются полем одной полярности, а выключаются полем противоположной полярности.

Аналоговый ДХ 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).

  1. Спасибо за статью. Подскажите, а эти датчики могут не только переключаться при изменении магнитного поля, но и регистрировать промежуточные значения? Т.е. например, определять расстояние до магнита.

    • Аналоговые так могут, и те, что доступны мне (SS49E), реагируют на достаточно сильный магнит начиная с расстояния в 2 см. Так что сильно точно и далеко с ними не померишь. Перечитайте статью, там на скриншоте в описании аналогового датчика прекрасно видно, что значения меняются плавно в зависимости от расстояния до магнита.
      Ну, а в цифровых датчиках промежуточные значения игнорируются умышленно, ибо сие есть суть цифровых устройств (:

    • Спасибо за быстрый ответ. В статье увидел, что меняются, но было небольшое сомнение.

  2. А что делать с датчиками Холла у которых 4 вывода?
    Такие датчики стоят под обмотками у двигателей CD-ROM.
    Там 3 датчика и как узнать, какие именно датчики там стоят, сильно ли они отличаются?

    • Как всегда — пользуясь Google и интуицией. Если датчики не имеют никакой маркировки, тогда больше интуиция поможет. Могу только посоветовать сначала снимать с них сигнал, как с аналоговых, а там уж по значениям analogRead() будет ясно, какой датчик на самом деле. Выложите фотку этих датчиков, если не трудно — хоть полюбуемся все на такое чудо (:

  3. А как будет выглядеть скетч, если после остановки, при вращении в обратную сторону обороты уменьшаются до «0» затем меняют направление и начинают отчёт оборотов в другую сторону?

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна конкурс манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение