Тахометр на датчике холла своими руками

Опубликовано: 05.07.2024

Основой настоящей лабораторной работы является датчик Холла. Датчик Холла – это полупроводниковый прибор, работающий на основе одноименного эффекта. Датчик подключается к внешнему источнику питания. При внесении датчика в магнитное поле на его выходе формируется логический сигнал низкого уровня. В отсутствие магнитного поля на выходе датчика наблюдается высокий уровень сигнала.

Простейшая схема подключения датчика представлена на следующем рисунке. Она включает цифровой датчик A3144. Постоянный резистор и может содержать или не содержать конденсатор постоянной емкости. Резистор, номиналом 10 ком служит для надежной работы датчика в качестве ключевого элемента. Конденсатор фильтрует высокочастотные пульсации выходного сигнала. Если смотреть на переднюю сторону датчика (маркировка), то левый первый контакт соединяется с источником питания. Средний – с общим проводом, землей, правый – является выходным.


Используется готовый модуль датчика Холла А3144. Он имеет как цифровой выход D0, так и аналоговый A0, который не используется.

Схема подключения модуля датчика Холла к Ардуино UNO представлена на рис. 2. Датчик Холла подключается напрямую к плате ардуино своими тремя контактами D0, VCC и GND. VCC и GND соединяются с соответствующими контактами Ардуино. Цифровой выход D0 следует присоединить к одному из цифровых входов Ардуино, связанных с аппаратными прерываниями. Для ардуино Уно это D2 или D3. В нашей работе мы используем цифровой вход D3.


Кроме датчика Холла лабораторная установка включает цифровой жидкокристаллический дисплей LCD1602. Но может использоваться и любой другой. От формата дисплея будет зависеть код управляющей программы микроконтроллера и доступный объем выводимой информации.

Цифровой дисплей можно подключать к ардуино через имеющийся параллельный интерфейс, как у моего дисплея LCD2004, либо через последовательный интерфейс шины I2C, которым может быть дополнительно снабжен дисплей, как вы видите на моем дисплее LCD1602.

Я выбрал последний вариант, так как он позволяет сократить число задействованных выходных линий Ардуино.

Для обмена данными по шине I2C линии последовательного интерфейса дисплея присоединяют к следующим выходам Ардуино: линию SDA к выходу А4, линию SCL к выходу А5, линии питания VCC и земли GND – к соответствующим линиям Ардуино.

Кроме того для регистрации сигнала и вывода индикации лабораторная установка содержит два светодиода, подключенных через резисторы сопротивлением 220 Ом к цифровым выходам D10 и D13.

Собираем лабораторную установку в соответствии со схемой.

Познакомимся с основными принципами измерения частоты цифровым способом.

Всего существует два принципа. Оба они основаны на сравнении периодов образцового и измерительного сигналов.

Первый способ иллюстрирует следующая схема.


Импульс входного сигнала (передним или задним фронтом), поступающий от датчика Холла, запускает аппаратное прерывание Ардуино. При срабатывании функции прерывания запускается подсчет количества импульсов n встроенного тактового генератора, период следования которых T0 заранее известен, и продолжается до следующего срабатывания прерывания.

Таким образом сумма длительностей импульсов тактового генератора будет соответствовать времени Т между двумя срабатываниями аппаратного прерывания.

Частота определяется как величина обратная периоду:

А частота вращения, выраженная в об/мин будет в 60 раз больше:

Для получения длительности импульсов образцового сигнала встроенного генератора пользователю Ардуино доступна функция Micros (). Она показывает текущее значение времени в микросекундах с начала запуска программы. Таким образом, обращаясь к ней в моменты срабатывания функции прерывания, можно получить количество микросекунд между двумя срабатываниями. Так как длительность одного образцового импульса T0 равна 1 мкс=1/1000000 с, тогда формула приобретает вид:

Если на валу вращающегося двигателя установлен не один магнит, а несколько (z), то время T между ближайшими срабатываниями функции прерывания сокращается в z раз, а частота входного сигнала возрастает в z раз, тогда формула примет вид:


Второй способ отличается от первого тем, что ведется прямой подсчет числа импульсов k, поступивших от датчика Холла за большой период времени Tm. Этот способ поясняется вторым рисунком. Согласно этому способу частота вращения вала будет равна:

А в минуту – в 60 раз больше:

Если принять Tm=1 c., то формула приобретает вид:

Для управления работой Ардуино необходимо разработать управляющую программу.

Для начала подключаем необходимые библиотеки:

Объявляем переменные и константы:

volatile boolean kontrol;

Объявляем функцию прерывания, которая при срабатывании будет подсчитывать количество импульсов входного сигнала

Объявляем функцию сохранения значения частоты вращения при каждом новом цикле измерения и ее обнуления для последующего счета импульсов

rpm = rpm_k; rpm_k = 0; записываем подсчитанное число импульсов с датчика Холла в переменную частоты вращения, а счетчик обнуляем

delayMicroseconds(500); digitalWrite(10, LOW);

Объявляем основную процедуру Ардуино

Объявляем основной цикл программы

Разработанную программу загружаем в память Ардуино. Подключив Ардуино к шине USB ПК, не забываем выбрать правильный порт в меню Системы программирования Ардуино, а также правильно указываем модель платы Ардуино.

Понадобилось на работе контролировать обороты двигателя. Решили использовать датчик Холла. На муфту установленную на валу двигателя приклеили пару неодимовых магнитов. Для датчика Холла сделали схему на компараторе, чтобы фиксировать моменты прохождения магнита напротив датчика. Схема приведена на рис.1


Рис. 1 Принципиальная схема тахометра

Описание работы

Датчик Холла AHSS49 на каждый проход магнита, закрепленного на валу двигателя формирует импульс амплитудой около 1 вольта, со смещением относительно земляной шины на +2,5 В.

Полученный сигнал поступает на вход компаратора IC1 LM311, который формирует управляющие импульсы для выходной опто-развязки OC1 PC817, выход которой присоединяется ко входу контроллера, подтянутому через сопротивление 1-2 кОм к питанию контроллера. В промышленных контроллерах, такие резисторы предустановлены и требуется только конфигурирование входных цепей. Порог срабатывания компаратора IC1 настроен на напряжение 2,6 В. Настраивая компаратор на более высокое напряжение можно получить более узкие импульсы на выходе - это связано с тем, что импульсы на выходе датчика Холла имеют форму близкую к треугольной.

Конденсаторы С1, С2 предназначены для снижения импульсных помех и исключения ложных срабатываний компаратора.

Схема была смакетирована на самодельной монтажной плате см. рис.2 Для публикации была подготовлена разводка печатной платы см. Приложения к статье.

Макет схемы усиления сигнала датчика Холла

Рис.2 Макет схемы усиления сигнала датчика Холла

Установка датчика около муфты вала двигателя см.рис.3 Датчик Холла был установлен таким образом, чтоб при прохождении магнитов установленных на муфте они оказывались на расстоянии пимерно 5 мм напротив датчика Холла. При установке на валу двух магнитов результирующая частота на выходе платы удваивается. При установке 4 магнитов возрастает в 4 раза. Большее число магнитов устанавливается для подсчета частоты вращения низко-оборотных двигателей. Соответственно, при измерении частоты вращения двигателя результат делится на число магнитов установленных на валу двигателя.

Установка датчика на кронштейне вблизи муфты на валу двигателя

Рис.3 Установка датчика на кронштейне вблизи муфты на валу двигателя

Выход тахометра может быть организован несколькими способами в зависимости от решаемых задач

Схема приведенная на рис. 1 при работе с промышленными контроллерами может не дать устойчивого срабатывания на каждый импульс поскольку 2 p-n перехода опто-развязки PC817 при полном открытии будут давать падение напряжения около 1 В. И , в этом случае, дискретные входы пром.контроллера выполненные на КМОП микросхемах будут срабатывать неустойчиво, в этом случае имеет смысл реализовать схему выхода на полевом N-канальном транзисторе. Вариант схемы с выходом на полевом N-канальном транзисторе приведен на рис.4 . Для управления полевым транзистором пришлось задействовать дополнительный вход контроллера (клемма Х1). В случае если входов контроллера для этого не хватает, можно использовать дополнительный источник питания + 5В, подключив его к клемме Х1. Рабочий вход (клемма Х2) замыкается полевым транзистором и сформированные импульсы поступают на вход контроллера Х2.

