Ультразвуковой контроль уровня воды на микроконтроллере 8051

Индикатор уровня воды в баке на микроконтроллере PIC16F628A

Ультразвуковой контроль уровня воды на микроконтроллере 8051

Индикатор(датчик) уровня воды на микроконтроллере PIC16F628А – устройство, которое позволит визуально контролировать уровень воды в непрозрачной ёмкости. Предлагаемое устройство может пригодиться всем, у кого есть загородный дом с летним душем или дача, огород, да что угодно лишь была бы емкость с водой. После некоторых модернизаций из индикатора получилось реле уровня воды.

Сам индикатор состоит из двух основных частей:

  1. Датчики уровня воды;
  2. Электроника, которая обрабатывает информацию, полученную от датчиков.

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

О схеме

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

Принципиальная схема индикатора уровня воды (рисунок 1) проста, как пять копеек. FM приемник на RDA5807 – проще не бывает!

Рисунок 1 – Принципиальная схема индикатора уровня воды на микроконтроллере PIC16F628A

Рассмотрим основные узлы. Сердцем устройства является микроконтроллер PIC16F628A фирмы Microchip. Для стабильного питания которого, применяется выпрямитель на диодном мосте, конденсаторах и интегральном стабилизаторе L7805.

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

Датчики подключаются к схеме через барьерные резисторы.

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

Таблица 1 – Перечень компонентов для индикатора уровня воды на микроконтроллере PIC16F628А

Позиционное обозначение Наименование Аналог/замена
С1, С3 Конденсатор керамический – 15пФх50В
С2 Конденсатор электролитический – 470мкФх25В
С4 Конденсатор керамический – 0,1мкФмкФх50В
С5 Конденсатор электролитический – 1000мкФх10В
DA1 Интегральный стабилизатор L7805 L78L05
DD1 Микроконтроллер PIC16F628A PIC16F648A, PIC16F84
HL1-HL4 Светодиод 3мм
R1-R5, R11 Резистор 0,125Вт 5,1 Ом SMD типоразмер 0805
R6-R9 Резистор 0,125Вт 510 кОм SMD типоразмер 0805
R10 Резистор 0,125Вт 1 кОм SMD типоразмер 0805
R12-R15 Резистор 0,125Вт 180 Ом SMD типоразмер 0805
VD1 Диодный мост 1А х 1000В 2W10
XP1-XP4 Штекер платный
XT1-XT2 Клеммник на 2 контакта.
XT3 Клеммник на 3 контакта.
ZQ1 Кварц 4МГц типаразмер HC49

О датчиках

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

Рисунок 2 – Тяжелое основание для пластиковой трубы с датчиками.

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

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

Если для емкости был предусмотрен перелив, то последний хомут должен быть установлен на уровне перелива.

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

Как работает

Работает такая конструкция очень просто. На самом низу трубы (или на основании) крепится общий провод для работы с датчиками. Относительно этого провода будут происходить все измерения. Вода, наполняя емкость, постепенно начнет замыкать общий провод с датчиками. Первый на очереди – датчик 1.

Когда общий провод с ним замкнется тогда включиться первый светодиод. Далее к первому датчику добавится второй датчик, при этом включится второй светодиод, а первый выключиться и т.д. Когда произойдет замыкание с четвертым датчиком – включиться четвертый светодиод.

Который, в свою очередь, будет мерцать с частотой 2 Гц.

Подобный алгоритм работы можно легко организовать на обычной логике. Так поначалу и делалось, однако, из-за частых ошибочных состояний, было принято решение заменить схему на современное микроконтроллерное устройство. Рабочая программа для PIC-микроконтроллера была написана на языке ассемблер и отлажена в программе MPLab 8.8

Моделирование

Работа устройства моделировалась в программе протеус см. рисунок 3. Модель сделана для микроконтроллера PIC16F84A! Внимательно выбираем прошивку.

Рисунок 3 – Модель уровня воды на микроконтроллере.

О печатной плате

Печатная плата получилась размерами 55х50мм (рисунки 4-5 !!! не в масштабе).

Рисунок 4 – Печатная плата индикатора уровня воды в баке на микроконтроллере PIC16F628A (низ) не в масштабе.

Рисунок 5 – Печатная плата индикатора уровня воды в баке на микроконтроллере PIC16F628A (верх) не в масштабе.

Внешний вид индикатора показан на рисунке 6.

Рисунок 6 – Готовая плата индикатора уровня воды.

Корпус

Схему готового индикатора разместил в корпусе небольшого приемника рисунки 7-8.

Рисунок 6 – Готовая плата индикатора уровня воды на микроконтроллере PIC16F628A в корпусе приемника.

Рисунок 7 – Кнопка включения питания.

Отверстия для динамика заклеил клеем, а на лицевую сторону приклеил глянцевую фотография рисунки 8-9

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

Рисунок 8 – Заклееные отверстия.

Рисунок 9 – Лицевая панель индикатора уровня воды на микроконтроллере PIC16F628A.

Видео работы устройства.

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

Добавлена поддержка микроконтроллеров PIC16F84, PIC16F648A. Печатная плата получилась 55х50 мм. Емкость, в которой будут размещены датчики, не нужно портить лишними отверстиями.

Исправных компонентов и добра всем!!! Спасибо за внимание.

Файлы к статье:

Индикатор уровня воды в баке на микроконтроллере PIC16F628A(статья в pdf)

Архив с проектом

Фотографии

Источник: https://pichobby.lg.ua/shemu/raznoe/item/16-bak.html

Контроль уровня жидкости ультразвуковым дальномером

Измерительная техника

Главная  Радиолюбителю  Измерительная техника

Дешёвые ультразвуковые дальномеры (HC-SR04 и им подобные) можно использовать для измерения уровня жидкостей в сосудах. Зачастую это получается проще и надёжнее, чем использование поплавковых, резистивных, ёмкостных и других традиционных датчиков уровня.

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

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

Многие уровнемеры сигнализируют лишь о достижении жидкостью нескольких фиксированных уровней.

Я разработал блок измерения и поддержания уровня жидкости в баке на базе ультразвукового измерителя дальности HC-SR04, принцип работы которого подробно изложен в [1]. Этот блок применён на дачном участке для поддержания уровня воды в баке умывальника и бочке для полива растений.

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

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

Рис. 1. Схема блока

Схема блока изображена на рис. 1.

В каждом рабочем цикле, повторяющемся каждую секунду, микроконтроллер DD1 трижды запускает измеритель дальности B1, генерируя импульсы Trig длительностью 15 мкс, и получает импульсы Echo с задержкой, пропорциональной длительности распространения ультразвукового импульса от передатчика до поверхности жидкости в баке и обратно к приёмнику. Программа измеряет задержку с помощью таймера TMR1, настроенного так, что по окончании счёта число в его регистрах TMR1H и TMR1L равно длительности задержки отражённого импульса в микросекундах. Зная его, можно определить заполненность бака Q в процентах по формуле

где NTMR1 – результат счёта (число в регистрахTMR1H и TMR1L); Ht – глубина бака(расстояние от места установки измерителя до дна), мм; k -коэффициент, пропорциональный скорости звука в воздухе, при скорости 331,8 м/с он равен 16,59. Но контрольные измерения показали, что более точные результаты получаются при k=17.

Программа рассчитывает коэффициент заполнения бака после каждого из трёх измерений, выполняемых с интервалами 200 мс. Их результаты она присваивает переменным Q1, Q2 и Q3.

Затем проводит их мажоритарный отбор для выявления ошибочного результата.

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

