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

Приборы и принадлежности

  • Плата ардуино UNO или любая другая.
  • Модуль датчика Холла или отдельный датчик Холла установленный на специальную плату.
  • Два резистора сопротивлением 200-250 Ом.
  • Два светодиода.
  • Цифровой ЖК дисплей, снабженный интерфейсом шины I2C.
  • Плата для макетирования и провода типа «вилка – вилка» и «вилка-розетка».
  • Персональный компьютер с установленной средой программирования Arduino.
  • Кабель USB.

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

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

Рис. 1

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

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

Рис. 2

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

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

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

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

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

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

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

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

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

Рис. 3

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

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

T = k*T0

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

f=1/T

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

n=60/T=60/(k*T0).

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

n=60*1000000/(k).

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

n=60*1000000/(k*z).

Рис. 4

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

f=k/Tm;

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

f=60*k/Tm.

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

f=60*k.

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

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

#include <TimerOne.h>   —  библиотека таймера

#include <LiquidCrystal_I2C.h>  — библиотека работы с дисплеем по шине i2c

LiquidCrystal_I2C lcd(0x27,16,2);  — указываем i2c адрес (наиболее распространенное значение), а также параметры экрана

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

const int RPM_PIN=3; — константа определяющая номер цифрового входа для подключения датчика Холла

volatile int rpm                = 0;   — частота импульсов (сразу обнуляем)

volatile int rpm_k            = 0;   — счетчик импульсов входного сигнала (обнуляем)

volatile boolean kontrol;

volatile int rpm_array[3] = {0,0,0};    — массив промежуточных значений частоты вращения (не менее трёх значений) для усреднения (сразу обнуляем)

volatile int rpm_result         = 0;    — расчётная частота вращения вала (обнуляем)

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

 void rpm_count(){

  rpm_k++;       —

  digitalWrite(13, HIGH); — на долю секунды выводим сигнал на красный сетодиод при каждом поступившем импульсе входного сигнала (для контроля работы схемы и датчика)

  delayMicroseconds(500);  — длительность свечения красного светодиода

  digitalWrite(13, LOW);  — выключение красного светодиода

}

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

void SensorData(){

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

  digitalWrite(10, HIGH); — на долю секунды выводим сигнал на зеленый сетодиод при каждом отсчете образцового сигнала (для контроля работы)

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

}

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

void setup(){

   lcd.begin();    — инициализируем дисплей

   pinMode(RPM_PIN,INPUT);    — устанавливаем режим работы входной линии ардуино на ввод

   attachInterrupt(digitalPinToInterrupt(RPM_PIN),  rpm_count,  RISING);  — настраиваем функцию прерывания, срабатывание по переднему фронту

   Timer1.attachInterrupt(SensorData);  — настраиваем срабатывание прерывания по таймеру

   Timer1.initialize(1000000);  — указываем период работы таймера – 1 с.

   pinMode(10, OUTPUT); — устанавливаем режим работы цифрового выхода 10 и 13 на вывод

   pinMode(13, OUTPUT);

}

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

void loop(){

    rpm_result = 0;    — обнуляем итоговый результат

    for (int i=0; i<=1; i++)    { — цикл буферизации предыдущих значений измеренного сигнала в массив

      rpm_array[i]=rpm_array[i+1];     }   

    rpm_array[2] = 60*rpm/2;   — вычисляем текущее значение частоты вращения вала и записываем в последний элемент массива

    for (int i=0; i<=2; i++)    {       — вычисляем сумму элементов массива для усреднения

      rpm_result = rpm_result+rpm_array[i];     }

    rpm_result = rpm_result/3;    — вычисляем среднее значение частоты вращения

    lcd.setCursor(0, 0);     — указываем положение курсора на экране дисплея

    lcd.print(»                «);   — очищаем 1 строку дисплея от предыдущего результата

    lcd.setCursor(0, 0);  — указываем положение курсора на экране дисплея

    lcd.print(«N(ob/min): «);lcd.print(rpm_result);   — выводим частоту вращения в об/мин

    delay(500); — делаем паузу между обновлениями экрана, чтобы он не мигал

}

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

Материалы для скачивания:

Закладка Постоянная ссылка.

4 комментария

  1. Геннадий

    А как скетч скопировать с вашего сайта? делаю анемометр , хотел попробовать ваш тахометр для измерения скорости ветра.

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

  2. А почему нигде нет упоминания про подачу питания на датчик? 3 пин для получения сигнала. А Запитать датчик?

    • Питание на Датчик поступает от выхода +5В платы Ардуино. Аналогичным образом провод «Земля» подключается к соответствующему выходу GND Ардуино.

Добавить комментарий для Админ Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *