Счетчик импульсов своими руками на ардуино

Обновлено: 05.07.2024

Мне нужна функция, которая возвращает количество импульсов в течение заданного времени, на arduino.This является частью кода, который я использую, но функция не перенастраивает ничего (не возвращается даже 0)

Я действительно не понимаю, почему функция не возвращает "я". Я был бы счастлив, если бы кто-то мог помочь. Спасибо

edit: Сигнал на PSPin представляет собой квадратный сигнал 150 Гц, что означает, что период составляет около 6 мс, и поскольку мое время составляет 25 мс, оно должно возвращать не менее 3 импульсов. Я вызывал эту функцию только для целей тестирования, так как я также думаю, что мой программа застревает в функции Counter(), но я не могу понять, почему.

Но оба контакта никогда не возвращаются HIGH. Я действительно ценю твою помощь.

Тахометр представляет собой счетчик числа оборотов в минуту (RPM counter). Существует два типа тахометров: механические и цифровые.

Внешний вид тахометра на Arduino

Общие принципы работы проектируемого тахометра

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

После этих 5 секунд плата Arduino рассчитывает число оборотов в минуту по следующей формуле:

RPM= Count x 12 для одиночного вращающегося объекта.

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

RPM=count x 12 / objects
где
objects – число лопастей в вентиляторе.

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

Структурная схема работы тахометра

Необходимые компоненты

  1. Плата Arduino Pro Mini (купить на AliExpress).
  2. Модуль инфракрасного датчика (купить на AliExpress).
  3. ЖК дисплей 16х2 (купить на AliExpress).
  4. Кнопка.
  5. Макетная плата.
  6. Батарейка на 9 В.
  7. Соединительные провода

Работа схемы

Схема тахометра на основе платы Arduino представлена на следующем рисунке.

Схема содержит плату Arduino Pro Mini, модуль инфракрасного датчика и ЖК дисплей. Плата Arduino управляет всем процессом функционирования устройства: считывание импульса с выхода модуля инфракрасного датчика, вычисление частоты вращения (в оборотах в минуту) и передача значения этой частоты на ЖК дисплей. Инфракрасный датчик используется для обнаружения объекта. Мы можем регулировать чувствительность данного датчика с помощью встроенного в него потенциометра. Модуль инфракрасного датчика состоит из инфракрасного передатчика и фотодиода, который обнаруживает инфракрасные лучи. Инфракрасный передатчик излучает инфракрасные лучи, когда эти лучи падают на поверхность, они отражаются от нее и улавливаются фотодиодом (более подробно об этих процессах можно прочитать в статье про робота, движущегося вдоль линии). Выход фотодиода подключен к компаратору, который сравнивает значение с выхода фотодиода с опорным напряжением и результат сравнения выдает на плату Arduino.

Выход модуля инфракрасного датчика напрямую подключен ко контакту 18 (A4) Arduino. Vcc и GND подсоединены к контактам Vcc и GND arduino. ЖК дсиплей подключен к плате Arduino в 4-битном режиме. Его управляющие контакты RS, RW и En напрямую подсоединены к контактам 2, GND и 3 Arduino. Контакты данных D4-D7 подключены к контактам 4, 5, 6 и 7 Arduino. В схеме также присутствует кнопка, которую необходимо нажать для подсчета числа оборотов. Наш тахометр на основе платы Arduino подсчитывает число оборотов в течение 5 секунд а потом по вышеприведенной формуле осуществляет пересчет этого значения в число оборотов в минуту. Кнопка подключена к контакту 10 Arduino.

Исходный код программы

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

Автоматическая передача данных счетчика — удобная опция, однако, рещения от производителей стоят слишком дорого. Срок окупаемости бесконечный. 🙂 Однако, если собрать систему для автоматической передачи данных по водопотреблению вместе с ребенком, то это уже довольно интересное совместное времяпрепровождение. 🙂

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

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

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

Снятие данных с импульсного выхода водосчетчика


Подключение геркона
импульсного выхода водосчетчика

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

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

Код Arduino для подсчета расхода воды:

Код был оттестирован на счетчике расхода воды Valtec VLF-U-I. Схема импульсного выхода водосчетчика:


Схема импульсного выхода водосчетчика
Valtec VLF-U-I

  • PIN 2 Arduino подключен к 1 выходу водосчетчика.
  • GND Arduino подключен к 4 выходу водосчетчика.
  • В случае с герконом контакты 1 и 4 можно менять местами. 🙂

Другой вариант реализации кода — с использованием прерываний.

Если сравнивать два варианта кода, то с прерываниями выглядит более технологичным, но и более капризным. Для варианта с прерыванием я рекомендую использовать аппаратное подавление дребезга RC цепочкой или триггером Шмитта (Шмидта).

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

Литература

Информации по разработке счетчиков воды в Интернет множество. Вот некоторые из статей:

В статье ATmega. Формирование ШИМ сигнала реализовывал сигнал ШИМ 25 кГц. Осциллографом не обладаю, но проверить результат хочется. Делаем счетчик импульсов, проверяем работу.

Задача

На базе ATmega 328P реализовать счетчик импульсов для проверки ШИМ 25 кГц, точность измерений до импульса не нужна, но порядок нужно знать.

Решение

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

Для считывания импульсов воспользуемся внешними прерываниями, они описаны на страницах 87-96 документации от производителя. В Atmega 328P есть два входа, которыми мы можем отслеживать внешние прерывания INT0(PD2) и INT1(PD3), для решения задачи воспользуемся INT0.

Настройка внешних прерываний

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

Для определения по каким событиям будет вызываться обработчик прерывания нужно настроить регистр ERICA. Биты ISC00 и ISC01 отвечают за INT0, а ISC10 и ISC11 за INT1. Настройка отслеживаемых событий идентична, за разницей в битах:

00 — Низкий уровень сигнала;
01 — Любое логическое изменение сигнала;
10 — Нисходящий фронт сигнала;
11 — Восходящий фронт сигнала.

Для непосредственного включения входов прерываний служит регистр EIMSK, биты INT0 и INT1 отвечают за одноименные выходы. По вышеизложенному пишем код

Обработка внешних прерываний

Прерывания настроил, теперь надо их обработать. Для этого существует функция обработки прерывания ISR(), которой необходимо указать тип прерывания, в моем случае INT0_vect. В функции будем делать инкремент переменной Tic_Count:

Вывод результата

Для облегчения вывода результата, дабы не прикручивать дисплей воспользовался не чистой ATmega 328P, а Arduino UNO и Arduino NANO, на борту которых тот же МК.

Как писал выше точность измерений не столь важна, потому таймеров настраивать не буду, а просто в основном цикле один раз в секунду выведу накопленное значение переменной Tic_Count и обнулю ее. На время этих действий прекращаю обработку прерываний.

Ниже полный код решения задачи с комментариями:

Теперь остается подключить сигнал ШИМ к ножке PD2, и открыть монитор последовательного порта. Так же можно сформировать и проверить сигнал на одном МК.

ATmega. Счетчик импульсов ШИМ


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

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