Полученное в каждом цикле значение Q при работе в автоматическом режиме сравнивается с нижним порогом Qmin (при Q

Блок питается постоянным напряжением 12 В и потребляет ток не более 95 мА. Микроконтроллер DD1 управляет ЖКИ HG1 (одна строка из 16 символов) через сдвиговый регистр DD2. Это дало возможность занять управлением ЖКИ минимальное число выводов микроконтроллера.

Читайте также:  Первые цифровые оптические ультрафиолетовые датчики от silicon labs

Программа написана на языке ассемблера и отлажена в среде MPLABX4.15. В ней использованы вычисления с плавающей запятой (формат чисел с плавающей запятой – один байт порядок и два байта мантисса). Нажатия на кнопки SB1 и SB2 обрабатываются по прерываниям.

Поскольку в знакогенераторе ЖКИ PC1601BC нет символов кириллицы, сообщения выводятся на английском языке. Общение с оператором происходит через систему меню ME_0- ME_5. Их перебирают нажатиями на

кнопку SB1, выбирая нужное меню нажатием на кнопку SB2, при этом на экране ЖКИ появляется курсор. Выходят из меню МЕ_0 и МЕ_1 нажатием на кнопку SB2, из МЕ_2-МЕ_4 – одновременным нажатием на кнопки SB1 и SB2. Из МЕ_5 программа выходит автоматически по окончании записи в EEPROM.

В меню МЕ_2-МЕ_4 значение параметра увеличивается при нажатии на кнопку SB1 (с ускорением после восьмого шага), а при нажатии на кнопку SB2 оно уменьшается (также с ускорением после восьмого шага).

Меню имеют следующие функции и вид:

МЕ_0 – ручное управление насосом. На экран ЖКИ выводится сообщение “Pump OFF Qw=XX%” (насос выключен) или “Pump ON Qw=XX%” (насос включён), где XX – измеренный коэффициент заполнения бака. Каждое нажатие на кнопку SB1 включает или выключает насос.

МЕ_1 – автоматическое управление насосом. На экран выводится сообщение “AutoQwYQw=XX%”. Буква “Y” означает, что насос включён. В противном случае она отсутствует.

МЕ_2 – установка порога включения насоса. На экран ЖКИ выводится сообщение “Set min Qw=XX%”, где XX – значение коэффициента заполнения при уровне жидкости, меньше которого насос будет включён.

МЕ_3 – установка порога выключения насоса. На экран выводится сообщение “Set max Qw=XX%” , где XX – значение коэффициента заполнения при уровне жидкости, больше которого насос будет выключен.

МЕ_4 – установка глубины бака. На экран выводится сообщение “Set Ht = ZZZmm “, где ZZZ – глубина бака, мм.

МЕ_5 – запись параметров в EEPROM микроконтроллера. На экран ЖКИ выводится сообщение “EEPROM Set OFF”. По окончании записи вместо OFF будет выведено YYY

Блок смонтирован на печатной плате из фольгированного с одной стороны стеклотекстолита, чертёж которой показан на рис. 2. Её помещают в пластмассовый корпус подходящего размера с вырезанным в нём окном для экрана индикатора HG1.

На одной из стенок корпуса размещают кнопки SB1 и SB2. Излучатель и приёмник ультразвука модуля HC-SR04 должны выступать из корпуса.

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

Рис. 2. Чертёж печатной платы блока

Реле K1 – 4117-C-Z с обмоткой на 12 В. Предельный коммутируемый его контактами ток – 10 А, максимальное коммутируемое переменное напряжение – 380 В. У меня такое реле управляет электродвигателем насоса мощностью 1,5 кВт. При необходимости это реле можно заменить на 51.9.012.0000, но печатную плату под него придётся корректировать.

Резистор R1 и конденсатор C2 – для поверхностного монтажа типоразмеров соответственно 1206 и 0805. Оксидный конденсатор C1 – К50-6, К50-35 или импортный.

Транзистор КТ315Г можно заменить другим структуры n-p-n с допустимым током коллектора не менее 0,15 А и коэффициентом передачи тока базы больше 40.

Диод Шотки SS14 можно заменить любым, в том числе обычным кремниевым диодом с допустимым прямым током больше рабочего тока обмотки применённого реле и обратным напряжением не менее 15…20 В.

Так как АЦП микроконтроллера программа не использует, микроконтроллер PIC16F676-I/P можно заменить на PIC16F630-I/P, но потребуется небольшая корректировка программы. Сдвиговый регистр 74HC164N можно заменить на К561ИР2.

ЖКИ PC1601BC при необходимости может быть без изменения схемы подключения заменён одним из более распространённых символьных ЖКИ, имеющих две строки по 16 символов. Это позволит выводить на его экран более информативные сообщения. При наличии в знакогенераторе ЖКИ русских букв англоязычные сообщения можно заменить русскоязычными.

Запас программной памяти для подобных усовершенствований в применённом микроконтроллере есть (используется 77 %).

Перед началом использования блока нужно установить в меню ME_2-ME_4 значения верхнего порога, нижнего порога и глубины бака. Затем записать их в EEPROM, выбрав меню ME_5.

Программа микроконтроллера имеется здесь.

Литература

1. Нечаев И. Ультразвуковой дальномер HC-SR04 без микроконтроллера. Часть 1. Сигнализаторы присутствия. – Радио, 2018, № 4, с. 59-62.

2. Кухлинг Х. Справочник по физике. – М.: МИР, 1983.

Источник: http://www.radioradar.net/radiofan/measuring_technics/liquid_level_contro_ultrasonic_range_finder.html

Ультразвуковые датчики жидкости и воды

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

Модели приборов и аналоги

Хорошо адаптирована к жидкостным приложениям серия датчиков Pepperl+Fuchs F65. Модели данной серии работают в диапазонах до 2500 мм и оснащаются тремя типами выходов – аналоговым, дискретным или частотным.

Запитываются от источника постоянного напряжения 12…30 В. Транзисторные выходы нагружаются на ток до 300 мА, защищены от КЗ и перегрузки по напряжению. Корпус – PBT.

Такой ультразвуковой датчик жидкости оптимален по цене и функционалу.

Области применения

Ультразвуковые датчики уровня жидкости и воды широко используются в разных сферах:

  • Нефтяная и нефтегазовая отрасли (топливные и нефтяные продукты)
  • Химпродукты, фармацевтическая продукция
  • ЖКХ и водоочистка, сельское хозяйство
  • Агропромышленный комплекс
  • Пищевая промышленность
  • Заправочные станции
  • Жидкости разного уровня токсичности, вязкости, агрессивности, горючие жидкости, вода

Назначение

Ультразвуковые датчики уровня воды и иных жидкостей используются для задач, связанных с контролем уровня. Основные приложения:

  • Непрерывное отслеживание количественного значения воды и иных жидкостей в промышленных и естественных емкостях/резервуарах
  • Регулирование и сигнализация
  • Контроль качества очистки, учет продукции в АПК, с/х, на предприятиях сферы питания, учет продуктов топлива, АЗС

Преимущества

Главные достоинства:

  • Широкая применяемость и универсальность
  • Независимость измерений от свойств жидкостей
  • Компактность и неприхотливость датчиков
  • Экономичность

Недостатки

Основные ограничения:

  • Узкая специализация (ограничения на работу с сыпучими и твердыми материалами)
  • Некоторое влияние возмущающих факторов внешней среды

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

Принцип работы прибора

На примере датчика из серии Pepperl+Fuchs F65 принцип работы описывается таким образом:

Излучатель (сенсор) устанавливается над поверхностью жидкости наверху резервуара. Излученные импульсы отражаются от границ между воздушной средой и жидкостью и возвращаются к сенсору. По измеренным данным сигнала (времени распространения) рассчитывается расстояние до продукта и его уровень. 2 типа выходов устанавливаются в соответствующее настройке положение.

Источник: https://RusAutomation.ru/datchiki_urovnya/ultrazvukovie-datchiki-zhidkosti

Датчик уровня воды

   Для изготовления датчика, или индикатора уровня воды в баке, цистерне, бассейне и другой ёмкости, можно применить микросхему 4093 (отечественная 561ТЛ1) либо на микроконтроллере Ардуино. Начнём с первого варианта.

Схема датчика уровня на CD4093

Необходимые для датчика материалы

  • 2 микросхемы 4093;
  • 2 панельки для микросхем;
  • 7 по 500 ом резисторы;
  • 7 по 2,2 Мом резисторы;
  • батарея 9 В;
  • гнездо для батареи;
  • плата для схемы 10 х 5 см;
  • 8 латунных винтов для датчиков;
  • двухсторонний скотч или шурупы для крепления коробки к стене;
  • сетевой кабель. Длина кабеля зависит от расстояния от резервуара для воды до места, где будет расположен дисплей.

   Итак, основа – это CI4093, что имеет четыре элемента. В этом проекте использовано две микросхемы. Тут мы имеем порты с одним входом на высоком уровне, а другие подключенные через резистор, обеспечивая высокий логический уровень. При помещении в эту логику нулевого входного сигнала, выход инвертора будет на высоком уровне и включает светодиод. Всего использовано семь из восьми элементов, из-за ограничений в кабельной сети.

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

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

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

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

Читайте также:  Компания nxp выпустила новые высокоэффективные унч

   В собранном виде схема находится в коробке и установлена на стене.

Второй вариант схемы датчика уровня

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

Уровень воды и другие важные данные отображаются на ЖК-дисплее 16х2 точек. В авторском варианте схема контролирует уровень воды в дренажном баке (резервуаре). Если уровень бака низкий, электродвигатель насоса не включится, что обеспечивает защиту двигателя от холостого хода.

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

   Схема уровня воды с помощью контроллера Arduino показано выше. Датчик в сборе состоит из четырех алюминиевых проволок длинной в 1/4, 1/2, 3/4 и полный уровень в баке. Сухие концы этих проводов подключены к аналоговым входам A1, A2, A3 и A4 Arduino соответственно. Пятый провод размещен в нижней части бака. Резисторы R6 – R9 уменьшают потенциал входов.

Сухой конец провода подключен к +5V DC. Когда вода касается конкретного зонда, происходит электрическое соединение между зондом и +5V, потому что вода обладает некоторой электропроводностью. В результате ток течет через зонд и этот ток преобразуется в пропорциональное ему напряжение.

Arduino читает падении напряжения по каждому из входных резистор для зондирования уровня воды в баке. Транзистор Q1 включает зуммер, резистор R5 ограничивает ток базы Q1. Транзистор Q2 управляет реле. Резистор R3 ограничивает ток базы Q2. Переменник R2 используется для регулировки контрастности ЖК-дисплея. резистор R1 ограничивает ток через его LED подсветку.

Резистор R4 ограничивает ток через светодиодный индикатор питания. Полную программу для контроллера на Arduino можно загрузить тут.

   Схемы автоматики

Источник: http://elwo.ru/publ/skhemy_avtomatiki/datchik_urovnja_vody/28-1-0-738

AVR: подключаем ультразвуковой дальномер HC-SR04 к atmega8

Характеристики ультразвукового дальномера HC-SR04

  • Измеряемый диапазон: 2 см — 500 см
  • Точность: 0,3 см
  • Угол обзора: < 15 °
  • Напряжение питания 5V

Принцип работы ультразвукового дальномера HC-SR04

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

Модуль датчика расстояния HC-SR04 имеет 4 вывода:

  • VCC:  питание 5 вольт
  • Trig:  вход триггера, запускающего измерения
  • Echo:  выход, на котором генерируется импульс, длительность которого пропорциональна расстоянию
  • GND:  земля

В документации на модуль датчика расстояния HC-SR04 указано, что для запуска измерений на вход Trig надо подать импульс  длительностью 10-15 микросекунд.  После чего на выходе Echo появится импульс  длительностью 150мкс — 25мс.

  Длительность этого импульса пропорциональна расстоянию до объекта, от которого отразился ультразвуковой сигнал.

Для того что бы из длительности сигнала в микросекундах получить расстояние  в сантиметрах используется формула:

D = T/58

где: T — длительности сигнала в микросекундах

D — расстояние  в сантиметрах

Если же отраженный сигнал не дошёл до приёмника, то на выходе Echo будет импульс длительностью 38 попугаев миллисекунд,

Пример использования ультразвукового дальномера HC-SR04 с микроконтроллером AVR atmega

Описание программы для avr atmega: программа запускает измерения, генерируя импульс 10 мкс. на выходе PD3, соединённого с входом Trig.  Выход Echo подключён к PD2, который используется как внешнее прерывание. По переднему фронту на PD2 сбрасываем в ноль таймер счетчик timer1.

По заднему фронту на PD2 запоминается значение таймера счетчика timer1. Далее, полученная длина импульса переводится в сантиметры и выводится в uart. Через 1 секунду цикл измерений повторяется. Так как timer1 настроен так, что длительность тика равна 8.

68 мкс ( 1/(7372800/64) ), то используется пересчитанный коэффициент для перевода в сантиметры 58/8.68 = 6.68, округляем до 7;

Далее приведён исходный текст только основных функций для avr atmega, целиком исходники проекта avr-gcc (WinAvr) можно скачать тут.

#include
#include <util/delay.h>
#include <avr/interrupt.h>
#include “uart.h”
#include “ext_int.h”
#include “timer1.h”
 
//порт для генерирования сигнала TRIG
#define HC_SR04_TRIG_PORT PORTD
#define HC_SR04_TRIG_DDR DDRD
#define HC_SR04_TRIG_BIT _BV(3)
 
//порт для измерения длительности импульса
#define HC_SR04_ETHO_PIN PIND
#define HC_SR04_ECHO_BIT _BV(2)
 
//состояние измерения
#define HC_SR04_START 0 //запуск
#define HC_SR04_MEAS 1 //в процессе
#define HC_SR04_END 2 //окончено
volatile unsigned char hc_sr04_status;
 
//измеренная длительность импульса
volatile unsigned short hc_sr04_cnt;
 
//функция обработчик внешнего прерывания INT0
void hc_sr04_int_handler( void )
{ //проверяем уровень сигнала PD2( ECHO ) if( HC_SR04_ETHO_PIN & HC_SR04_ECHO_BIT ) { //передний фронт – сбрасываем в 0 таймер timer1_clr(); hc_sr04_status = HC_SR04_MEAS; } else { //задний фронт – запоминаем значение таймера hc_sr04_cnt = timer1_cnt(); hc_sr04_status = HC_SR04_END; }
}
 
void hc_sr04_init( void )
{ //устанавливаем функцию для обработки внешнего прерывания INT0 int0_set_handler( hc_sr04_int_handler );
  //разрешаем внешнее прерывание INT0 int0_enable();
  //настраиваем внешнее прерывание INT0 на срабатывание любому изменению int0_set_source( INT0_ANY_CHANGE );
  //настраиваем timer1д timer1_init();
  //настраиваем PD3(TRIG) на выход HC_SR04_TRIG_PORT |= ~HC_SR04_TRIG_BIT; HC_SR04_TRIG_DDR |= HC_SR04_TRIG_BIT;
}
 
//измерение дальности, возвращает значение в см
unsigned short hc_sr04_meas( void )
{ //состояние – начало измерений hc_sr04_status = HC_SR04_START;
  //генерируем импульс 10 мкс на входе trig HC_SR04_TRIG_PORT |= HC_SR04_TRIG_BIT; _delay_us( 10 ); HC_SR04_TRIG_PORT &= ~HC_SR04_TRIG_BIT;
  //ждем окончания измерения while( hc_sr04_status != HC_SR04_END );
  // 58/8.68 = 6.68 ~ 7 //переводим в сантиметры return hc_sr04_cnt/7;
}
 
FILE uart_stream = FDEV_SETUP_STREAM( uart_putc, NULL, _FDEV_SETUP_WRITE );
 
int main( )
{ unsigned short sm; //настройка uart uart_init(); //инициализация датчика hc_sr04_init();
  stdout = &uart_stream;
  sei();
  while( 1 ) { //измерение sm = hc_sr04_meas(); printf( “sm = %u
“, sm ); //задержка 1 сек _delay_ms( 1000 ); } return 0;
}

#include #include <util/delay.h> #include <avr/interrupt.h> #include “uart.h” #include “ext_int.h” #include “timer1.

h” //порт для генерирования сигнала TRIG #define HC_SR04_TRIG_PORT PORTD #define HC_SR04_TRIG_DDR DDRD #define HC_SR04_TRIG_BIT _BV(3) //порт для измерения длительности импульса #define HC_SR04_ETHO_PIN PIND #define HC_SR04_ECHO_BIT _BV(2) //состояние измерения #define HC_SR04_START 0 //запуск #define HC_SR04_MEAS 1 //в процессе #define HC_SR04_END 2 //окончено volatile unsigned char hc_sr04_status; //измеренная длительность импульса volatile unsigned short hc_sr04_cnt; //функция обработчик внешнего прерывания INT0 void hc_sr04_int_handler( void ) { //проверяем уровень сигнала PD2( ECHO ) if( HC_SR04_ETHO_PIN & HC_SR04_ECHO_BIT ) { //передний фронт – сбрасываем в 0 таймер timer1_clr(); hc_sr04_status = HC_SR04_MEAS; } else { //задний фронт – запоминаем значение таймера hc_sr04_cnt = timer1_cnt(); hc_sr04_status = HC_SR04_END; } } void hc_sr04_init( void ) { //устанавливаем функцию для обработки внешнего прерывания INT0 int0_set_handler( hc_sr04_int_handler ); //разрешаем внешнее прерывание INT0 int0_enable(); //настраиваем внешнее прерывание INT0 на срабатывание любому изменению int0_set_source( INT0_ANY_CHANGE ); //настраиваем timer1д timer1_init(); //настраиваем PD3(TRIG) на выход HC_SR04_TRIG_PORT |= ~HC_SR04_TRIG_BIT; HC_SR04_TRIG_DDR |= HC_SR04_TRIG_BIT; } //измерение дальности, возвращает значение в см unsigned short hc_sr04_meas( void ) { //состояние – начало измерений hc_sr04_status = HC_SR04_START; //генерируем импульс 10 мкс на входе trig HC_SR04_TRIG_PORT |= HC_SR04_TRIG_BIT; _delay_us( 10 ); HC_SR04_TRIG_PORT &= ~HC_SR04_TRIG_BIT; //ждем окончания измерения while( hc_sr04_status != HC_SR04_END ); // 58/8.68 = 6.68 ~ 7 //переводим в сантиметры return hc_sr04_cnt/7; } FILE uart_stream = FDEV_SETUP_STREAM( uart_putc, NULL, _FDEV_SETUP_WRITE ); int main( ) { unsigned short sm; //настройка uart uart_init(); //инициализация датчика hc_sr04_init(); stdout = &uart_stream; sei(); while( 1 ) { //измерение sm = hc_sr04_meas(); printf( “sm = %u
“, sm ); //задержка 1 сек _delay_ms( 1000 ); } return 0; }

