Главная » Статьи » Proton PICBasic |
НЕМНОГО ТЕОРИИ
Я не буду переводить статью на русский язык. Я просто понял основные тезисы и попытался их воплотить в жизнь с помощью basic для pic микроконтроллеров, нескольких деталей и немного потраченного времени. В общем, как вам, наверное, известно, звук в определенных средах распространяется с определенной скоростью, как и свет. Зная эту скорость и то, что звук отражается от предметов, нас окружающих, мы можем очень просто вычислить расстояние до этих предметов. Для этого достаточно излучить звук в определенном направлении и посчитать время, прошедшее с момента отправки и до момента приема отраженного сигнала. Скорость распространения звука в воздухе, как наиболее приближенному к состоянию идеального газа равна: C= sqrt(Y*R*T) sqrt - корень квадратный Y - показатель адиабаты = 1,4 R - универсальная газовая постоянная = 286,9 T - температура газа, К = 273,16 Все это относится к измерениям в воздухе. Попробуем теперь вычислить, какова будет скорость распространения звука в простой, советской застройки, квартире. Температуру мы примем самую, что ни на есть домашнюю - 22° С Имеем: C=sqrt(1,4*(22+273,16)*286,9) = 344,31 м/с Вот так вот. Измерение расстояния не требует использования исключительно ультразвуковых волн. Это относится к звуку вообще. Но тот факт, что звук с высокой частотой имеет больший запас энергии и более направлен, и был определяющим в использовании именно ультразвука в таких экспериментах, а в дальнейшем и развития целого производственного направления (эхолоты, УЗИ, радары, парктроники и т.д.). В общем, речь тут идет об ультразвуке, как вы поняли. В статье речь вначале шла об отдельных элементах - излучателе ультразвука и приемнике. Далее был предложен более простой вариант, которым, собственно, я и воспользовался. А ТЕПЕРЬ ПРАКТИКА Это ультразвуковой приемопередатчик SR04. Как видно на фото, элемент имеет 4 ножки - плюс питания, ноль, триггер и эхо. Так вот, на вход Trig подаем импульс не менее 10 мкС, а по выходу Echo меряем длину пришедшего импульса, пропорционального расстоянию до объекта.
Его работу иллюстрирует следующий рисунок:
Для basic, как вы уже наверное, начали догадываться, эта задача является простой, как три копейки.
Итак, алгоритм:
1) Подаем импульс длиной 15 мкС на линию Trig
2) Ждем и считаем длину импульса, пришедшего с линии Echo
3) Преобразуем в расстояние
4) Отображаем длину
Исходя из того, что прибор для измерения длины должен быть портативно-переносным, было принято решение питать его от "Кроны", но только включать по обыкновенному переключателю, для экономии энергии. Сам приемопередатчик потребляет 15 мА (см документацию в приложенном архиве). Сколько потребляет PIC и дисплей по раздельности, я не догадался померить, но в среднем прибор потребляет 23 мА по моим наблюдениям. На сколько хватит довольно-таки старенькой батарейки, не знаю.
Плату делал, как обычно (травил, правда, не сам).
В архиве имеется проект протеуса с разведенной платой в ARES. Разводку делал под коробку G407. Просто они у нас продавались вроде как более или менее симпатичные. Если вы помните, бесконтактный тахометр сделан в такой же коробке.
Применить решил микроконтроллер PIC16F628A, исключительно от того, что он давным давно лежит заброшенный и никому не нужный в дальнем углу стола. Все ждал своего часа. Поскольку времени, как обычно, ни на что не хватает, то делал я девайс урывками. Вначале были амбициозные планы по внедрению меню с выбором и запоминанием единиц измерения, количества сэмплов для усреднения точности, включения и выключения подсветки и т. д. и т. п. Но потом передумал, поскольку решил, что это растянется еще на неопределенный срок и решил выложить основную суть. Принцип измерения длительности входящего импульса основан на подсчете количества импульсов внутреннего генератора, который работает от фронта до среза входного измерительного импульса. Длительность этих импульсов нам известна, так как известна тактовая частота микроконтроллера. Вот сложив эти импульсы, мы и получим длительность импульса, пропорциональную расстоянию до объекта. Остается лишь подобрать коэффициент пропорциональности. Проблема лишь в том, что подсчет может начинаться с запаздыванием относительно фронта входного импульса, а может и совпадать с ним. Отсюда мы имеем некоторую погрешность. Но, как показывают наблюдения, погрешность в ±3 мм не столь критична для домашнего использования. Естественно, точность измерения напрямую зависит от тактовой частоты микроконтроллера. Чем она выше, тем более высоким разрешением обладает механизм измерения.
К тому же, совершенству нет предела, и всегда существует возможность улучшить точность измерения. Все в ваших руках!
Предлагаю ознакомиться с программой:
Код
'-------------------------- Описание проекта --------------------------------- 'Проект : My_Project 'Автор : Анисимов М.А. ----------------------- Опции компилятора -------------------------------- Declare SHOW_SYSTEM_VARIABLES = OFF ' При симуляции в Proteus не показывать внутренние переменные Declare FSR_CONTEXT_SAVE = On ' Заботиться о сохранении содержимого регистра FSR Declare Reminders = OFF ' Выключить напоминания компилятора Declare Warnings = OFF ' Выключить предупреждения компилятора Declare Optimiser_Level 3 ' Включить оптимизацию программы ;-------------------------- Общие настройки------------------------------------ Device = 16F628A Config FOSC_HS, WDTE_OFF, PWRTE_ON, MCLRE_OFF, BOREN_OFF, LVP_OFF, CPD_ON, CP_ON ;------------------------------------------------------------------------------- Xtal = 20 ' Частота осциллятора 4 МГц '-------------------------- Настройки подключения ЖКИ ------------------------ Declare LCD_Type ALPHA ' Тип ЖКИ - буквенно -цифровой Declare LCD_DTPin PORTB.4 ' Порт данных ЖКИ Declare LCD_ENPin PORTB.2 ' Управление линией E Declare LCD_RSPin PORTB.1 ' Управление линией RS Declare LCD_Interface 4 ' Разрядность шины данных Declare LCD_CommandUs 2000 ' Задержка перед посылкой команды Declare LCD_DataUs 50 ' Задержка перед посылкой данных Declare LCD_Lines 2 ' Количество строк ЖКИ '-------------------------- Настройки портов --------------------------------- Declare PortB_Pullups = OFF ' Выключить подтягивающие резисторы на PORTB Declare All_Digital = On ' Установить все порты цифровыми входами/выходами '-------------------------- Регистры специального назначения------------------- Symbol INTF = INTCON.1 ' Флаг внешнего прерывания INT Symbol T0IF = INTCON.2 ' Флаг переполнения TMR0 Symbol INTE = INTCON.4 ' Бит разрешения прерывания по PORTB.0(INT) Symbol T0IE = INTCON.5 ' Бит разрешения прерывания по переполнению TMR0 Symbol GIE = INTCON.7 ' Бит глобального разрешения прерываний '-------------------------- T1CON --------------------------------------------------- Dim RANGE As Float ' Переменная для измеренного расстояния Dim Adv As Dword ' Промежуточная переменная для приема данных Dim EdArr As Byte ' Переменная для отображения текущих единиц измерения Dim EdIzm As Bit ' Текущая единица измерения (мм или см) Symbol Koeff = 29.0 ' Коэффициент для расчета расстояния Symbol ECHO = PORTA.1 ' Линия приема данных Symbol TRIGGER = PORTA.3 ' Линия запуска измерения Symbol Light = PORTA.2 Symbol ModeBtn = PORTB.0 TRISB = %00000001 ' Порт В.0 - под кнопку TRISA = %00000010 ' Порт А.1 - на вход CMCON = %00000111 'Отключим компараторы OPTION_REG = %10000111 EdIzm=0 Light = 1 'Включим подсветку дисплея DelayMS 100 Cls 'Очистим дисплей On_Interrupt GoTo IntLabel 'В случае нажатия кнопки переход на IntLabel INTE = 1 'Разрешим прерывание по входу INT GIE = 1 'для изменения единиц измерения GoTo main IntLabel: Context Save If INTF=1 Then 'Если была нажата кнопка INTF = 0 EdIzm = ~EdIzm 'то изменим единицы измерения EndIf Context Restore '-------------------------- Главная программа ------------------------- TRIGGER = 1 'Подаем команду на измерение расстояния DelayUS 15 'Ожидаем 15 мкС TRIGGER = 0 Adv = PulseIn ECHO,High 'Считаем длину пришедшего импульса DelayMS 10 Return main: If EdIzm = 0 Then EdArr = $63 'Буква "c" Else EdArr = $BC 'Буква "м" EndIf Print At 1, 1,$A5,$B7,$BC,$2E,EdArr,$BC,": " 'Изм.мм:' Print At 2, 1, Dec1 RANGE," " ' Печатаем на дисплей расстояние GoSub Take RANGE = Adv/Koeff 'Расчет расстояния(коэффициент подбирается) RANGE = RANGE + 12.8 ' Прибавляем длину коробки If EdIzm = 1 Then RANGE =RANGE * 10 ' Если единицы измерения - мм, то умножаем результат на 10 EndIf DelayMS 500 ' Задержка для отображения GoTo main Как видите, в программе используются прерывания по входу INT для переключения единиц измерения.
В приведенной статье приводятся некоторые моменты, относящиеся к усреднению результата. Но, это, скорее, не усреднение,а какая-то качественная выборка, наверное. Не знаю, как назвать это. Думаю, удобнее будет усреднять результат старым дедовским способом - две выборки сложить и поделить на два. Можно и больше, естественно. Нужно учитывать при этом, что время измерения увеличивается с увеличением количества выборок.
Такой вот получился у меня аппарат Елизарова :)
Если немного пофантазировать, то можно найти много применений такому устройству.
Вот я думаю, например: у меня на блюберде нет парктроника. Может сделать? А то заднее затонировано по нижнему краю, да зад поднят. Плохо видно в зеркало, когда задом пятишься. А так бы какая была бы помощь при разворотах и парковке.
Тут вам, собственно, карты в руки.
И, наконец, самое интересное!
Я решил закинуть удочку и попытаться втянуть вас в процесс озеленения сайта. Если кого-то заинтересовало такое устройство, то, наверняка захочется где-то раздобыть приемопередатчик HC-SR04.
Дело в том, что у меня их есть, но с целью стимулирования интереса хотелось бы объявить что-то типа конкурса на интересную статью для нашего сайта.
В общем, правила, будут такими:
1) Статья должна быть интересной, с фотографиями, желательно красиво оформленной (если не получается, ко мне обращаемся).
2) Конкурс длится 1 месяц.
3) Все статьи, добавленные за этот месяц, рассматриваются и принимается решение о победителях.
Призы будут самыми разнообразными:
1 место - HC-SR04 - 3 шт
2 место - HC-SR04 - 2 шт
3 место - HC-SR04 - 1 шт
Все просто. Лично вышлю каждому победителю обещанную награду.
В общем, думайте, повторяйте, спрашивайте, если что непонятно.
Компрессоры Magnus https://generator-kom.ru/catalog/kompressory/kompressory-magnus/ представляют собой устройства промышленного назначения. Модели от марки Magnus собраны по индивидуальной комплектации и характеризуются надежностью, экономичностью. Установки используются для различных задач, где требуется непрерывно доставлять сжатый воздух пневматическим системам. | |
Просмотров: 11691 | Комментарии: 12 | | |