Хватит ли мощности железа для точного измерения времени?
- Войдите на сайт для отправки комментариев
Появилась необходимость в создании некого устройства (измеритель скорости реакции) которое фиксирует сигнал от фотодатчика, после чего ждет нажатия кнопки. Вычисляет время между входящим сигналом от фотодатчика и нажатием кнопки, после чего неспешно передает данные во внешний компьютер.
В общем то все просто. если бы не точность измерения времени. Диапазон измеряемых величин от 100 до 500 миллисекунд, необходимая точность 100 микросекунд. (Средние получаемые результаты 155 миллисекунд, 156 миллисекунд, 170 миллисекунд и т.д.). Также осложнение в том, что кнопок четыре, т.е. опрашивать нужно 4-ре ноги и фиксировать данные срабатывания каждой.
Соответственно вопросы:
Хватит ли ардуиновской частоты 16 МГц на необходимое разрешение при вычислении времени ?
Какова точность встроеного ардуиновского тактового генератора (насколько я понимаю, температурной стабилизации там нет) или нужно делать выносной ?
Как будет работать ардуино если произойдет одномоментное срабатывание двух и более кнопок, какой результат она будет отрабатывать быстрее, скажется ли вычисление времени от срабатывания одной кнопки на вычисление результатов от другой ?
С какими проблемами тут еще можно столкнуться или я зря беспокоюсь и все значительно проще ?
Просто по моим прикидкам вычисления будут производиться на грани возможности ардуинки, отсюда и возникшие вопросы. Может кто уже сталкивался с подобной проблемой ?
Viblis, для результата точностью +/- 100µS вам вообще не о чем волноваться, тем более о температурной стабилизации. Всё остальное зависит от того, как Вы напишите программу.
Viblis - аппаратных возможностей ардуино на эту задачку хватит с огромным запасом - весь вопрос только в том, сумеете ли вы написать достаточно быстрый код
Viblis - аппаратных возможностей ардуино на эту задачку хватит с огромным запасом - весь вопрос только в том, сумеете ли вы написать достаточно быстрый код
Код наверное нужно писать на аcсемблере ?
Код наверное нужно писать на аcсемблере ?
Чтобы подружится с местными - только на ассемблере. А если такой цели нет, то можно и на нечестном Си.
Viblis - аппаратных возможностей ардуино на эту задачку хватит с огромным запасом - весь вопрос только в том, сумеете ли вы написать достаточно быстрый код
Код наверное нужно писать на аcсемблере ?
если из портов напрямую читать, можно и на С. если через богомерзкий digitalRead(), то кварц перепаять на 200 МГц.
то кварц перепаять на 200 МГц.
Достаточно просто перепаять кварц на плате и ардуинка заработает на 200 Мгц ? К примеру китайская UNO то же заработает ?
Или же может вообще DUO выбрать на 84Мгц ?
Код наверное нужно писать на аcсемблере ?
Код нужно писать на том, на чём Вы умеете писать (если Вы, конечно не профи, которому всё равно чём писать).
то кварц перепаять на 200 МГц.
Достаточно просто перепаять кварц на плате и ардуинка заработает на 200 Мгц ? К примеру китайская UNO то же заработает ?
Или же может вообще DUO выбрать на 84Мгц ?
вы вообще шуток не понимаете? нафига там 200 МГц?
Ваша задачка - детского уровня, с ней легко справится ардуина на 2-4 МГц. не токмо 16.
Ассемблер не обязателен, можно и Си быстрый код написать.
К примеру китайская UNO то же заработает ?
Только если кварц возьмёте китайский. А если кварц оригинальный, то и Uno оригинальная нужна.
вот тут задачка немного посложнее обсуждалась, но идею можно зацепить из нее
TC, поищите , на форуме есть тема про хронометр , измеритель скорости пули.
TC, поищите , на форуме есть тема про хронометр , измеритель скорости пули.
Спасибо, таких тем на форуме несколько, там ответы на все вопросы.
Почему считает с большим разбросом?
Провожу вот такой эксперемент.
Беру первую плату ардуино UNO Ее задача генерировать импульсы между которыми будет 150 миллисекунд. Для этого пишу простенкий скетч:
Беру вторую плату ардуино UNO, ее задача вычислить время между импульсами генерируемыми первой платой. Заливаю туда вот такой скетч:
Соединяю платы между собой. Подключаю монитор порта ко второй плате. Разброс милисекунд в мониторе от 148 до 151 милисекунды.
Это очень маленькая точность. Мне же в создаваемом приборе нужна точность минимум 100 мксекунд.
Что делать, не пользоваться встроеными функциями и начинать изучать ассемблер или может попробовать осуществить подсчет на прерываниях?
думаю, главная причина - низкая точность осйилляторов на платах ардуино. То, что на одной плате 150мс, на другой вполне может быть и 148 и 151 - это совершенно нормально.
Если бы было к примеру постоянно 148 или 151 это было бы вполне нормально, это можно откалибровать, хуже то, что цифры скачут от 148 до 151, т.е. частота непостоянна и на нее нельзя опираться при вычислении
Сколько времени у Вас прохожит между digitalWrite(8, LOW); и digitalWrite(8, HIGH);? На приёмнике всё успевает сработать? Не хотите там delay поставить и с ним попробовать?
Да уж, это не доли микросекунд ловить )))
Да, и строка 12 первого скетча должна выглядеть так
Сколько времени у Вас прохожит между digitalWrite(8, LOW); и digitalWrite(8, HIGH);? На приёмнике всё успевает сработать? Не хотите там delay поставить и с ним попробовать?
Евгений, мне кажется дело не в этом. Все проще. Автор пользуется millis() - инструментом с точностью в 1мс. Измерений два - первом измерении ошибка +/- 1мс, и так же при втором. Потом эти два значения вычитаются одно из другого - и точно в соответсвии с теорией измерений ошибка получается +/- 2мс
Чтобы иметь точность в 0.1мс, нужно мерить время не хуже +/- 50мкс. Как вариант - использовать micros
Чтобы иметь точность в 0.1мс, нужно мерить время не хуже +/- 50мкс. Как вариант - использовать micros
Спасибо за идею. Стало значительно точнее.