Запись опубликована в рубрике Микроконтроллеры avr с метками atmega, avr. Добавьте в закладки постоянную ссылку.

Источник: http://mainloop.ru/avr-atmega/avr-ultrasonic-sensor-hc-sr04.html

Ультразвуковой дальномер HC-SR04

 По случаю приобрел себе ультразвуковой дальномер HC-SR04.

Девайс представляет из себя модуль с двумя пъезоизлучателями, один из которых служит излучателем, а второй – приемником ультразвуковой волны; плюс управляющая электроника для управления излучателем и приемником.

Для подключения модуль имеет 4-х контактный разъем: два из которых питание (требуется 5 вольт), и еще два для общения с микроконтроллером.

  Интерфейс связи тут организован очень просто: на вход подаем короткий умпульс  длительностью 10-15 микросекунд и ждем импульса на выходе.

Как только до приемника дойдет отраженная волна, модуль сам рассчитает расстояние и выдаст на ногу Echo импульс высокого уровня длинной до 25 мс.

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

Технические характеристики: 

  • Напряжение питания: 5V  
  • Ток покоя: < 2 мА 
  • Эффективный угол обзора: < 15 ° 
  • Диапазон расстояний: 2 см – 500 см 
  • Разрешение: 0,3 см

 Характеристики потырены с документации на модуль. Кроме этого производитель приводит формулу, по которой рассчитывать расстояние в зависимости от длительности импульса. 

