Перейти к содержанию
    

Можно ли удешевить (40-60 каналов АЦП 300-1000КС/с и обработка)?

Добрый день,

у меня есть задачка, в которой мне надо много каналов одновременно оцифровать и обработать. Много - это 40-60 каналов, в каждом сигнал, с гармониками по большей частью не выше 80кГц, оцифровывать надо хотя бы на 320КС/с, но, чем больше, тем лучше. Более того, все это надо сразу обрабатывать.

У меня есть решение, которое не сильно нравится, но уже работает:

23 штуки двухканальных ADC122S101CIMM, которые все впараллель воткнуты в esp32. На нем на gpio ручками на одном ядре реализован параллельный SPI (на 23 шины). На выходе с этого ядра в память непрерывно пишется 46МБайт/с данных (точнее 23МБайт/с, так как мне нужна только разница между измерениями во времени, а она как раз всегда в один байт вписывается, поэтому я 12 бит на лету в 8 бит разницы преобразую).

Другое свободное ядро этой esp32 еле-еле справляется обрабатывать эти данные. Решение не дешевое получается, так как эти оцифровщики стоят около 4 евро за каждый, что суммарно делает бюджет системы около 100 евро.

Мне хочется что-то другое, чтобы:

1. было дешевле при тех же скоростях снятия данных и наличии свободных 200мфлопсов на обработку того, что пришло,
2. занимало меньше места на плате, так как 23 штуки этих оцифровщиков с esp32 суммарно занимают почти пол дециметра платы,
3. была возможность увеличить число каналов до 60, а лучше 80.

PS1: Синхронность прихода данных важна, то есть нельзя каналы друг от друга рассинхронизовывать.
PS2: Могу отказаться от 12 бит вплоть до 8 бит, если на каждом канале будет усилитель на 25 dB, у которого можно менять на лету коэффициент усиления.
PS3: про Котельникова знаю, при оцифровке на меньшей частоте (около 160КС/с, а не от 320КС/с) теряется много существенной информации и получается не то, что хочется.
PS4: про жирные STM32 думал, вроде три канала по 4МС/с и куча мультиплексоров должны дать мне возможность оцифровать примерно 36 каналов, но - мало, и не факт, что мультиплексер в STM32 хорошо переключается каждый АЦПшный такт с одного канала на следующий по кольцу.

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Аудиокодеки вам в помощь. Как раз 300 с хвостиком килогерц. 24 бита. И в одном кодеке может быть много много ацп. Порядка 6 каналов. Стоят недорого.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

LPC4370 + 2 x ADG732 = 64 канала x 12бит x 1.25МГц

LPC4370 + 3 x ADG732 = 96 каналов x 12бит x 800кГц

 

5 hours ago, iiv said:

23 штуки двухканальных ADC122S101CIMM

у тексаса же есть мелкие армы MSPM0C1103, с более быстрым АЦП внутри, только стоят на порядок дешевле. в 2х2мм копрусе и их пожалуй ещё можно по паре штук daisy-chainить, последовательно в один "сдвиговый регистр".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, _pv said:

LPC4370 + 2 x ADG732 = 64 канала x 12бит x 1.25МГц

LPC4370 + 3 x ADG732 = 96 каналов x 12бит x 800кГц

да, классно, спасибо огромное, я чувствовал, что есть такое решение, но сам не нашел.

 

3 hours ago, _pv said:

у тексаса же есть мелкие армы MSPM0C1103, с более быстрым АЦП внутри, только стоят на порядок дешевле.

Спасибо!!! Правда АЦПшка 1.5МГц! Круто! Я не думал, что за такие деньги такое бывает. Но вот как с него данные вытаскивать? Он же по SPI только 12МГц умеет, то есть если я 3 канала на 500КС/с каждый поставлю, то у меня будет около 37-40 бит трафика, то есть мне надо 20МГц SPI, а все остальные решения еще большей скорости потребуют.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, iiv сказал:

да, классно, спасибо огромное, я чувствовал, что есть такое решение, но сам не нашел.

LPC4370 конечно хорош, только непонятно как вы такой поток данных из него вытаскивать будете? При работе АЦП на 80MS/s даже через DMA даже с упаковкой двух сэмплов в одно 32-битное слово, там загрузка шины/ОЗУ близка к 100%. И одно дело - захватить какое-то кол-во сэмплов, остановить АЦП и потом неспешно их обрабатывать. Но вам наверное нужен непрерывный realtime поток? (об этом в заглавном посте ни слова) На макс. sample rate скорее всего у LPC4370 уже не хватит скорости куда-то выдать наружу такой поток. Но даже при меньшем sample rate (80*0.32 = 25.6 MS/s) надо ещё посмотреть - хватит ли ресурсов на какую-то realtime обработку. Так как ~8 тактов на сэмпл - имхо маловато для любой обработки (на ARM).

 

