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

Visits: 1727


Страница в pdf

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

HC-SR04_01bVcc – напряжение питания 5 вольт
Trig – вход запускающих импульсов для процесса измерения
Echo – выход импульса длительность которого пропорциональна расстоянию.
GND – общий провод питания.

Для демо примера будем использовать плату ILLISSI-4B-03-primum и плату индикации ILLISSI-4С-01-secundo.

HC-SR04_02

В качестве управления будем использовать вывод RC2, для измерения длительности будем использовать вход T1G (RB5). Подключение:

HC-SR04_03

Для измерения частоты используется таймер 1 и его Gate-модуль управления.

HC-SR04_04

Gate-модуль управления появился в новых Pic-контроллерах серии PIC16F19xx. Теперь элементарно легко построить измерителей длительности и частоты сигнала, которые аппаратно, самостоятельно выполняют эти функции не отвлекая микроконтроллер от основной задачи.

Для измерения сигнала настроим таймер для измерение длительности импульсов. На вход будем подавать тактовую частоту 1 мГц. Что соответствует 1 мкс длительности. Измеряемый импульс (эхо от модуля HC-SR04) будем подавать на вход T1G.

T1CON=0b00110001; // настройка таймера T1CON
     // |||||| |
     // |||||| +-- TMR1ON таймер включить
     // |||||+---- T1SYNC синхронизация отключена 
     // ||||+----- T1OSCEN генератор отключен
     // ||++------ T1CKPS настройка предделителя 00 - 1:1
     // ++-------- TMR1CS выбор тактовой частоты FOSC
 T1GCON=0b11000100; // регистр ворот
       // ||||||++-- T1GSS<1:0>: выбор входа для модуля ворот 00 - TGP1
       // ||||||+--- T1GVAL: Флаг
       // |||||+---- T1GSPM: выбор синхронизация от модуля единичного импульса
       // ||||+----- T1GGO/DONE: запуск одиночного измерения 
       // |||+------ T1GSPM: управление триггером режима (отключен)
       // ||+------- T1GTM: управление триггером режима (отключен)
       // |+-------- T1GPOL: таймер 1 работает когда уровень высокий
       // +--------- TMR1GE: регистр ворот включен и управляет таймером 1

Вариант настройки таймера выполнен с учетом, что тактовая частота контроллера 32 мГц. (хотя с успехом можно использовать и более низкие тактовые частоты от 1 мГц.).

Процесс измерения начинается с инициализации таймера и сброса флага переполнения таймера.

TMR1IF=0; // сброс флага переполнения
TMR1H=0; // сброс регистров таймер
TMR1L=0; //

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

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

HC-SR04_05

Длительность импульса ответа непрерывна и прерывается только в момент формирования импульса запуска измерения. Вид на ответ от модуля в ситуации отсутствия эха.

HC-SR04_06

Если эхо присутствует, то мы будем видеть следующие осциллограммы работы с модулем.

HC-SR04_07

В начале формируется (на входе Trig) импульс запуска длительностью не менее 10 мкс. После этого модуль через 0,5 мс, начинает формировать ответ импульсом длительностью пропорциональной расстоянию. На нижнем рисунке, пример, формирования импульса (это расстояние от поверхности моего стола до потолка и составляет 1,74 м).

HC-SR04_08

Длительность 10114 мкс. Что составляет 10114/58=174 см.


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

// формирование импульса запуска
 LATC2=1;
 __delay_us (10);
 LATC2=0;

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

TMR1ON=1; // включение таймера
T1GGO=1; // запуск одиночного измерения

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

while(T1GGO)// ожидания окончания измерения
 {
    CLRWDT(); // сброс сторожевого таймера
    if(TMR1IF)
   {
      T1GGO=0;// останов измерения при переполнении таймера
      ERROR++;// подсчет количества измерений когда отсутствует эхо
   } 
 }

После выполнения измерения, останавливаем таймер:

TMR1ON=0;//остановить таймер

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

if(!TMR1IF)
 {
     // чтение регистров таймера
     pwm_reg=TMR1L;
     pwm_reg += TMR1H << 8;

// ФИЛЬТР устранения дрожания индикации при смене показаний "накапливающий интегратор"
 if(pwm_reg^pwm_regp && porog)porog--;
 else 
 {
    pwm_regp=pwm_reg;
    porog=2;
 }
 // преобразование в сантиметры длины
 // bin_dec (pwm_reg/58,2); // индикации "не отфильтрованного" сигнала
    bin_dec (pwm_regp/58,2);// индикация после фильтра
    ERROR=0;
 // индикация
    indic (dmil,miln,stys,dtys,tysc,sotn,dest,edin,6); // вывод значения на дисплей
 }
 else
 {
     // индикация отсутствия эха
     if(ERROR>4)indic (cM,cn,co,0,cE,ch,co,cM,0); // вывод значения на дисплей
 }