Читайте также:  Автомат освещения

  S=F/58 ; где S – дистанция в сантиметрах, F – длина импульса в микросекундах

 Как видно, даже знать скорость звука не обязательно.

 Для испытаний собрал вот такую схему:

  Модуль соединяется к микроконтроллеру напрямую. Резисторы подтяжки ставить не нужно, они уже есть на плате модуля.

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

Тоесть придется на лету менять конфигурацию этого прерывания. Плюс к этому нужно задействовать один из таймеров, который должен измерять длину импульса. Слишком  сложно для маленькой операции фиксирования сигнала.. В Bascom-AVR на этот случай есть специальная команда Pulsein.

Вот пример того, как поймать сигнал с помощью этой команды: 

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

 Эта команда не использует прерываний и хардверного таймера, но способна определить появление импульса и зафиксировать его длину с разрешением 10 мкс.

Команда использует для хранения длины импульса 2-х байтный тип переменной, поэтому максимальная длина принятого сигнала может быть 655,35 мс.

Этого вполне хватает для поставленной задачи, но по необходимости можно отредактировать файл библиотеки mcs.lib и изменить максимальную длительность фиксируемого импульса. 
 

  Полный листинг программы представлен ниже

$regfile = “m8def.dat”

$crystal = 8000000

'конфигурация подключения дисплея к портам МК

