16.06.2015, 14:14 | #21 | |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Re: Ультразвуковой дальномер HC-SR04
Цитата:
|
|
16.06.2015, 17:42 | #22 |
Senior Member
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0 |
Re: Ультразвуковой дальномер HC-SR04
А время считывать через micros()? В целом, мысля может оказаться продуктивной, однако. В плане "количества возможных ног", а следовательно и датчиков...
|
16.06.2015, 18:24 | #23 | |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Re: Ультразвуковой дальномер HC-SR04
Цитата:
|
|
17.06.2015, 07:38 | #24 |
Senior Member
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0 |
Re: Ультразвуковой дальномер HC-SR04
Посмотрел, вроде "решаемый" вариант.
Кстати, почто во всех либах используется коэффициент пересчета в виде 58..59 при вычислении расстояний по величине задержки? На этот коэффициент приходится ДЕЛИТЬ (деления нет!). Предлагаю пересчитать на умножательный коэффициент и добавить его в Cyberlib, примерно так: 335 м/сек. - Это "средняя" скорость звука. = 335000 мм/сек. Звук у датчика бегает "туда и обратно", стало быть 1/2 = 167500 или 0.1675 мм/мксек. Далее. Таймер стандартно измеряет тиками по 4 мксек. 0.1675 * 4 = 0.67 и не надо переводить тики в микросекунды. Можно сразу смотреть сколько накапало напрямую в таймере и его переполнении. Число не "совсем круглое" для умножения. домножаем его на 512 и потом делаем сдвиг в право на 9 бит. Итого получим (67/100)*(512/512)=(67*5.12)/512 = 343>>9. То есть, если подсчитанное количество тиков таймера умножить на 343 (целое умножение!), а потом результат сдвинуть вправо на 9 бит - получим расстояние в миллиметрах без "делений" и вычисления "микросекунд" в таймере. Проверяем. Макс. расстояние этого датчика = 5м. = 5000*512 = 2 560 000 (в разрядную сетку long - лезет "с запасом"). 2560000/343 = 7463,5 тика таймера. В разрядную сетку счетчика переполнений таймера тоже лезет. 7463*4 = 29852 микросекунды, что для скорости 335м/сек дает расстояние 335 * (0,029852/2) = 5,00021 метра. Ошибка округления составила 0.21мм. Итого, вместо того, чтобы высчитывать "микросекунды", а потом делить мат. либой, вполне можно получить данные счетчика прерываний таймера (time_ovf_cont для wiring.c) и текущее значение TCNT0 и сделать следующее: /* запоминаем начало импульса эхи */ Dt = (time_ovf_count<<8+TCNT0); /* обработка конца импульса */ Dt -= (time_ovf_count<<8 + TCNT0); Distance = (Dt * 343) >> 9; Можно это втыкнуть куда-то в типовое место? P.S. Коэффициент можно предвычислять препроцессором для "разных" машинок и их тиков таймеров... P.P.S. Если учесть, что старшая часть сдвигается влево на 8 бит, а потом "все вместе" двигаем вправо на 9 ... то возможно что текущее значение TCNT0 и не нужно вовсе. P.P.P.S. Все-таки нужен и сам счетчик. Без него макс. ошибка составит 3.5% от дальности. Это - много. Последний раз редактировалось Arhat109; 17.06.2015 в 07:52. |
17.06.2015, 11:03 | #25 | ||
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Re: Ультразвуковой дальномер HC-SR04
Цитата:
Цитата:
|
||
17.06.2015, 14:39 | #26 |
Senior Member
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0 |
Re: Ультразвуковой дальномер HC-SR04
Мне только кажется, что целочисленное умножение и сдвиг - значительно дешевле вызова библиотечной функции "целочисленное длинное деление"?
|
03.08.2015, 17:19 | #27 |
Junior Member
Регистрация: 27.10.2014
Сообщений: 26
Вес репутации: 0 |
Re: Ультразвуковой дальномер HC-SR04
Не спец в программировании, но как "практик граблист" скажу что много раз натыкался на ошибки с делением, при том что вся математика указывала на возможность деления. Согласен, умножить и сдвинуть полезно было бы да еще и с прерываниями... давайте уж реализацию, не томите!!!
В Вашем (найденом на форуме) фильтре кстати который я применил часто выбрасываются именно нулевые измерения при том что нет препятствий, не исключено что это математика творит, а не железо. А если бы не приходилось измерять пять раз для более точного результата, а достаточно было бы одного! я бы мог гораздо больше и тщательнее просканировать! Последний раз редактировалось kulverstukas; 03.08.2015 в 17:22. |
03.08.2015, 17:56 | #28 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Re: Ультразвуковой дальномер HC-SR04
Сдвигом можно поделить только на кратное 2
|
03.08.2015, 22:55 | #29 |
Senior Member
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0 |
Re: Ультразвуковой дальномер HC-SR04
Делить сдвигом - да, можно только на кратно 2-ке. Но! Предварительно целочисленно умножить на нужное, так чтобы потом осталось только сдвинуть ... об этом и было "описание методы"
Выложу, как только вернусь ибо "в отъезде": готовый код и Ардуинка - дома, а восстановить по памяти и без возможности проверки кода - не возьмусь. Это случится не ранее начала сентября. |
08.02.2016, 19:46 | #30 |
Senior Member
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0 |
Re: Ультразвуковой дальномер HC-SR04
Собственно выложено уже давно в соседней теме: http://cyber-place.ru/showthread.php?t=1909
|
Здесь присутствуют: 16 (пользователей: 0 , гостей: 16) | |
|
|