Замер времени между срабатываниями датчиков
- Войдите на сайт для отправки комментариев
Вс, 08/01/2017 - 01:23
Всем привет, нужна не большая помощь в программировании аруины. Вобщем, есть 2 датчика, можно считать их хоть кнопками ибо они реагируют на событие и выдают либо 1 либо 0. Нужно засечь время между срабатыванием первого датчика и второго. Как это сделать, вообще не понимаю... Потом это все в массивчик закинуть, но думаю это я смогу уже прикрутить)
Буду безгранично благодарен тому, кто поможет :)
Ну, как минимум разрешить прерывания по изменению стотояния пинов порта куда подключены датчики, (лучше использовать пины одного порта), написать обработчк прерывания, в котором считывать стотояние millis() и вычилять разницу от предыдущего срабатывания.
PS: Если нужен скетч, то добропожаловать в "Ищу исполнителя" - где за небольшое вознаграждение откликнется куча желающих.
Скетч готовый я купить не могу, ибо это так сказать "проЭкт", так что тут я обязан сам писать...
Значит копать в сторону прерываний, спасибо тебе!
Для подобных задач хорошо подходит таймер в режиме захвата. Можно вообще прерывания не использовать.
http://arduino.ru/forum/programmirovanie/klass-titanovyi-velosiped-stopw...
Не можешь показать как это примерно выглядит? Я чет по поводу таймера в режиме захвата не могу найти столько инфы, сколько по прерываниям...
Ухты, то что нужно! Спасибо тебе огромное!
Для программирования ардуины нужны три вещи:milis() , millis() и еще millis().
Попробовал только что 2 предыдущих совета, ничего не получилось((
Попробую прерывания и millis()...
Спасибо большое! Только код сложноват для меня((
Попытаюсь из этого выделить "голую" функцию засекания времени...
Это же для механических кнопок, защита от дребезга. Тестовая программа.
В принципе я уже немного модифицировал, и уже есть результат. Осталось только убрать все лишнее, и понять принцип)
millis() это часы, но не человеческие(секунды, минуты,часы) , а машинные . Счет милисекунд (0,001 сек)от подачи питания или RESET. Одним датчиком "засекаешь время",а втором вычитает разницу между текущим и ранее засеченым. Ну там может быть от 1 милисек до 48 дней.
Это я понимаю, не на столько нуб. Я имею ввиду что мне нужен сам алгоритм засекания и вычитывания разницы, а потом вставить это в свой код, что бы обработать эти данные...
мне нужен сам алгоритм засекания и вычитывания разницы
А какой у Вас алгоритм засекания времени без компьютерной программы?
В момент первого события посмотреть на часты и записать время Т1. В момент второго события посмотреть на часы и записать время Т2. Затем из Т2 вычесть Т1 - получится время между событиями. Вы не знаете этого алгоритма?
Уже разобрался, всем большое спасибо! Что бы я без вас делал)
Всем привет! Такой вопрос еть два флага которые поднимаюстся сначала оди потом второй нужно замерять время между их срабатываниями частота срабатывания 50 герц . Прерывания использовать не желательно ибо ардуина и так загружена и прерывать ее нельзя. Мерять можно к примеру раз в 5 секунд.
Пробовал вот так но данные постоянно разные я так думаю проблема в том что все же нужно через прерывания ? Но может есть какоето другое решение ???
Я может чаго-то нежопонял, но если по условию
нужно замерять время между их срабатываниями частота срабатывания 50 герц .
То время, очевидно, 20мс - чего его замерять-то?
Или это у каждого флага 50Гц, а Вы хотите сдвиг фазы измерять? Поясните что нужно-то.
Фаз всего три нужно измерить время между первым и двумя на случай не правильной фазировки . Если не правильная фазировка время между флагами должно быть больше.
Время
А зачем время? Три входа, после првого смотрим кто раньше - в ту сторону и крутится поле. Время совсем не нужно.
Понятие "раньше" без понятия "время" не существует.
Истину глаголите.
Может чё посоветуете есть еще три цифровых входа которые считывают импульсы с каждой из фаз.
mag155, для замера интервалов между событиями по одному входу у мег есть "прерывание по захвату таймера" для 16-и битных таймеров. Используйте его для точного замера. Никакой "имитатор" не даст большей точности.
Если события приходят на разные ноги - то самое то использовать прерывания на них, опять же запуская счет таймера из прерывания по одной ноге и считывая показания с таймера по прерыванию с другой ноги.
Прерывания по захвату у ардуиновской Мега2560 есть только от двух таймеров 4,5 .. используйте Arduino Core или мою плату (Ардуино Мега + расширенная память, ссылку уже приводил Вам) если нужно больше таких прерываний..
Как это не существует? Ещё как существует! Проверяем наличие сигнала на одной или другой ноге. Если возник на первой - прямо крутится, если на второй - обратно. И где здесь время? Никаких упоминаний про вызов процедур времени нет. Если вы во вселенском масштабе - то да раньше позже по времени, но конкретно значение времени знать не надо. Нужен факт возникновения сигнала. В рамках поставленной задачи вашу реплику можно расценивать как попытку потролить. Ещё раз, для тех кто не догоняет. Есть два пути - получить время срабатывания двух событий и сравнить эти времена - тут без процедур времени не обойтись. Или просто ждать событие и по его приходу сразу принимать решение без получения и сравнения времени. В рамках поставленной задачи второе решение мне кажется более простым, точным и быстрым. Не нужно ждать второго события. Для вращения трёхфазного напряжения это может быть критичным.