Вариант схемы с выходом на полевом N-канальном транзисторе с дополнительной гальванической развязкой

Рис.4 Вариант схемы с выходом на полевом N-канальном транзисторе с дополнительной гальванической развязкой

Если дополнительная гальваническая развязка выхода не нужна, можно использовать схему рис.5

Вариант схемы с выходом на полевом N-канальном транзисторе без дополнительной опторазвязки

Рис.5 Вариант схемы с выходом на полевом N-канальном транзисторе без дополнительной опторазвязки

Тахометр на Ардуино

Тахометр на Ардуино

П ривет. В этой статье расскажу, как я сделал цифровой тахометр на Ардуино (Arduino) и датчике Холла для китайского шпинделя 0,5кВт диаметром 52 мм.

Комплектующие для сборки тахометра

Итак, тебе понадобятся:

И установи библиотеку tm1637 в свою Arduino IDE. Как это сделать? Просто добавь папку из архива в папку куда установлена Arduino. Например С > Program Files (x86) > Arduino > Libraries

Библиотека TM1637 скачать

Схема подключения тахометра на Ардуино

Тахометр на Ардуино схема подключения

Тахометр на Ардуино схема подключения

Скетч для тахометра на Ардуино

Сборка тахометра

Итак, начнем по порядку:

Индикатор

Индикатор тахометра TM1637

Индикатор тахометра TM1637

Плата датчика Холла

Для аккуратного крепления датчика Холла на шпиндель пришлось сделать новую печатную плату. Кому интересно как я делаю печатные платы читай в этой статье. После изготовления платы, я перенес все детали с KY-003, а так же добавил разъем XH2.54 3 pin. И еще вырезал изоляционную прокладку из какого-то пластика толщиной 3 мм и просверлил в ней небольшие отверстия, чтобы плата ложилась на прокладку всей плоскостью.

Плата тахометра вид сверху

Плата тахометра вид снизу

Прокладка

Печатная плата тахометра на Ардуино

Установка платы датчика Холла

Установка платы на шпиндель

Установка платы на шпиндель

Как протянуть провода от датчика, я расскажу в статье посвященной прокладке кабелей, а пока небольшое видео о работе тахометра на Arduino Nano и индикаторе TM1637

Если дома есть Arduino, в гараже машина или мотоцикл, а то и хоть мотособака, в голове туманные представления о программировании — возникает желание измерить скорость движения или обороты двигателя, посчитать пробег и моточасы.

В данной статье я хочу поделиться своим опытом по изготовлению подобных поделок.

Картинка для привлечения внимания

Немного физики

Для измерения частоты вращения нам понадобится датчик положения колеса/вала/круга/итп. Датчик ставится как правило один. Возможно, что он будет срабатывать не один раз на каждый оборот. Например, у вас датчик Холла и 4 магнита на колесе. Таким образом, для правильного вычисления частоты нужно знать:

  • количество срабатываний датчика на один оборот К;
  • минимальная ожидаемая частота Мин.
  • максимальная ожидаемая частота Макс.

То есть, если частота меньше разумного минимума, то считаем, что она равна нулю, если больше максимума — игнорируем показания.

С количеством срабатываний понятно, но зачем ещё эти мины и максы? Давайте рассмотрим сначала варианты расчёта частоты.

Со скоростью всё проще, достаточно знать число π, диаметр колеса, а частоту вращения мы уже знаем.

Болванка для кода

Так как мы имеем дело с такими нежными величинами как время и пространство, то лучше сразу освоить прерывания.

Обратите внимание на модификатор volatile у переменной counter. Все переменные, которые будут изменяться в обработчике прерывания (ISR) должны быть volatile. Это слово говорит компилятору, что переменная может изменяться неожиданно и доступ к ней нельзя оптимизировать.

Функция ISR() вызывается каждый раз, когда появляется единица на ноге fqPin. Мы эту функцию не вызываем, это делает сам контроллер. Он это делает, даже когда основная программа стоит в ступоре на функции delay(). Считайте, что ISR() обслуживает событие, от вас не зависящее и данное вам свыше как setup() и loop(). Контроллер прерывает выполнение вашей программы, выполняет ISR() и возвращается обратно в ту же точку, где прерывал.

Обратите внимание, что в функции loop() мы отключаем прерывания вообще любые для того, чтобы прочитать переменную counter и сохранить её во временную переменную cnt. Потом, конечно же, включаем снова. Так мы можем потерять один вызов, конечно же, но с другой стороны, переменная unsigned long имеет 32 бита, а процессор ATMega32 8-битный, вряд ли он скопирует данные за один такт, а ведь в процессе копирования может случиться прерывание и часть данных изменится. По этой же причине мы копируем значение counter локально так как значение этой переменной при использовании в разных местах программы может быть разным опять же из-за изменения её в прерывании.

Тело функции ISR() должно быть максимально коротким, точнее, сама функция должна выполняться максимально быстро. Это важно, так как прерывается выполнение вашего кода, который может оказаться чувствительным к непредвиденным задержкам. Некоторые библиотеки отключают прерывания для выполнения чувствительных с задержкам операций, например для управления светодиодной лентой WS2812.

Считаем обороты за единицу времени.

Первое, что приходит в голову, это взять интервал времени и посчитать количество измерений.

Как и у многих простых решений, у этого есть неочевидные минусы. Для повышения точности измерений вам необходим довольно большой интервал времени. Принцип тот же, что и у Шума квантования. При времени оборота колеса сравнимом с временем подсчёта, существенные изменения скорости вращения не будут замечены. Показания такого частотомера будут различаться до двух раз на каждый отсчёт.

Для повышени точности на малой скорости можно увеличить число К, как это сделано, скажем, в автомобильной технике для датчика ABS. Можно увеличить время подсчёта. Делая и то и другое мы подходим ко второй проблеме — переполнению счётчика. Да, переполнение легко лечится увеличением количества бит, но арифметика процессора Arduino не умеет считать 64-битные числа столь быстро, как хотелось бы и как она это делает с 16-разрядными.

Увеличение времени расчёта тоже не очень хорошо тк нам надо знать частоту прямо сейчас, вот при нажатии на газ, а не через пару секунд. Да и через пару секунд мы получим скорее некое среднее значение. За это время можно несколько раз сделать врумм-врумм.

Есть другой метод. Он лишён вышеописанных недостатков, но, как водится, имеет свои.

Считаем интервал между отсчётами

Мы можем засечь время одного отсчёта и другого, вычислить разницу. Величина, обратная вычисленному интервалу и есть частота. Круто! Но есть минусы.

Что делать, если наше колесо крутится еле-еле и измеренный интервал превышает разумные пределы? Выше я предложил считать частоты ниже разумного минимума за ноль.

Определённым недостатком метода можно считать шумы квантования на высоких частотах, когда целочисленный интервал снижается до нескольких двоичных разрядов.

Так же хотелось бы некую статистику подсчётов для улучшения показаний, а мы берём лишь последнее значение.

Методом проб и ошибок я подобрал интервал отображения данных на дисплее в 250мс как оптимальный. Если чаще, то цифры размазываются, если реже — бесит тормознутость.

Комбинированный метод

Можно попробовать объединить достоинства обоих методов.

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

Обратите внимание, что за интервал считается не время опроса, как в первом примере, а время от последнего отсчёта до предыдущего последнего отсчёта в прошлом опросе. Это заметно поднимает точность вычисления.

Таким образом, мы можем получать вполне достоверные данные как на низких так и на высоких частотах.

Если использовать кооперативную многозадачнось, то можно сделать подсчёт, скажем раз 100мс, а вывод на дисплей раз в 250мс. Очень короткий интервал опроса снизит чувствительность к низким частотам.

Как говорят в рекламе, "но это ещё не всё".

Ошибки дребезга

Для устрашения вас предположу, что измеряем частоту вращения двигателя от индуктивного датчика зажигания. То есть, грубо говоря, на высоковольтный провод намотан кусок кабеля и мы измеряем индукцию в нём. Это довольно распространённый метод, не правда ли? Что же здесь сложного может быть? Самая главная проблема — современные системы зажигания, они дают не один импульс, а сразу пачку.