Имхо: Такие требования (80*0.32 = 25.6 MS/s) с постобработкой - ставят крест на любых Cortex-M. В качестве обработчика, я бы смотрел на DSP типа OMAP-L137 или подобные. АЦП там нет, но для подключения внешних АЦП есть богатый набор возможностей: от McASP-интерфейсов до двух PRU-ядер. Я в своё время подключал к нему 3шт. 8 канальных АЦП (на McASP-порт) и ещё оставалось много места для подключения чего-то ещё. А уж возможностей по мат.обработке у него - кратно больше чем у Cortex-M.

Как альтернатива (чтобы без BGA) - можно взять только DSP-часть, а не весь OMAP: TMS320C6745. Там DSP+2xPRU.

В качестве АЦП наверное можно использовать кодеки, предлагавшиеся выше. Если подойдут по частоте. И могут на этой частоте все каналы одновременно выдавать наружу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, _pv сказал:

LPC4370 + 3 x ADG732

Во-первых, мультиплексор медленный, поэтому нужен каскадный, а во-вторых, чем не устраивает голый АЦП, какой-нибудь AD9629?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Plain said:

Во-первых, мультиплексор медленный, поэтому нужен каскадный, а во-вторых, чем не устраивает голый АЦП, какой-нибудь AD9629?

Там ещё свой мультиплексор /3 или /6 достаточно быстрый есть, а уже с оставшимся 10МГц этот медленный мультиплексопр вроде справится. ну и это просто как пример, можно и побыстрее мультплексоры найти, правда  скорее всего не 1:32 и действительно в два слоя.

Ну и iiv ещё как раз пару сотен дополнительных мипсов для обработки хотел, разность посчитать. К тому же 60-80МГц х 12 бит в ESP32 вроде не залазят, там какие-то грабли были с их параллельным "i2s" портом на максимальных скоростях, хотя в более новых может и поправили уже. Однако можно и цифре 12:24 параллельный порт АЦП демультиплексировать, сейчас же через 23 битную "шину" у него все данные как-то пролазят.

8 hours ago, iiv said:

Но вот как с него данные вытаскивать? Он же по SPI только 12МГц умеет

Да, действительно. Я думал они периферию в эти мелкие армы частично ещё с msp430 тащат, только ядро поменяв, а там spi на максимальной частоте вроде умел работать. Но тогда да, по скорости только пара каналов  в один spi влезут, можно кем-то ещё собирать по несколько штук в один интерфейс побыстрее. Но даже как 1-1 замена внешнему 2х канальному spi АЦП, при цене 0.1$/канал, но с дополнительным геморроем в виде необходимости программирования флэша, наверное имеет право на жизнь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, _pv said:

там какие-то грабли были с их параллельным "i2s" портом на максимальных скоростях

там с i2s действительно засада, но там можно прочитать/записать содержимое 32-х битного порта за 12 процессорных тактов (то есть за 50нс). Не много конечно, но если точно угадать 16 таких чтений, а вместе с этим запустить посылку одного пакета на 16 бит по SPI, то как раз жонглируя задержками можно вытащить 16 раз слово как-будто оно ехало по параллельному SPI по скорости около 16МГц. SPI надо положить на другой порт, иначе все идет юзом. Если во время жонглирования задержками также подумать поочередно перетассовывать битики, то все приехавшие 16 слов по 32 бита можно получить в том виде, что надо, то есть в виде 16 слов по 16 бит уже правильной ориентации. Далее я считаю только разность и сохраняю ее в память в виде уже однобайтогого со знаком.

 

EDIT: дополню, что трюк с 8 битами - тоже не с проста, так как у esp32 память не на столько шустрая, что если одно ядро пишет в память на 46МБайт/с, то второе уже на такой скорости прочесть не может, но если писать и читать на в два раза меньшей скорости, то все получается.

 

В этом приеме данных второе esp32 ядро совершенно не принимает участие, и вот оно-то как раз и обрабатывает получаемые мной 46 байт приходящие каждые 2 микросекунды и, развивая примерно 200МФлоп/с решает то, что мне надо. Я понимаю, что именно для этой конфигурации я все вылизал, но теперь захотелось чего-то большего, вот я тему и поднял.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 минут назад, iiv сказал:

там с i2s действительно засада, но там можно прочитать/записать содержимое 32-х битного порта за 12 процессорных тактов (то есть за 50нс). Не много конечно, но если точно угадать 16 таких чтений, а вместе с этим запустить посылку одного пакета на 16 бит по SPI, то как раз жонглируя задержками можно вытащить 16 раз слово как-будто оно ехало по параллельному SPI по скорости около 16МГц. SPI надо положить на другой порт, иначе все идет юзом. Если во время жонглирования задержками также подумать поочередно перетассовывать битики, то все приехавшие 16 слов по 32 бита можно получить в том виде, что надо, то есть в виде 16 слов по 16 бит уже правильной ориентации. Далее я считаю только разность и сохраняю ее в память в виде уже однобайтогого со знаком.

Имхо - не реально успеть всё это делать при потоке = 80*.32 = 25.6 MS/s. Пускай там и 2 ядра по 240МГц. Бесперспективная затея. Нужно смотреть в сторону более производительной системы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, jcxz said:

Имхо - не реально успеть всё это делать при потоке = 80*.32 = 25.6 MS/s. Пускай там и 2 ядра по 240МГц. Бесперспективная затея. Нужно смотреть в сторону более производительной системы.

у меня то, что мне надо именно так считается. Мне надо из этих 46 потоков получить попарные скалярные произведения, около сотни таких произведений. Это требует около 100МФлопс, с которыми одно ядро esp32 успешно справляется, а по памяти это требует только 100 чисел по 32 бита. По прошествии нескольких миллисекунд, я эти числа по компорту во внешний мир отправляю.

 

Основная моя проблема - невозможность скалирования моего решения (а хочется больше), большая площадь получаемого решения (пол дециметра) и довольно большая дороговизна (около 100 евро).

4 hours ago, Plain said:

AD9629

не, тогда лучше с теми же мультиплексорами сразу AFE5401Q1 поставить, у него усилитель на входе есть, но тогда надо будет все это на плиску заводить, типа GoWin. В принципе, по цене те же 100 евро будет, но можно хоть до 128 каналов доскалировать. Идея наверное правильная, спасибо! Правда существенно более хлопотная.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

33 минуты назад, iiv сказал:

у меня то, что мне надо именно так считается. Мне надо из этих 46 потоков получить попарные скалярные произведения, около сотни таких произведений. Это требует около 100МФлопс, с которыми одно ядро esp32 успешно справляется, а по памяти это требует только 100 чисел по 32 бита. По прошествии нескольких миллисекунд, я эти числа по компорту во внешний мир отправляю.

 

Основная моя проблема - невозможность скалирования моего решения (а хочется больше), большая площадь получаемого решения (пол дециметра) и довольно большая дороговизна (около 100 евро).

Вообще ничего не понятно.... То пишете, что нужно 60...80 потоков при .32 MS/s минимум, то о каких-то 46 потоках говорите. И при чём тут MFLOPS-ы? Вы обработку делаете в плавучке? Если так - то тем более не должно хватать времени. Так как одно ядро ESP32 вроде умеет только 240 MFLOPS (по мнению чата-ГПТ, в доке никаких данных нет). А если даже читать параллельно с 32-битного порта сразу 2 или 3 сэмпла (тратя на это аж 12 тактов! на каждое чтение), то потом их нужно ещё разделить на отдельные сэмплы, перевести во float и что-то с ними сделать (перемножить/просуммировать). Сделать опять-же - видимо объединив с какими-то накопленными данными в ОЗУ(?), а значит прочитав их оттуда и потом сохранив (не в регистрах же CPU вы всё храните). Всё это требует тактов CPU. А их всего-то: 240/(80*.32) = 9.375 такта на сэмпл (на одно ядро). Не должно хватать.

В целочисленке ещё можно использовать команды обрабатывающие сразу по 2 16 битных значения (в 32-битном слове). (если таковые есть у ядра ESP32). Но с плавающей точкой таких команд у ESP32 вроде как нет.

А ещё нужно как-то успевать делать синхронизацию с внешними АЦП (а не просто читать готовые сэмплы с порта).

 

PS: Вобщем - с такими исходными данными думаю - ничего внятно посоветовать невозможно...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

42 minutes ago, jcxz said:

Вообще ничего не понятно....

другим участникам этой дискуссии вроде все понятно, а вам, как всегда нет. Вам же и в куче других моих тем тоже не понятно было, и у вас всегда ко мне один и тот же совет - взять камень по толще, подороже. Но не об этом тема, поймите, пожалуйста!

14 hours ago, _pv said:

MSPM0C1103

не могу понять, скажите, пожалуйста, а у него даже Slave SPI нет? В доке только про обычный, не слейв SPI. Так бы три канала на 320КС/с еле-еле бы влезало бы если по 12МГц SPI.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

26 minutes ago, iiv said:

не могу понять, скажите, пожалуйста, а у него даже Slave SPI нет? В доке только про обычный, не слейв SPI. Так бы три канала на 320КС/с еле-еле бы влезало бы если по 12МГц SPI.

они там немного перестарались конечно с переизобретением велосипеда даже в таких простых вещах как SPI, но не настолько, чтобы slave режима не было,

это теперь политкоректно Control / Peripheral называется вместо master/slave. POCI/PICO вместо MOSI/MISO

Quote

 

12.3.50 CTL1 (Offset = 1104h) [Reset = 00000004h]

2 CP R/W 1h Controller or peripheral mode select. This bit can be modified only when SPI is disabled, CTL1.ENABLE=0. 0h = Select Peripheral mode 1h = Select Controller Mode

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, _pv said:

они там немного перестарались конечно с переизобретением велосипеда даже в таких простых вещах как SPI, но не настолько, чтобы slave режима не было,

это теперь политкоректно Control / Peripheral называется вместо master/slave. POCI/PICO вместо MOSI/MISO

Спасибо!!! Я тоже только что тоже нашел, что там в негронейтральной документации вместо slave теперь упоребляется peripheral и хотел вопрос убрать, но Вы опередили!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...