Config Lcd = 16 * 2

Config Lcdpin=Pin,Rs=Portc.5,E=Portc.4,Db4=Portc.3,Db5=Portc.2,Db6=Portc.1,Db7=Portc.0

Config Portd.4 = Output          'выход для подключения ноги Trigger

Trigger Alias Portd.4

Trigger = 0

Config Portd.5 = Input           'вход для импульса Echo

Config Portd.7 = Output          'конфигурация для подключения светодиода

Led Alias Portd.7

Led = 0

Dim A As Word                    'сюда копируется значение длины сигнала

Dim S As Single                  'переменная для хранения расстояния

Const K = 0.1725                 'коэффициент для перевода длины импульса в расстояние

Waitms 50

Cursor Off

Cls

Lcd “Sonar HC-SR04”

Locate 2 , 1

Lcd “AVRproject.ru”

Led = 1

Waitms 100

Led = 0

Wait 3

Do

Trigger = 1                      'даем импульс на ногу Portd.4 длительностью 15 мкс

Waitus 15

Trigger = 0

Waitus 10

Pulsein A , Pind , 5 , 1         'ловим импульс высокого уровня на PinD.5

S = A * K                        'переводим значения

Cls

Lcd Fusing(s , “###.#”)          'выводим данные на LCD, расстояние в сантиметрах

If S 

Источник: http://AVRproject.ru/publ/kak_podkljuchit/ultrasonic_sonar_hc_sr04/2-1-0-51

Ультразвуковой датчик уровня УДМ-110

Датчик предназначен для бесконтактного измерения расстояния до объектов в диапазоне от 20см до 10м. Для определения расстояния датчик постоянно излучает ультразвуковые сигналы. Встречая препятствие, сигнал отражается и возвращается на сенсор датчика. По разнице времени с момента отправки сигнала до его возвращения вычисляется расстояние.

Область применения:

  • Измерение уровня воды в открытых водоемах и накопительных резервуарах.
  • Измерение уровня технических жидкостей и сыпучих материалов в емкостях.
  • Измерение расстояния до объектов различной формы и управление оборудованием в зависимости от их приближения или удаления.

Технические характеристики

Параметр Значение
Диапазон измерений 0,2 …

10,68м

Зона нечувствительности 0,2м
Разрешение датчика 1см
Частота ультразвукового сенсора 42кГц
Угол работы излучателя 80°
Питание DC 5В / DC 12В (определяется при заказе)
Мощность потребления менее 4Вт
Степень защиты IP65
Тип крепления DIN рейка
Габаритные размеры без крепления 115x95x65
Габаритные размеры с креплением 160x105x65
Температура эксплуатации -40 .. +70
Выходной сигнал (определяется при заказе) RS-232 / RS-485 / 4..20мА / 0..5В / 2 релейных выхода

Работа уровнемера

Форма зоны обнаружения объектов и основные принципы работы ультразвукового датчика УДМ-110 приведены на следующем рисунке:

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

Фиксируется только объект, сигнал от которого отражается под прямым углом. Причем совершенно не важно, под каким углом этот объект расположен к самому датчику. Главное что бы отраженный сигнал был направлен обратно в рупор датчика.

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

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

Диаметр цели Максимальная дальность обнаружения
1 см 1,5 м
3 см 2,4 м
10 см 3,5 м
20 см 7 м
30 см 10,5 м

Данные из таблицы справедливы для всех объектов, если выполняются следующие условия:

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

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

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

Датчик не может измерить расстояние меньше 20 см. Если поднести предмет к датчику на расстояние 0..19см, датчик все равно будет выдавать значение 20см.

Если датчик не видит отраженный ультразвук в своей рабочей зоне, он будет выдавать значение 10,68м.

О том, как выводятся показания в зависимости от модификации датчика описано ниже.

Уровнемеры с цифровым выходом RS-232 и RS-485

Модификации датчика уровня УДМ-110 с выходом RS-232 или RS-485 обеспечивают вывод информации по последовательному интерфейсу по запросу пользователя.

Параметры последовательного интерфейса: скорость 9600, 8 бит данных, 1 стоп-бит, без контроля четности

Пример запроса: [0121]F2, где

  • фигурные скобки являются признаком начала и конца пакета;
  • 01 – адрес датчика в сети RS485;
  • 21 – команда чтения расстояния;
  • F2 – контрольная сумма.

Пример ответа: [0110000202F3]30, где

  • фигурные скобки являются признаком начала и конца пакета;
  • 01 – адрес датчика в сети RS485;
  • 10 – команда чтения расстояния из запроса;
  • 00 – признак удачного измерения расстояния (в случае неудачи вернет FF);
  • 02 – количество байт данных;
  • 02F3 – расстояние в сантиметрах (в данном случае 755см = 7.55м);
  • 30 – контрольная сумма.

Пример команды смены адреса RS485: [01A002]7D, где

  • фигурные скобки являются признаком начала и конца пакета;
  • 01 – адрес датчика в сети RS485;
  • A0 – команда смены адреса;
  • 02 – новый адрес;
  • 03 – контрольная сумма.

Тестовая команда: [FF]F3 – вернет идентификатор и адрес устройства на шине

Уровнемеры с аналоговым выходом 4..20мА и 0..5В

Уровнемеры с аналоговыми выходами тока и напряжения работают по классической схеме. Нижний предел аналогового выхода соответствует 20 см. Верхний предел соответствует 10,68 м.

Уровнемеры с релейными выходами

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

Удаленный контроль показаний датчиков

Для дистанционного контроля показаний может быть использован JAVA терминал ZR301R. Терминал совмещает в себе контроллер и GSM / GPRS / 3G модем. Наше программное обеспечение, запущенное в терминале, обеспечивает опрос датчика и передачу показаний на WEB сервер через мобильный интернет. В качестве WEB сервера может использоваться наш сайт или сайт вашего предприятия.

Так же с помощью терминала можно организовать:

  1. СМС оповещение
  2. Автоматическое управление оборудованием по показанием датчика
  3. Дистанционное управление через сайт

Источник: http://kseon.info/datchiki_udm110.html

Ссылка на основную публикацию
Adblock
detector