Но даже обычная система зажигания даёт переходные процессы:




Старинные же кулачковые контактные вообще показывают замечательные картинки.

Как с этим бороться? Частота вращения не может вырасти мгновенно, не даст инерция. Кроме того, в начале статьи я предложил ограничить частоту сверху разумными рамками. Отсчёты, что происходят слишком часто можно просто игнорировать.

Другой вид помех — это пропадание отсчётов. Из-за той же инерции у вас не может измениться частота в два раза за одну миллисекунду. Понятно, что это зависит от того, что вы собственно измеряете. Частота биения крыльев комара может, вероятно и за миллисекунду упасть до нуля.

Статистическая обработка в данном случае становится уже достаточно сложной для маленькой функции обработки прерывания и я готов обсудить варианты в комментариях.

Особенности измерения скорости движения и скорости вращения.

При измерении скорости вращения бензинового двигателя надо обязательно учесть величину К, которая совсем не очевидна. Например, вы намотали провод на кабель свечи и ожидаете, что там будет одна искра на один оборот. Это совсем не так. Во-первых, у 4-тактного двигателя вспышка происходит один раз на два оборота, у 2-тактного один раз на оборот коленвала. Во-вторых, для упрощения системы зажигания коммутатор подаёт искру на неработающие в данный момент цилиндры, типа на выпуске. Для получения правильного К надо почитать документацию на двигатель или подсмотреть показания эталонного тахометра.

При измерении скорости движения частота обновления дисплея не имеет большого значения, особенно, если вы рисуете цифры, а не двигаете стрелку. Даже обновление информации раз в секунду не вызовет отторжения. С оборотами двигателя всё наоборот, индикатор должен откликаться гораздо быстрее на изменение оборотов.

Вывод информации

Типичная обида начинающего разработчика автомобильной и мотоциклетной электроники "стрелки дёргаются, цифры нечитабельны" лечится простым способом — надо обманывать клиента. Вы что думаете, автомобильный тахометр всегда показывает вам правду? Конечно же нет! Хотя вам этот обман нравится и вы хотите, чтобы ваш прибор дурил голову так же.

Стрелки

Если включить зажигание на новом модном автомобиле или мотоцикле, стрелки приборов сделают красивый вжух до максимума и медленнее опадут до нуля. Вот! Вот это нам и надо сделать. Надо, чтобы при показе максимальной величины стрелка не метнулась к ней мгновенно и не упала как акции лохотрона в ноль.

Итак, нам надо учитывать максимальную скорость стрелки на увеличение и максимальную на уменьшение показаний. Совсем хорошо сделать эти скорости нелинейными, чтобы стрелка сначала двигалась быстрее, а потом чуть помедленнее приближалась к заданному значению.

Вот пример с нелинейным выводом показаний:

Вы можете поиграть с коэффициентами. Этот же принцип используется при выводе громкости сигнала, например, у любого аналогового индикатора: стрелки, полоски, яркость, цвет, размер итп. Приведённый пример самый простой, но и не самый красивый. Предлагайте ваши варианты в комментариях.

Цифры

С цифрами всё намного сложнее. Быстрые изменения показаний приводят к тому, что несколько порядков сливаются в мутное пятно. Для скорости, как и писал выше, можно задать интервал раз в секунду и глаз успеет прочитать три цифры.

В мототехнике не зря делают аналоговые индикаторы оборотов, точные цифры не нужны, важна относительная близость к оборотам максимального крутящего момента, к максимальным вообще и холостые.

Я предлагаю менять частоту вывода информации на дисплей в зависимости от степени изменения величины. Если обороты меняются, скажем, на 5% от последнего подсчёта, а не показа — можно затупить и показывать раз в 300-500мс. Если на 20%, то показывать раз в 100мс.

Можно огрубить шкалу и показывать только две значащие цифры

С учётом мототематики, можно довольно точно показывать обороты холостого хода как описано чуть выше и огрублять вывод на оборотах от двух холостых. На высоких оборотах для гонщиков важнее делать блинкеры типа "передачу вниз", "передачу вверх" и "ты спалишь движок". То есть держать двигатель около максимального крутящего момента и не дать ему крутиться выше максимальных разрешённых оборотов. Блинкеры замечательно делаются с помощью SmartDelay когда можно унаследовать от этого класса свой с заданной ногой контроллера и частотой мигания, там есть методы для переопределения и они вызываются раз в заданное время.