Примечание: для устранения “дрожания” показаний применим «накапливающий интегратор». За это отвечают строки:

// ФИЛЬТР устранения дрожания индикации при смене показаний "накапливающий интегратор"
 if(pwm_reg^pwm_regp && porog)porog--;
 else 
 {
    pwm_regp=pwm_reg;
    porog=2;
 }

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

__delay_ms (50);// формирования периода запуска сенсора

Выводы: Датчик обладаем широким углом захвата, поэтому его рекомендуется устанавливать над плоскими поверхностями на расстоянии не менее 10 мм. В связи с этим он захватывает отраженные импульсы от предметов которые находятся от его оси до ±15 грд., что необходимо учитывать при конструировании устройств. Реальная чувствительность не более 3 метров. На большие расстояния не хватает или мощности формируемого импульса или чувствительности приемника. Мое мнение – я считаю, что для таких модулей вывод измеряемого параметра в виде ширины импульса не практично, так-как получается два цикла измерения, первое это измерение делает модуль, второе контроллер. Для таких устройств желательно, что-бы все эти преобразования были выполнены в самом модуле. А на выходе формировать уже значение расстояния в виде готовых цифровых данных. А получать данные из модуля, удобно через последовательные интерфейсы I2C, SPI или UART.


Фото демо проекта

HC-SR04_11

HC-SR04_09


Видео демо проекта

__


Проект

Описание с изменениями V2.0


Это может быть интересно


  • PIC32MZ – прерывания (заметки)PIC32MZ – прерывания (заметки)
    Visits: 447 Виды формирования запоминая контекста при входе в прерывания. Компилятор представляет три варианта AUTO – когда запоминания места возврата из подпрограммы возложено на программу, т.е все создается программно. Этот …
  • Система AT команд версии V2.0 для ESP8266 и ESP32Система AT команд версии V2.0 для ESP8266 и ESP32
    Visits: 10150 Появление нового модуля на базе ESP32 заставило систематизировать систему AT команд, а так же систему обновления и для модулей на базе ESP8266. Начиная с версии v2.0 в ESP8266 …
  • Самый простой индикатор уровня звукового сигналаСамый простой индикатор уровня звукового сигнала
    Visits: 6212 Демонстрационный проект создания индикаторов уровня с использованием WS2812B. Изучив этот проект вы сможете  самостоятельно изготавливать и конструировать свои индикаторы уровня звукового сигнала. Дополнительно читайте статью Бегущие огни на …
  • PIC18 – модуль DMAPIC18 – модуль DMA
    Visits: 1152 Введение   Модуль прямого доступа к памяти (DMA) предназначен для обслуживания передачи данных непосредственно между различными областями памяти без вмешательства процессора. Исключив при этом необходимость в интенсивной  обработки …
  • ch-4060 – регулятор температуры и влажности на датчике DHT11/DHT22/AM2302ch-4060 – регулятор температуры и влажности на датчике DHT11/DHT22/AM2302
    Visits: 2408 На плате ch-4000 очень легко собрать устройство регулятора температуры и влажности. Датчик DHT11  самый недорогой вариант для создания такого устройства, правда точность его не велика, но для бытовых устройств …
  • MAX7219/21 и 8х8 LED дисплеиMAX7219/21 и 8х8 LED дисплеи
    Visits: 916 MAX7219, MAX7221 предназначены для вывода информации на 8 разрядов семисегментного индикатора, но на нем легко организовать вывод на светодиодные индикаторы 8х8. продолжение следует…. Это может быть интересно
  • MPLAB® Harmony – или как это просто! Часть 4.MPLAB® Harmony – или как это просто! Часть 4.
    Visits: 1968 Часть четвертая – это может показаться немного сложно. Структура проекта. Для облегчения конфигурирования проекты MPLAB Harmony обычно структурированы таким образом, чтобы изолировать код, необходимый для настройки «системы», от …
  • Проект с использованием MCC часть 06Проект с использованием MCC часть 06
    Visits: 1244 Изменим схему следующим образом добавим две тактовые кнопки BT1 и BT2. Теперь переключимся на конфигурацию выводов, для этого сделаем двойной клик в окне Ресурсы проекта на Pin Module. …
  • OLED RET012864E/REX012864JOLED RET012864E/REX012864J
    Visits: 1446 RET012864E/REX012864J ОЛЕД индикатор производитель Raystar-Optronics приобретался в http://www.microchip.ua/ к сожалению никакой информации на сайте поставщика нет. Поэтому решил работу с этой версией индикатора на драйвере SSD1305 предоставить на своем сайте. Так как …
  • Регулятор влажностиРегулятор влажности
    Visits: 1365 Регулятор ILLISSI-CH-1000 предназначен для контроля и регулировки относительной влажности в диапазоне от 0 до 100%. Регулятор позволяет работать как в режиме осушения, так и увлажнения. Для измерения возможно …



Поделись этим!