Ультразвуковой дальномер HC-SR04 [Амперка / Вики]

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

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

Подключение УЗ дальномера

Модуль подключается четырьмя проводами. Контакты VCC и GND служат для подключения питания, а Trig и Echo— для отправки и приема сигналов дальномера. Подключим их к пинам 10 и 11 соответственно.

Напряжение питания дальномера 5 В. Модуль работает и с платами, напряжение которых 3,3 В — в этом случае подключайте его к пинам группы с P8 по P13. Установите джампер выбора питания V2 на Troyka Shield в положение V2+5V. Пин микроконтроллера, соединённый с пином Echo должен быть толерантен к 5 В. Приведённая схема подходит для подключения дальномера к Iskra JS.

Пример работы

Рассмотрим как работает дальномер.

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

  • После получения высокого сигнала длительностью 10 μs на пин Trig, модуль генерирует пучок из восьми сигналов частотой 40 кГц и устанавливает высокий уровень на пине Echo.

  • После получения отраженного сигнала модуль устанавливает на пине Echo низкий уровень.

Зная продолжительность высокого сигнала на пине Echo можем вычислить расстояние, умножив время, которое потратил звуковой импульс, прежде чем вернулся к модулю, на скорость распространения звука в воздухе (340 м/с).

Функция pulseIn позволяет узнать длительность импульса в μs. Запишем результат работы этой функции в переменную duration.

Теперь вычислим расстояние переведя скорость из м/с в см/мкс:

distance = duration * 340 м/с = duration * 0.034 м/мкс

Преобразуем десятичную дробь в обыкновенную

distance = duration * 1/29 = duration / 29

Принимая во внимание то, что звук преодолел расстояние до объекта и обратно, поделим полученный результат на 2

distance = duration / 58

Оформим в код всё вышесказанное и выведем результат в Serial Monitor

ultrasonic.ino
// Укажем, что к каким пинам подключено
int trigPin = 10; 
int echoPin = 11;  
 
void setup() { 
  Serial.begin (9600); 
  pinMode(trigPin, OUTPUT); 
  pinMode(echoPin, INPUT); 
} 
 
void loop() { 
  int duration, distance;
  // для большей точности установим значение LOW на пине Trig
  digitalWrite(trigPin, LOW); 
  delayMicroseconds(2); 
  // Теперь установим высокий уровень на пине Trig
  digitalWrite(trigPin, HIGH);
  // Подождем 10 μs 
  delayMicroseconds(10); 
  digitalWrite(trigPin, LOW); 
  // Узнаем длительность высокого сигнала на пине Echo
  duration = pulseIn(echoPin, HIGH); 
  // Рассчитаем расстояние
  distance = duration / 58;
  // Выведем значение в Serial Monitor
  Serial.print(distance); 
  Serial.println(" cm"); 
  delay(100);
}

Работа с библиотекой

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

ultrasonic_lib.ino
#include <NewPing.h>
 
#define TRIGGER_PIN  10
#define ECHO_PIN     11
#define MAX_DISTANCE 400
 
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
 
void setup() {
  Serial.begin(9600);
}
 
void loop() {
  delay(50);
  Serial.print("Ping: ");
  Serial.print(sonar.ping_cm());
  Serial.println("cm");
}

Работа с Iskra JS

var sonic = require('@amperka/ultrasonic')
  .connect({trigPin: P10, echoPin: P11});
 
sonic.ping(function(err, value) {
  if (err) {
    console.log('An error occurred:', err);
  } else {
    console.log('The distance is:', value, 'millimeters');
  }
}, 'mm');

Характеристики

  • Напряжение питания: 5 В

  • Потребление в режиме тишины: 2 мА

  • Потребление при работе: 15 мА

  • Диапазон расстояний: 2–400 см

  • Эффективный угол наблюдения: 15°

  • Рабочий угол наблюдения: 30°

Ресурсы

wiki.amperka.ru

Ультразвуковой датчик HC-SR04

В этой статье я хотел бы поделится своим опытом работы с довольно дешевым ультразвуковым датчиком расстояния типа HC-SR04. Этот датчик представляет собой простой ультразвуковой сонар, тем не менее имеет хорошие характеристики.

О работе с ним расписано уже много информации. Вкратце работа с датчиком HC-SR04 заключается в следующем: посылаем с микроконтроллера на вывод Trig короткий импульс (10 микросекунд) и засекаем время, по нарастающему фронту (изменению состояния с 0 на 1), на выводе Echo, останавливаем таймер. Полученное значение, делим на 58 и получаем значение в сантиметрах.

Это краткий алгоритм. На самой плате датчика есть 3 микросхемы. Одна из них это контроллер, вторая — MAX232 — предназначена для раскачки импульса до амплитуды 10В (передатчик), и третья — TL082 или аналог, предназначена для усиления принятого сигнала(приемник). Кстати, во всех дешевых китайских модулях микросхема MAX232 — муляж и она не раскачивает напряжение. Если хотите более высоких характеристик (измерение до 4-х метров как в описании), ее нужно менять на настоящую.

Схема датчика HC-SR 04

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

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

А что касается использования их в сырой среде тут я вас разочарую. Мои опыты показали что работает датчик HC-SR04 в такой среде не более месяца, после чего выходит из строя (излучатели полностью корродируют и не подлежат восстановлению, хотя электроника вся в порядке). В характеристиках дальномера HC-SR04 указан диапазон от 2 до 400 см. У меня стабильная работа получилась от 5 см, так что советую программно установить такие ограничения. Что касается второго предела, то мне не удавалось протестировать его на 4 м, но 2.8 м он измерял достаточно стабильно. Нижнее ограничение в 5 см у этого датчика возникает из-за того что при выстреле пачки импульсов излучателем, они моментально попадают и на приемник который имеет высокое усиление. Поэтому необходимо немного переждать и потом уже отслеживать сигнал приемника. Отсюда и ограничение.

На картинке выше наглядно видно как волна сразу после излучения попадает на приемник. Была попытка заменить родные излучатели на те, которые применяются в системах парктроника. Делалось это с целью применения датчика HC-SR04 во влажной среде. Но это не дало никакого результата. Дело в том что датчики парктроника раскачиваются намного большим напряжением, да и в усиление принятого сигнала должно быть на порядок больше. Если нужно работать во влажной среде советую воспользоваться датчиком JSN-SR04T.