Держим старые цены на MEAN WELL весь июль!

Лазерный тахометр – прибор предназначенный для оперативного измерения частоты вращения (оборотов в единицу времени) различных вращающихся деталей и механизмов. Принцип работы такого тахометра основан на измерении частоты вращения с помощь лазерного луча, отраженного от контрастной маркерной ленты, наклеенной на движущийся предмет или вал. Стоимость подобных промышленных приборов достаточно высока даже для бюджетных вариантов. В статье мы рассмотрим вариант подобного прибора на Arduino, который не уступает по точности бюджетным промышленным приборам (Рисунок 1).

Бесконтактный лазерный тахометр на Arduino.
Рисунок 1. Бесконтактный лазерный тахометр на Arduino.

Для сборки тахометра понадобиться: плата Arduino Nano, модуль лазерного излучателя, модуль лазерного приемника (модуль лазерного датчика), модуль OLED дисплея 128×32 с интерфейсом I 2 C, тактовая кнопка, разъем для подключения 9-вольтового элемента питания типа «Крона».

Схема подключения модулей к плате Arduino изображена на Рисунке 2. Процессы сборки, подключения компонентов к плате Arduino, а также компоновки в корпусе, демонстрируются в видеоролике в конце статьи.

Схема лазерного тахометра на Arduino
Рисунок 2. Схема лазерного тахометра на Arduino (подключение модулей к плате
Arduino Nano).

Примененный модуль лазерного излучателя (модуль лазерного диода) имеет номинальное напряжение питания 5 В; генерируемое излучение в диапазоне 650 нм мощностью 5 мВт (Рисунок 3). Потребляемый лазером ток составляет не более 40 мА, поэтому допустимо его подключение к выходу 5 V платы Arduino (выход встроенного в плату Arduino регулятора напряжения 5 В).

Модуль лазерного излучателя.
Рисунок 3. Модуль лазерного излучателя.

Модуль лазерного сенсора использует приемник немодулированного лазерного излучения, поэтому при измерениях рекомендуется избегать засветки сенсора ярким солнечным светом или другими источниками света (Рисунок 4). При попадании лазерного излучения на датчик (в нашем случае – отраженный лазерный луч) на его выходе «Out» появляется высокий уровень, в отсутствии засветки датчика на выходе фиксируется низкий логический уровень. Номинальное напряжение питания модуля лазерного приемника составляет 5 В. Также на плате модуля лазерного приемника установлен светодиод, индицирующий подачу питания.

Модуль лазерного датчика.
Рисунок 4. Модуль лазерного датчика.

Примененный модуль OLED дисплея с разрешением 128×32 точки (на контроллере SSD1306) подключается к плате Arduino по интерфейсу I 2 C. Напряжение питания модуля дисплея равно 5 В (Рисунок 5).

Модуль OLED дисплея с интерфейсом I2C и разрешением 128×32 точки
Рисунок 5. Модуль OLED дисплея с интерфейсом I 2 C и разрешением
128×32 точки для лазерного тахометра.

Скетч Arduino доступен для скачивания в разделе загрузок. В скетче, помимо стандартных библиотек Arduino, используются библиотеки Adafruit_GFX.h и Adafruit_SSD1306.h для работы с OLED дисплеем. Если эти библиотеки не установлены в среде Arduino, их необходимо установить с помощью менеджера библиотек.

Для прибора разработан корпус, проектные файлы для печати корпуса на 3D принтере доступны для скачивания в разделе загрузок. При сборке прибора автор в корпусе совместил модуль лазерного излучателя и приемника.

Видео сборки прибора и демонстрация работы

Как вы можете заметить в видеоролике, начиная с 4:40 самодельный лазерный тахометр показывает примерно те же значения, что и промышленный прибор, но с боле высокой частотой обновления значений на дисплее. Автор проекта в комментариях к видеоролику утверждает, что прибор позволяет измерять скорость до 99,999 об/мин.

Читайте также: