Скорость считывания и обработки аналоговых входов.

Вячеслав79

✩✩✩✩✩✩✩
26 Сен 2022
5
0
День добрый.
Есть задача,в которой нужно анализировать аналоговый сигнал, причем делать это быстро.
Вкратце - анализировать отражения света вращающегося объекта.
По моим расчетам время опроса должно быть не выше 50 микросекунд, в идеале около 20. Реально ли это реализовать на ардуино или подобных платах?
Сам алгоритм обработки пока не трогаем, интересует именно скорость железа.
 

Вячеслав79

✩✩✩✩✩✩✩
26 Сен 2022
5
0
Можно с потерей точности
Высокая точность не требуется. Достаточно определить в каждый момент времени, превышает ли сигнал заданную величину. А дальше уже анализировать массив срезов.
Когда Вы пишете, что можно, имеется ввиду любая Ардуино плата типа Uno 16 Mhz или более мощные аналоги? Знаю, что такие есть, но не вникал.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44
Достаточно определить в каждый момент времени, превышает ли сигнал заданную величину.
Если сравнивать нужно с заранее заложенной величиной, то не лучше ли для этого компаратор поставить?
 
  • Лойс +1
Реакции: DAK

te238s

★★✩✩✩✩✩
14 Ноя 2021
374
97
Либо настройку порога и аналоговую схему собрать на дискретных элементах. А на мк будет приходить только 0 или 1.
 

Вячеслав79

✩✩✩✩✩✩✩
26 Сен 2022
5
0
Избыточное цитирование. Отредактируй или сообщение будет удалено
Спасибо всем за ответы. Я не совсем четко выразился. Да, в каждый момент времени нужен только срез. Но потом массив этих срезов все-таки нужно анализировать.
Расскажу про задачу, чтобы было понятнее. Если возьмете в руки стеклянную бутылку, то ближе к дну скорее всего найдете 9 точек, расположенных на определенном расстоянии друг от друга. В этих точках зашифрован код. Собственно нужно ловить отражения во время вращения, чтобы по всплескам распознать код. Сейчас это работает на электронных платах, но в связи с ситуацией нужно оперативно это импортозаместить )
Я сам занимаюсь ПЛК и машинным зрением, но скорости обработки аналоговых входов ПЛК для этого недостаточно, а машинное зрение дорого.
Поэтому хотя бы как временное решение можно использовать ардуино.
И главный вопрос - именно скорость считывание аналогового входа.
Логика распознавания кода там не сложная, даже ардуино справится.

Можно ускорить чтения используя делитель.
Вот вроде в этом видео есть про него (в районе 3-ей минуты)
Спасибо! Хотя я не понял, почему автор сначала говорит, что нужно разделить на 128, чтобы попасть в диапазон, а потом предлагает в несколько раз ускорить.
 

poty

★★★★★★✩
19 Фев 2020
3,230
940
"Скорость считывания" можно сделать хоть 1МГц (с существенным падением точности)/пин. Только что с этими значениями делать? При частоте 16МГц между получениями отсчётов проходит всего 16 тактов процессора, грубо - простейших команд (на всех Atmega, основанных на 328p серии, например, нано). Из этого количества 12+ тактов будет отдано лишь на обслуживание прерывания. На оставшемся "функционале" ничего не построить.
50мкс уже более реальная вещь, но если будет работать постоянно, то тоже мало поможет. Такой режим хорош, если есть чёткое выделение интервала сканирования, после которого некоторое время выделяется на обработку.
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
374
97
Так. Давайте определимся. 20мкс это время прохода одной точки на бутылке? С какой она скоростью вращается?
Просто в режиме непрерывного преобразования при 16МГц,как сказал
@poty,при небольшой точности,имеем 1мкс на цикл преобразования. Дабы избежать сопутствующих потерь скорости,делаем:
1)по прерыванию откуда либо,запускаем АЦП
2) каждые 16мкс пишем результаты в память,по заранее известной продолжительности "прохода" всего кода бутылки
3) спокойно обрабатываем полученный массив

Думаю это на Си можно реализовать даже, с ассемблерными вставками.

почему автор сначала говорит, что нужно разделить на 128, чтобы попасть в диапазон, а потом предлагает в несколько раз ускорить.
АЦП по даташиту на атмелах имеет оптимальную рабочую частоту от 50 до 200кГц. При этом достигается максимальная точность.
16МГц/128=125кГц
 

Вячеслав79

✩✩✩✩✩✩✩
26 Сен 2022
5
0
Избыточное цитирование. Отредактируй или сообщение будет удалено
Так. Давайте определимся. 20мкс это время прохода одной точки на бутылке? С какой она скоростью вращается?
Просто в режиме непрерывного преобразования при 16МГц,как сказал
@poty,при небольшой точности,имеем 1мкс на цикл преобразования. Дабы избежать сопутствующих потерь скорости,делаем:
1)по прерыванию откуда либо,запускаем АЦП
2) каждые 16мкс пишем результаты в память,по заранее известной продолжительности "прохода" всего кода бутылки
3) спокойно обрабатываем полученный массив

Думаю это на Си можно реализовать даже, с ассемблерными вставками.
В режиме максимальной скорости на вращение уйдет примерно 50 миллисекунд, потом 50 миллисекунд ожидание следующей бутылки, то есть есть 50 мсек на обработку. Это опять такие максимальная скорость, обычно процентов на 30-50 медленнее, то есть время на обработку будет.

Чтобы более менее четко распознавать точки, и промежутки между ними, нужно сканирование примерно каждые 0,2 мм. При диаметре бутылки 65 мм длина окружности около 200. Итого примерно 1000 измерений на одну бутылку. Отсюда я и вывел 50 мксек. 20 наверное все-таки не понадобится.

В общем я понял, что в принципе все реально. Мне нужно собрать стенд с железом, чтобы начать получать какие-то результаты, а затем обратиться сюда в поисках исполнителя. Как буду готов, выложу в отдельной теме. Или просьба писать сразу в личку, кто чувствует в себе силы взяться за решение этой задачи. Оплата будет адекватная, в десятках тысяч руб.
И всем спасибо за ответы, внимательно отнесся к каждому сообщению.
 

poty

★★★★★★✩
19 Фев 2020
3,230
940

@Вячеслав79, не знаю, какая точность требуется, но, допустим, 8 бит будет достаточно. 50мс потребуется для снятия данных (и это займёт 1000 байт памяти, это нужно учитывать при выборе МП), плюс потребуется время на обработку и последующую передачу данных на головное устройство. Потенциально выполнимая задача, но потребует серьезной оптимизации кода.
 

Вячеслав79

✩✩✩✩✩✩✩
26 Сен 2022
5
0
@poty,
В любом случае работа займет как минимум два этапа.
1 - Создание базовой версии и проверка физической возможности считывания и обработки на такой скорости.
2 - Оптимизация, ускорение, по возможности более сложная обработка.
Так что пока задача чтобы были какие-то результаты, а дальше будем допиливать )
У меня есть Uno для тестов, буду делать стенд.
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
374
97
Для ускорения ещё вариант брать МК на частоту 20МГц,например тини2313 или подобное. Но это выходит за рамки Ардуино.