Стоит он на порядок дороже, но он работает с датчиком парктроника который имеет отличную пыле и влагозащиту. Правда в датчике JSN-SR04T, нижний предел измерения — 30 см, это нужно учитывать (это из-за применения вместо двух — одного излучателя, и собственно после излучения нужно больше времени на затухание колебаний).

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

elschemo.ru

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

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

Сразу извиняюсь, упаковок и распаковок не будет. Сам не люблю их в других обзорах, свои портить не буду. Разве что какой заказ прибудет в экстраординарной упаковке или супер непотребном виде…
Возникла идея автоматически включать свет при посещении сортира и так же выключать при покидании оного. Был заказан pir-выключатель для этих целей, а так же pir-датчик отдельно, на всякий…


Выключатель был установлен в однозначно посещаемом всеми членами семьи помещении и…
И оказалось, что плясать лезгинку, при выполнении процедур характерных для посещения сортира, никто не в состоянии, а замирание в привычной позе характерно для всех. Тут и подстерегала бяка. Только задумался о добром и вечном, свет хлоп и выключился, что довольно досадно.
Перепробованы все способы регулировок выключателя, но желаемого результата достичь не удалось.
Не удалось обмануть себя и физику, подменив необходимый датчик присутствия, на датчик обнаружения.
Так что выключатель и неиспользованный pir-датчик были отправлены на длительное хранение до лучших времен, а их место занял…
Комбинированный радар для воротных систем CONDOR, пока никуда не пристроенный.

Микроволновый блок естественно был отключен, зачем нам подставлять макушку под микроволны. Осталась только ИК матрица.
Штука довольна специфическая. Минимальная зона у него размером с помещение. Свет включает и выключает при посещении на ура. Но есть один недостаток. Датчик очень педантичен и любит, чтобы все стояло на своих местах. Передвинул рулончик бумажки или опустил/поднял стульчак, требуется перенастройка. Да и ценник у него не сортирный.
Так что поиск решения был продолжен.
На просторах интернета набрел на сайт Электрик и форум с темой о простом автоматическом выключателе света на ультразвуковом датчике.
Тема показалась интересной, тем более изобретать велосипед с прошивкой не надо, автор постарался за нас, за что ему спасибо.
Схема есть, прошивки есть. Осталось сделать печатку и получить на выходе полноценный датчик присутствия. Или не получить… посмотрим…
Датчик был заказан на banggood’e. Нравится мне этот магазин стабильностью сроков доставки. Безтреком 28-30 дней и заказ у меня.
Приехал безтреком в срок. Упаковка для посылок без трека у banggood’а стандартная, мусорный мешок и все…
Датчик был упакован в антистатик, что подозреваю и спасло его от почтовых неприятностей. :0)
К сожалению мусорный мешок выбросил по пути домой, а антистатик уже дома, так что показать кроме датчика вам нечего, да и сам датчик уже потрепался (ножки выпрямил) в процессе изготовления устройства.
ТТХ датчика:
— 45*20*23 мм. ДхШхГ (Г — с выпрямленными ножками)
— вес — 8,28 грамм
— напряжение питания — DC 5V
— ток потребления — 15mA
— минимальное рабочее расстояние — 2 см.
— максимальное рабочее расстояние — 4 метра
— угол зоны обнаружения — 15 градусов
Кратко.
Датчик работает по принципу эха. Один пьезик датчика излучает пакет импульсов с частотой 40 кГц, сигнал отражается от поверхности перед датчиком, отраженный сигнал принимает другой пьезик, блок обработки обрабатывает полученные данные и на выходе выдает импульс длинной пропорциональной расстоянию прохождения УЗ сигнала.
Т.е. на выходе мы имеем импульс, длительность которого нам и важна.
В изготавливаемом нами автоматическом включателе/выключателе мы сравниваем длительность импульса занесенного в память микроконтроллера, с длительностью нового отраженного импульса. Если длительность нового импульса меньше того что в памяти, микроконтроллер решает, что в зоне обнаружение есть объект и нужно включить нагрузку… Если длинна импульса больше, то ничего не делаем или выключаем нагрузку, если она включена.
Далее:
Сам датчик.

Маркировка на микросхемах стерта.

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

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

Засвечиваем, промываем, травим.

Травим, смываем фоторезист.

Наносим маску, засвечиваем шаблон.

Режем платку, сверлим.


Сама платка.
Собрана схема на ATtiny13.
Зачем для тестов такая красивая? Просто она делалась попутно с другой платой, под эл. нагрузку.
Почему так бестолково расположены радиоэлементы? По тому что тестовая. Чтобы проверить, рабочее ли устройство в сборе. Не было смысла разводить и компоновать.

Припаиваем датчик к платке.

Программируем.

В результате получаем готовый бескорпусной датчик присутствия с питанием пять вольт, кушающее 30mA, способное обнаруживать посторонние предметы в заранее запрограммированной зоне обнаружения с углом в 15 градусов и расстоянием от 2 сантиметров, до 3,5 метров. При обнаружении включать светодиод.
Принцип работы прост. Направляем датчик, куда нам нужно. Нажимаем кнопку.
Настроечный светодиод (у меня он красненький) начинает мигать.
Мигает он в 3-х режимах:
10% светодиод включен— объект вне зоны действия, нагрузка выключена.
90% светодиод включен— объект в зоне действия, нагрузка включена.
50% светодиод включен— зона обнаружения свободна, идет отсчет 60 или 10 секунд, или одна секунда, в зависимости от прошивки, до выключения, лампа включена.
Дальше у вас есть 10 секунд чтобы уйти из зоны обнаружения.
Можно ограничить зону. Для этого нужно в момент запоминания настроек встать на границе зоны, тем самым зона будет ограничена.
Паспортные минимальные 2 сантиметра я подтверждаю. Если ограничить зону как на фото, то при просовывании пальца между коробкой и датчиком светодиод загорается, убираем палец, гаснет.
Если подвинуть коробку на полсантиметра ближе, то свтодиод загорается, устройство настраиваться отказывается.

Максимальные 4 метра подтвердить не удалось. Максимальное расстояние которое удалось подтвердить, где устройство уверенно фиксирует человека равно 3.5 метра. На з-х метрах уверенно фиксирует мою руку с коробкой 15х15 сантиметров. Включает нагрузку и не отключает, пока коробку не уберешь.
Выводы.
— Получившийся датчик присутствия мне понравился.
— Простейшая и удобная настройка.
— Реально работает.
— Дешево и сердито.
В общем, вот такое получилось годное устройство на ультразвуковом модуле измерения расстояния HY-SRF05.
В недалеком будущем я приспособлю его по месту, только коробку подберу.
Теперь можно будет замирать в нужной позе не боясь отключения света.
Желающие думаю могут придумать еще множество способов его использования. Особенно ардуинщики, для кого этот датчик в принципе и разработан. А может и не для них…

mysku.ru

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

Самым распространенным датчиком для измерения расстояния в диапазоне от 2 см до 400 см во всевозможных Arduino проектах является ультразвуковой локатор HC-SR04. Этот датчик был приобретен на Ru.aliexpress.com

ультразвуковой локатор HC-SR04 на Али

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

Технические характеристики HC-SR04

  • Напряжение: 5 В (DC)
  • Рабочий ток: менее 2 mA.
  • Выход сигнал: высокий уровень 5 В, низкий уровень 0 В.
  • Угол: не более 15 градусов.
  • Расстояние обнаружения: 2 — 450 см.
  • Высокая точность: до 0.3 см
  • Вход триггера сигнала: 10 мкс TTL импульс

Конструктивно датчик представляет собой печатную плату, на которой размещены все компоненты устройства, в первую очередь на плате хорошо заметны излучатель и приемник ультразвуковых волн. Размер датчика 20 х 40 х 15 мм, масса 8,3 г.

ультразвуковой датчик HC-SR04

Устройство излучает серию ультразвуковых импульсов на частоте 40 кГц [1-3]. Угол зрения датчика составляет около 15 градусов. Для инициализации цикла измерения надо в течении 10 мкс на вход датчика Trig подать высокий логический уровень. После этого устройство излучит 8 пачек ультразвуковых импульсов. По длительности эха можно судить о расстоянии до препятствия, это расстояние кодируется длительностью импульса, поступающего на выход Echo. Если препятствие не обнаружено, то длительность импульса составляет 38 мс.

Подключение HC-SR04 к Arduino

Для использования датчика вместе с аппаратной платформой Arduino существует специальная библиотека Ultrasonic [4], которая берет на себя все рутинные операции по управлению датчиком и сразу возвращает расстояние в сантиметрах. Впрочем, логика работы датчика не очень сложна, так что программу, управляющую работой датчика можно реализовать самостоятельно. Тем более, что данная библиотека позволяет работать только с одним датчиком, а зачастую для нормальной ориентации роботу может потребоваться несколько датчиков [5].

ультразвуковой локатор с Ардуино

Датчику необходимо напряжение питания 5 В, ток потребления составляет 3 мА.

Испытания УЗ детектора

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

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

В целом, HC-SR04 отличный недорогой датчик, который может стать основным «зрением» робота в пределах небольшой комнаты, так же его можно применить для измерения уровня жидкости, в системах сигнализации и т.п. Специально для сайта «2 Схемы» — Denev.

  1. http://robocraft.ru/blog/electronics/772.html
  2. https://arduino-kit.ru/userfiles/image/HC-SR04%20_.pdf
  3. http://amperka.ru/product/hc-sr04-ultrasonic-sensor-distance-module
  4. https://code.google.com/archive/p/robocraft/
  5. Лекомцев Д.Г. Arduino. Подключение типовых внешних устройств. – Радио, 2016, №11, с. 51-54

Загрузка…

2shemi.ru

HC-SR04. Ультразвуковой датчик измерения расстояния

HC-SR04 — это ультразвуковой датчик, позволяющий измерять расстояние до преграды в диапазоне от 2 до 400 см. Он представляет собой плату, на которой размещены излучатель и приемник ультразвука и управляющая электронная схема. Датчик имеет небольшие габариты и простой интерфейс: два вывода питания, один вход и один выход. Может быть использован в качестве датчика присутствия в умном доме или охранной системе, а также для всяких роботизированных поделок. Также на нем можно сделать парктроник для машины, только в уличных условиях он быстро загрязнится.

Плата датчика имеет 4 вывода:

— плюсовой вывод питания (Vcc)
— вход TRIG
— выход ECHO
— ноль питания (GND)

На выводы питания подается постоянное напряжение 5 В. По даташиту датчик потребляет в рабочем режиме 15 мА. У меня на макете мультиметр показывал потребление ~6.5 мА, но я выполнял замеры расстояния с низкой частотой (единицы герц). 

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

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


Временная диаграмма работы датчика HC-SR04 показана на рисунке ниже. 


Расстояние можно посчитать по следующей формуле:


S = Tus/58, [см]


где Tus — длительность эхо импульса в микросекундах, а 58 — константа. 

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

Я написал программный модуль для работы с датчиком HC-SR04 так, чтобы можно было использовать внешние прерывания INT0, INT1 или INT2 и любой из аппаратных таймеров. Используемый таймер просто непрерывно считает тактовые импульсы в режиме Normal (от 0 до максимума), вызывая прерывания после переполнения счетного регистра. Делитель для таймера может быть любым, главное указать его в программном модуле датчика. Значение предделителя таймера используется при расчете длительности эхо сигнала и, следовательно, влияет на расчет расстояния. 

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

Модуль представляет собой два файла usens.h и usens.c. Набор функций модуля такой:

void USENS_Init(void) — настройка используемых выводов, инициализация внутренних переменных. Эта функция вызывается в начале main функции. 

void USENS_Handler(void) — запускает процесс измерения, формируя сигнал для входа TRIG, а по окончании измерения вычисляет расстояние до объекта. Эту функцию нужно запихнуть в бесконечный цикл. 

uint16_t USENS_GetDistance(void) — возвращает расстояние до объекта, если оно было измерено. В противном случае возвращает 0. Может вызываться в любое время. 

void USENS_CountingOvf(void) — эту функцию нужно запихнуть в прерывание используемого таймера. Она подсчитывает число переполнений таймера. 

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

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

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

По паспорту датчик измеряет расстояние с разрешением ~3 мм в диапазоне от 3 до 400 см. 

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

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

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

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

AVR-HC-SR02.rar проект для IAR`a
datasheet HC-SR04

chipenable.ru

Ультразвуковой дальномер HC-SR04 без микроконтроллера часть 1

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

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



Часть 1. Сигнализаторы присутствия

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

Ультразвуковой дальномер HC-SR04 (Ultrasonic Ranging Module HC-SR04. — https://lib.chipdip.ru/092/DOC00109 2302.pdf (29.01.18)), далее дальномер HC-SR04, широко известен, доступен и часто используется радиолюбителями для построения различных устройств. В отличие от других датчиков, дальномер HC-SR04 не реагирует на солнечный свет или цвет объекта, но его эффективность сильно зависит от отражательных свойств поверхности. Традиционно его применяют совместно с микроконтроллерами, а наиболее широко — с платами семейства Arduino, чему способствуют доступные библиотеки для управления дальномером. Описаний подобных конструкций много в Интернете. Но в некоторых случаях при построении отдельных устройств можно с успехом обойтись и без микроконтроллеров. Прежде всего, это относится к устройствам, где не требуется точного измерения расстояния, а сделать это позволяют некоторые особенности дальномера HC-SR04. Дело в том, что информация о расстоянии с его выхода формально выводится в цифровом виде, но её нетрудно простыми средствами обработать без микроконтроллера или преобразовать в аналоговую, а затем использовать для построения различных автоматов.

Но для начала надо подробнее познакомиться с конструкцией и параметрами дальномера HC-SR04 (рис. 1). Следует отметить, что топология печатной платы дальномера у разных производителей может отличаться.

Рис. 1. Дальномер HC-SR04

Основные технические характеристики

Напряжение питания, В ………….4,8…5,5

Максимальный потребляемый ток, мА……………….15

Угол обзора, град……………..15

Измеряемое расстояние, см …………2…400

Погрешность измерения, см………………………0,3

Интервал рабочих температур, оС ……………….0…+ 60

Габаритные размеры, мм . . . .45x20x15

Назначение выводов HC-SR04: Vcc — плюсовой вывод питания; Trig — вход запускающего сигнала; Echo — выход эхо-сигнала; GND — общий «земляной» вывод.

Принцип работы дальномера HC-SR04 основан на принципе эхолокации, т. е. использует точно такую же технологию, что и летучие мыши, дельфины и некоторые другие животные для ориентации в пространстве, а именно ультразвук (УЗ). На передней части платы дальномера расположено два УЗ-преобразователя, первый — это передатчик (Transmiter) УЗ-волн (TCT40-16T), он расположен на плате слева, иногда его отмечают надписью «T», а второй — приёмник (Receiver) отражённых УЗ-волн (TCT40-16R), он установлен справа, иногда маркируется надписью «R», а в центре расположен кварцевый резонатор.

Работу дальномера HC-SR04 поясняет рис. 2. Для запуска процесса измерения на вход Trig (UTR) надо подать импульс длительностью tTR= 10…15 мкс. По спаду этого импульса дальномер излучает пачку из восьми УЗ зондирующих импульсов UT на частоте 40 кГц. Через небольшой промежуток времени (около 1 мкс) после окончании пачки УЗ-импульсов на выходе Echo (UEC) появится высокий логический уровень. Он сменится на низкий, когда в приёмник попадёт отражённый УЗ-сигнал UR. Таким образом, длительность импульса tEC на выходе Echo зависит от расстояния до препятствия: L(см) = t(мкс)/58. Поэтому, измерив длительность импульса tEC и проведя несложные расчёты, можно определить это расстояние. Так обычно и происходит в устройствах, собранных на дальномере HC-SR04 и микроконтроллере (или плате семейства Arduino). По результатам измерения принимается какое-либо решение. Если отражённого УЗ-сигнала не будет или он будет ниже порога обнаружения, длительность импульса tEC — около 38 мс. Поэтому период следования запускающих импульсов TTR должен быть не менее 45…50 мс.

Рис. 2. Диаграмма, поясняющая работу дальномера HC-SR04

Сигнализатор присутствия-1

Самые распространённые датчики движения — это ИК-датчики, которые относятся к так называемым пассивным. Их основа — пироэлектрический датчик, который реагирует на изменение ИК-излучения, попадающего на него. Если это излучение будет мало, такой датчик на перемещение объекта не реагирует. Одним из главных недостатков большинства таких датчиков является то, что они реагируют только на движение человека. Если применить такой датчик в выключателе освещения, например, на лестничной площадке, где люди постоянно перемещаются, проблем не возникает. Но если человек будет неподвижен, такой ИК-датчик перестанет реагировать и свет погаснет.

Для таких случаев более подходящим будет активный датчик, который излучает зондирующий сигнал и принимает сигнал, отражённый от объекта. Сделать такой датчик можно на основе дальномера HC-SR04. В таком устройстве не требуется измерять точное расстояние до предмета, и вполне достаточно информации о том, что он расположен на расстоянии меньше заранее установленного. Принцип работы такого сигнализатора может быть основан на том, что в дежурном состоянии на выходе дальномера HC-SR04 присутствует сигнал, параметры которого обусловлены наличием удалённых предметов или препятствий. Впрочем, отражённого сигнала может и не быть совсем. Поэтому длительность импульса tЕСна выходе Echo должна быть сравнительно большой. При появлении в зоне действия дальномера НС-SR04 более близко расположенных предметов длительность импульса tEC существенно уменьшается. Это и можно использовать для построения сигнализатора присутствия. Но для этого надо каким-то образом измерить длительность импульса tEC. В устройствах с микроконтроллерами это реализуется напрямую. Более простое решение без процедуры измерения можно реализовать на логических микросхемах.

Схема датчика присутствия показана на рис. 3. На логических элементах DD1.1 и DD1.2 собран генератор запускающих импульсов. На выходе элемента DD1.2 формируются импульсы длительностью 10…15 мкс с периодом следования около 45 мс. Реализуется это за счёт того, что резисторы в цепи зарядки и разрядки конденсатора С2 отличаются примерно на четыре порядка. Элемент DD2.1 инвертирует сигнал с выхода Echo дальномера. На элементах DD2.2 и DD2.3 собран ждущий одновибратор образцовых импульсов, которые задают временное окно для сравнения с инвертированным сигналом с выхода Echo. Это сравнение осуществляет логический элемент DD2.4 (2И-НЕ). На элементах DD1.3 и DD1.4 собран буферный каскад, который подаёт питающее напряжение на элементы сигнализации — светодиод HL1 и акустический излучатель HA1 со встроенным генератором.

Рис. 3. Схема датчика присутствия

Диаграмма, поясняющая работу сигнализатора, показана на рис. 4. Осциллограммы в контрольных точках 1-6 в исходном состоянии показаны красным цветом. После поступления импульса запуска 1 через некоторое время на выходе Echo появляется импульс 2, длительность которого зависит от расстояния до объекта, от которого пришёл отражённый сигнал. Этот импульс инвертирует (импульс 3) элемент DD2.1. По спаду импульса 3 ждущий одновибратор формирует образцовый импульс 4, длительность которого можно изменять подстроечным резистором R3. Элемент DD2.4 сравнивает импульсы 3 и 4. В исходном (дежурном) состоянии устройства длительность импульса 3 превышает длительность импульса 4, поэтому на выходе этого элемента присутствует высокий логический уровень (сигнал 5). Конденсатор С4 через резистор R5 заряжается до того же уровня, и на выходе элементов DD1.3 и DD1.4 присутствует низкий уровень (сигнал 6), поэтому светодиод HL1 и звуковой излучатель HA1 обесточены.

Рис. 4. Диаграмма, поясняющая работу сигнализатора

При появлении в зоне контроля сигнализатора объекта, который отражает УЗ-сигналы, состояние устройства изменяется. Осциллограммы для этого случая показаны синим цветом. Во-первых, длительность импульса 2 на выходе Echo, а также импульса 3 уменьшается. Поэтому на выходе элемента DD2.4 кратковременно появится низкий уровень (импульс 5), что приведёт к быстрой разрядке через диод VD2 конденсатора С4 и появлению на выходе элементов DD1.3 и DD1.4 высокого уровня. В результате включится светодиод HL1 и начнёт работать звуковой излучатель HA1, которые и подадут сигнал о наличии какого-либо объекта в зоне контроля сигнализатора. После ухода объекта из этой зоны сигнализатор вернётся в исходное состояние. В дежурном режиме устройство потребляет ток 3,3 мА, при подаче сигнала — 7,5 мА. Для его питания надо применить стабилизированный источник.

Все элементы сигнализатора размещены на односторонней печатной плате из стеклотекстолита толщиной 1…1,5 мм, её чертёж показан на рис. 5, а смонтированная плата — на рис. 6. Применены постоянные резисторы С2-23, Р1-4, МЛТ (R1 в данном случае составлен из двух соединённых последовательно резисторов КВИ по 5,1 МОм), подстроечный — СП3-19, оксидные конденсаторы — К50-35 и импортные, остальные — плёночные или керамические (С2 должен быть с малым током утечки). Диоды — любые маломощные импульсные, светодиод — маломощный любого свечения, можно применить мигающий с напряжением питания 5 В, в этом случае резистор R6 заменяют проволочной перемычкой. Звуковой излучатель — со встроенным генератором, обеспечивающий достаточную громкость при напряжении 5 В. Дальномер HC-SR04 можно впаять в плату либо применить для его подключения гнёзда из серии PSB, например, отрезав четыре штуки от гнезда PSB-10 (DS1023-1×10). Второй вариант, конечно, предпочтительней, поскольку позволяет оперативно заменять дальномеры и тем самым проверять их работоспособность и сравнивать их между собой.

Рис. 5. Чертёж печатной платы сигнализатора

Рис. 6. Смонтированная плата устройства

Налаживание сводится к проверке надёжного запуска дальномера HC-SR04, при необходимости для этого следует подобрать конденсатор С2. Дальность обнаружения устанавливают подстроечным резистором R3.

Сигнализатор присутствия-2

В сигнализаторе, описание которого приведено выше, реализован метод контроля длительности импульса на выходе Echo дальномера. Но импульсы на этом выходе относительно просто преобразовать в постоянное напряжение и уже затем использовать его для проведения измерений или управления другими элементами. Дело в том, что дальномер работает постоянно, и на выходе Echo дальномера HC-SR04 присутствует не отдельный импульс, а их последовательность. Если такую последовательность подать на вход интегрирующей RC-цепи, на её выходе будет напряжение ивых, пропорциональное амплитуде Uп и скважности Q импульсов: Uвых = Uп/Q, где Q = TTR/tEC. На практике это означает, что с приближением объекта постоянное напряжение на выходе интегрирующей RC-цепи уменьшается.

Схема второго варианта датчика присутствия показана на рис. 7. Формирователь запускающих импульсов здесь реализован по несколько иному принципу, он собран на логических элементах микросхемы DD1. На элементах DD1.1 и DD1.2 собран RC-генератор импульсов с частотой следования около 60 мс. Эти импульсы напрямую поступают на первый вход (вывод 12) элемента DD1.3, а на второй — через дифференцирующую RC-цепь C3R4, в результате на его выходе формируются запускающие импульсы, которые инвертирует элемент DD1.4, после чего они поступают на вход Trig дальномера HC-SR04. Формирователь запускающих импульсов в этой конструкции собран на большем числе элементов, чем в предыдущем устройстве, но зато не содержит высокоомных резисторов.

Рис. 7. Схема второго варианта датчика присутствия

Выходные импульсы дальномера HC-SR04 поступают на интегрирующую RC-цепь R2C4, постоянное напряжение на выходе которой зависит от расстояния до объекта. Это напряжение подаётся на инвертирующий вход ОУ DA2, который работает как компаратор. На его неинвертирующий вход поступает образцовое напряжение с делителя напряжения R3R5. Если объект находится за пределами зоны контроля сигнализатора, напряжение на выходе интегрирующей цепи превышает образцовое и на выходе ОУ будет напряжение, близкое к нулю. Поэтому включён светодиод HL1 зелёного свечения, сигнализирующий о работе устройства. Светодиод HL2 красного свечения и акустический сигнализатор со встроенным генератором обесточены.

При появлении в зоне контроля объекта напряжение на инвертирующем входе ОУ уменьшается и на его выходе появляется напряжение примерно на 1,5 В меньше питающего. В результате светодиод HL1 гаснет, включаются светодиод HL2 и акустический излучатель HA1, которые и подадут сигнал.

Длительность запускающего импульса можно изменить подборкой конденсатора С3. Дальность срабатывания сигнализатора устанавливают подстроечным резистором R5. Чтобы ввести гистерезис и сделать переключение сигнализатора более чётким, следует ввести резистор R8, который обеспечивает положительную обратную связь. Этот резистор можно установить со стороны печатных проводников.

Чтобы сделать питание сигнализатора более универсальным, например, питать его от батареи «Крона» или блока питания с выходным напряжением 7…12 В, в устройство введён интегральный стабилизатор DA1, который стабилизирует напряжение питания дальномера HC-SR04 и цифровой микросхемы. В дежурном режиме потребляемый ток — 8 мА, при подаче сигнала — 13 мА.

Чертёж односторонней платы сигнализатора, изготовленной из стеклотекстолита толщиной 1…1,5 мм, показан на рис. 8, а смонтированная плата — на рис. 9. В этом сигнализаторе можно применить аналогичные детали.

Рис. 8. Чертёж односторонней платы сигнализатора

Рис. 9. Смонтрованная плата устройства

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

Продолжение следует

Чертежи печатных плат в формате Sprint-Layout имеются здесь.

Автор: И. Нечаев, г. Москва

Дата публикации: 22.05.2018

Рекомендуем к данному материалу …


Мнения читателей

Нет комментариев. Ваш комментарий будет первый.

Вы можете оставить свой комментарий, мнение или вопрос по приведенному вышематериалу:


www.radioradar.net

Ультразвуковой датчик HC-SR04. Дальномер на микроконтроллере | RadioLaba.ru

          #include <P16F628A.INC>

            LIST        p=16F628A    

            __CONFIG    H’3F10′             ;Конфигурация микроконтроллера

                                    

            

Sec           equ         20h               ;регистры хранения временных данных для

Sec1          equ         21h               ;подпрограмм паузы

shet          equ         22h               ;регистр счетчика времени    

scetbit       equ         23h               ;регистр счета для передачи по протоколу spi

ctr           equ         24h               ;регистр хранения временных данных

bcd1          equ         25h               ;регистры хранения двоично-десятичных значений

bcd2          equ         26h               ;двоичного числа

bcd3          equ         27h               ;

edin          equ         28h               ;регистры хранения десятичных значений

desiat        equ         29h               ;двоичного числа

sotni         equ         2Ah               ;

dat_ind       equ         2Bh               ;регистр данных для передачи по протоколу spi

adr_ind       equ         2Ch               ;регистр адреса для передачи по протоколу spi

varLL         equ         2Dh               ;промежуточные регистры хранения значения

varHH         equ         2Eh               ;времени задержки (эха) от ультразвукового модуля

rezLL         equ         2Fh               ;регистры хранения результата деления двоичных

rezHH         equ         30h               ;чисел            

 

flag          equ         7Dh               ;регистр флагов

W_TEMP        equ         7Eh               ;регистр для хранения значения аккумулятора W

STATUS_TEMP   equ         7Fh               ;регистр для хранения значения STATUS

 

#DEFINE       trig        PORTB,3           ;линия trig ультразвукового модуля

#DEFINE       echo        PORTB,4           ;линия echo ультразвукового модуля

 

#DEFINE       datai       PORTB,5           ;линия входа данных драйвера MAX7219

#DEFINE       cs          PORTB,6           ;линия выбора драйвера MAX7219

#DEFINE       clk         PORTB,7           ;линия тактирования драйвера MAX7219

 

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

              org         0000h             ;начать выполнение программы с адреса 0000h

              goto        Start             ;переход на метку Start

          

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Подпрограмма обработки прерываний

 

              org         0004h             ;начать выполнение подпрограммы с адреса 0004h

      

              movwf       W_TEMP            ;сохранение значений ключевых регистров

              swapf       STATUS,W          ;

              clrf        STATUS            ;

              movwf       STATUS_TEMP       ;

                

              btfsc       PIR1,TMR1IF       ;опрос флага прерывания по переп. таймера TMR1

              goto        prov_tmr1         ;флаг установлен: переход на метку prov_tmr1

              

              btfss       echo              ;флаг прерывания по переп. таймера TMR1 сброшен:

                                            ;опрос состояния линии ввода\вывода echo

              goto        stop_tmr1         ;линия echo равна 0: переход на метку stop_tmr1

              bsf         T1CON,TMR1ON      ;линия echo равна 1: запуск таймера TMR1

              movf        PORTB,W           ;чтение регистра PORTB для устранения несоответствия

              bcf         INTCON,RBIF       ;сброс флага прерывания по изменению уровня сигнала RB4:RB7

              goto        exxit             ;переход на метку exxit

 

stop_tmr1     bcf         T1CON,TMR1ON      ;остановка таймера TMR1

s_t1          movf        TMR1H,W           ;копирование значений регистров таймера TMR1 в промежуточные

              movwf       varHH             ;регистры хранения времени задержки (эха)

              movf        TMR1L,W           ;от ультразвукового модуля

              movwf       varLL             ;

              bcf         INTCON,RBIE       ;запрещение прерываний по изменению уровня сигнала RB4:RB7

              bsf         flag,0            ;установить флаг получения длительности импульса (эха)

              movlw       .4                ;запись числа 4 в регистр счетчика времени

              movwf       shet              ;

              clrf        TMR1L             ;очистка регистров таймера TMR1

              clrf        TMR1H             ;

              bcf         PIR1,TMR1IF       ;сброс флага прерывания по переп. TMR1

              bsf         T1CON,TMR1ON      ;запуск таймера TMR1

              goto        exxit             ;переход на метку exxit

            

prov_tmr1     btfss       INTCON,RBIE       ;проверка разрешения прерываний по изменению

                                            ;уровня сигнала на входах RB4:RB7

              goto        p_t1              ;прерывания запрещены: переход на метку p_t1

              bcf         T1CON,TMR1ON      ;прерывания разрешены: остановка таймера TMR1

              movlw       .156              ;запись числа 39936 в регистры таймера TMR1

              movwf       TMR1H             ;

              clrf        TMR1L             ;

              goto        s_t1              ;переход на метку s_t1

p_t1          decfsz      shet,F            ;декремент регистра shet (счетчик времени)

              goto        exx1              ;регистр shet не равен 0: переход на метку exx1

              bcf         T1CON,TMR1ON      ;остановка таймера TMR1

              clrf        TMR1L             ;очистка регистров таймера TMR1

              clrf        TMR1H

              bsf         flag,1            ;установить флаг готовности измерения

 

exx1          bcf         PIR1,TMR1IF       ;сброс флага прерывания по переполнению TMR1

exxit         swapf       STATUS_TEMP,W     ;восстановление содержимого ключевых регистров

              movwf       STATUS            ;

              swapf       W_TEMP,F          ;

              swapf       W_TEMP,W          ;

                                            ;

              retfie                        ;выход из подпрограммы обработки прерывания

 

            

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Основная программа

                                

            

Start         movlw       b’01000000′       ;сброс регистра PORTB

              movwf       PORTB

              

              movlw       b’00000111′       ;выключение компараторов

              movwf       CMCON

 

              bsf         STATUS,RP0        ;выбрать 1-й банк    

              movlw       b’00010111′       ;настройка линий ввода\вывода порта B  

              movwf       TRISB             ;RB0-RB2, RB4 на вход, остальные на выход

              bcf         STATUS,RP0        ;выбрать 0-й банк  

 

              clrf        flag              ;очистка регистра флагов

            

              movlw       b’00000000′       ;настройка таймера TMR1: предделитель TMR1 1:1,  

              movwf       T1CON             ;внутренн источник тактового сигнала

              clrf        TMR1L             ;очистка регистров таймера TMR1

              clrf        TMR1H

              bsf         INTCON,PEIE       ;разрешение прерываний периферийных модулей

              bcf         PIR1,TMR1IF       ;сброс флага прерывания по переполнению TMR1

              bsf         STATUS,RP0        ;выбрать 1-й банк

              bsf         PIE1,TMR1IE       ;разрешение прерываний по переполнению TMR1

              bcf         STATUS,RP0        ;выбрать 0-й банк

              

              call        init_lcd          ;вызов подпрограммы инициализации драйвера(MAX7219)

              call        signal_not        ;вызоВ подпрограммы вывода знаков тире «- — -» на

                                            ;цифровое табло

              call        start_pul         ;вызов подпрограммы запуска измерения start_pul

              bsf         INTCON,GIE        ;глобальное разрешение прерываний

            

opros         btfsc       flag,0            ;опрос флага получения длительности импульса (эха)

              call        vivod             ;вызов подпрограммы вывода измеренного значения

                                            ;задержки (эха) на цифровое табло

              btfsc       flag,1            ;опрос флага готовности измерения

              call        start_pul         ;вызов подпрограммы запуска измерения start_pul

              goto        opros             ;переход на метку opros  

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

vivod         bcf         flag,0            ;сброс флага получения времени задержки (эха)

              call        del               ;вызов подпрограммы деления двоичных чисел

          

              movf        rezHH,W           ;проверка результата деления двоичных чисел

              sublw       .1                ;если результат меньше числа 400 вызываем

              btfss       STATUS,C          ;подпрограмму (bin2bcd) преобразования двоичного числа

              goto        viv_1             ;в десятичное

              btfss       STATUS,Z          ;

              goto        viv_2             ;

              movf        rezLL,W           ;

              sublw       .144              ;

              btfss       STATUS,C          ;

              goto        viv_1             ;

viv_2         call        bin2bcd           ;вызов подпрограммы преобразования двоичного числа

                                            ;в десятичное

              call        send_rast         ;вызов подпрограммы вывода десятичного значения  

                                            ;задержки (эха) на цифровое табло

              return                        ;выход из подпрограммы

viv_1         call        signal_not        ;вызов подпрограммы вывода знаков тире «- — -» на

                                            ;цифровое табло

              return                        ;выход из подпрограммы

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

start_pul     bcf         flag,1            ;сброс флага готовности измерения

              bsf         trig              ;установить в 1 линию ввода/вывода trig

              movlw       .3                ;пауза 10 мкс

              movwf       Sec               ;

pul_1         decfsz      Sec,F             ;

              goto        pul_1             ;

              bcf         trig              ;сбросить линию ввода/вывода trig

            

              movf        PORTB,W           ;чтение регистра PORTB для устранения несоответствия

              bcf         INTCON,RBIF       ;сброс флага прерывания по изменению уровня сигнала RB4:RB7

              bsf         INTCON,RBIE       ;разрешение прерываний по изменению уровня сигнала RB4:RB7

              return                        ;выход из подпрограммы

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

del          clrf         rezLL             ;Подпрограмма деления двухбайтного числа на число 58

             clrf         rezHH             ;(varLH, varLL):58

d1           movlw        .58               ;Двухбайтное число предварительно загружается

             subwf        varLL,F           ;в регисты varHH, varLL

             btfsc        STATUS,C          ;Результат деления в регистрах rezLH, rezLL

             goto         d2                ;деление целочисленное без дробной части

             movlw        .1                ;

             subwf        varHH,F           ;

             btfss        STATUS,C          ;

             return                         ;выход из подпрограммы                                          

d2           incfsz       rezLL,F           ;  

             goto         d1                ;

             incf         rezHH,F           ;                                            

             goto         d1                ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;                            

 

bin2bcd       movlw       .16               ;Подпрограмма преобразования двоичного числа

              movwf       ctr               ;в десятичное

              clrf        bcd1              ;Двухбайтное число предварительно загружается

              clrf        bcd2              ;в регисты rezHH, rezLL

              clrf        bcd3              ;Результат преобразования:

              goto        start_1           ;единицы в младшем полубайте bcd3

                                            ;десятки в старшем полубайте bcd3

adjdec        movlw       0x33              ;сотни в младшем полубайте bcd2

              addwf       bcd1,F            ;тысячи в старшем полубайте bcd2

              addwf       bcd2,F            ;десятки тысяч в младшем полубайте bcd1

              addwf       bcd3,F            ;

                                            ;

              movlw       0x03              ;

              btfss       bcd1,3            ;

              subwf       bcd1,F            ;

              btfss       bcd2,3            ;

              subwf       bcd2,F            ;

              btfss       bcd3,3            ;

              subwf       bcd3,F            ;

                                            ;

              movlw       0x30              ;

              btfss       bcd1,7            ;

              subwf       bcd1,F            ;

              btfss       bcd2,7            ;

              subwf       bcd2,F            ;

              btfss       bcd3,7            ;

              subwf       bcd3,F            ;

                                            ;

start_1       rlf         rezLL,F           ;

              rlf         rezHH,F           ;

              rlf         bcd3,F            ;

              rlf         bcd2,F            ;

              rlf         bcd1,F            ;

              decfsz      ctr,F             ;

              goto        adjdec            ;

                                            ;

              movf        bcd3,W            ;копирование значения единиц из младшего

              andlw       b’00001111′       ;полубайта bcd3 в регистр edin

              movwf       edin              ;

              

              swapf       bcd3,W            ;копирование значения десятков из старшего

              andlw       b’00001111′       ;полубайта bcd3 в регистр desiat

              movwf       desiat            ;

 

              movf        bcd2,W            ;копирование значения сотен из младшего

              andlw       b’00001111′       ;полубайта bcd2 в регистр sotni

              movwf       sotni             ;

              return                        ;выход из подпрограммы

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Подпрограмма вывода десятичного значения задержки (эха) на цифровое табло

                              

send_rast     movlw       0x01              ;Вывод значения регистра edin на 1-й индикатор

              movwf       adr_ind           ;

              movf        edin,W            ;

              movwf       dat_ind           ;

              call        send              ;

              movlw       0x02              ;Вывод значения регистра desiat на 2-й индикатор

              movwf       adr_ind           ;

              movf        desiat,W          ;

              movwf       dat_ind           ;

              call        send              ;

              movlw       0x03              ;Вывод значения регистра sotni на 3-й индикатор

              movwf       adr_ind           ;

              movf        sotni,W           ;

              movwf       dat_ind           ;

              call        send              ;

              return                        ;выход из подпрограммы

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Подпрограмма вывода символов тире «- — — » на цифровое табло

        

signal_not    movlw       0x04              ;очистка 4-го индикатора

              movwf       adr_ind           ;

              movlw       0x0F              ;

              movwf       dat_ind           ;

              call        send              ;

              movlw       0x03              ;вывод тире на 3-й индикатор

              movwf       adr_ind           ;

              movlw       0x0A              ;

              movwf       dat_ind           ;

              call        send              ;

              movlw       0x02              ;вывод тире на 2-й индикатор

              movwf       adr_ind           ;

              movlw       0x0A              ;

              movwf       dat_ind           ;

              call        send              ;

              movlw       0x01              ;вывод тире на 1-й индикатор

              movwf       adr_ind           ;

              movlw       0x0A              ;

              movwf       dat_ind           ;

              call        send              ;

              return                        ;выход из подпрограммы

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Подпрограмма инициализации драйвера(MAX7219) цифрового табло

 

init_lcd      call        pauslcd           ;вызов подпрограммы паузы 2 мс

              movlw       0x0F              ;выключить тестовый режим

              movwf       adr_ind           ;

              movlw       0x00              ;

              movwf       dat_ind           ;

              call        send              ;

 

              movlw       0x0C              ;включение индикатора

              movwf       adr_ind           ;

              movlw       0x01              ;

              movwf       dat_ind           ;

              call        send              ;

 

              movlw       0x0A              ;интенсивность 31/32

              movwf       adr_ind           ;

              movlw       0x07              ;

              movwf       dat_ind           ;

              call        send              ;

 

              movlw       0x09              ;использовать BCD Code B для всех индикаторов

              movwf       adr_ind           ;

              movlw       0xFF              ;

              movwf       dat_ind           ;

              call        send              ;

 

              movlw       0x0B              ;использовать  4 индикатора

              movwf       adr_ind           ;

              movlw       0x03              ;

              movwf       dat_ind           ;

              call        send              ;

              return                        ;выход из подпрограммы

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Подпрограмма отправки 2-х байт на драйвер (MAX7219) цифрового табло по пртоколу SPI

 

send         bcf         cs                 ;Сбросить линию выбора драйвера CS

             movlw      .8                  ;Отправка содержимого адресного байта adr_ind

             movwf      scetbit             ;

povtor       bcf        clk                 ;

             btfsc      adr_ind,7           ;

             bsf        datai               ;

             btfss      adr_ind,7           ;

             bcf        datai               ;

             bsf        clk                 ;

             rlf        adr_ind,F           ;

             decfsz     scetbit,F           ;

             goto       povtor              ;

            

             movlw      .8                  ;Отправка содержимого байта данных dat_ind

             movwf      scetbit             ;

povtr1       bcf        clk                 ;

             btfsc      dat_ind,7           ;

             bsf        datai               ;

             btfss      dat_ind,7           ;

             bcf        datai               ;

             bsf        clk                 ;

             rlf        dat_ind,F           ;

             decfsz     scetbit,F           ;

             goto       povtr1              ;

             bcf        clk                 ;

             bsf        cs                  ;установить в 1 линию выбора драйвера CS                

             return                         ;выход из подпрограммы

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

pauslcd       movlw       .4                ;подпрограмма пауза 2 мс

              movwf       Sec1              ;

p3            movlw       .166              ;

              movwf       Sec               ;

p2            decfsz      Sec,F             ;

              goto        p2                ;

              decfsz      Sec1,F            ;

              goto        p3                ;

              return                        ;выход из подпрограммы

                          

              end                           ;конец всей программы

                                            ;

radiolaba.ru

alexxlab

leave a Comment