Быстрое АЦ-ЦА преобразование с минимальной обработкой сигнала

anzua
Offline
Зарегистрирован: 10.06.2020

День добрый.

На работе стала потихоньку умирать древняя техника на операционных усилителях и вот подумалось мне, что вместо того чтобы наблюдать (безуспешные?) попытки реанимационных работ на электронике, что старше меня, было бы неплохо освоить для себя что-то новенькое и заодно сделать подарок старшему коллеге (тому что принимал участие в разработке этого аналогового монстра когда-то давным-давно)

И для начала хотелось бы оценить возможность выполнения следущего техзадания:
1) считать через АЦП 2 синусных сигнала с амплитудой +/-10В
2) отмасштабировать их
3) вычесть из одного другое
4) взять производную от результата (ну типа заменить синус на косинус)
5) отмасштабировать (возможно и инвертировать тоже)
6) дополнить сигнал рядом тригерных событий - ВКЛ, ВЫКЛ, оффсет...
7) выдать результат через ЦАП (в идеале теперь уже косинусом с амплитудой до +/-10В)

Всё это нужно максимально "аналогово":  меньше 10мкс задержки между входом-выходом - это отлично, больше 20мкс - печально и неприемлимо. Ну и разрядность от 16 бит и выше.

Выглядит как задачка для звуковой карты 24бит/192кГц, но не уверен что там от "микрофона" (а их нужно 2 да?) можно взять производную и выдать на "динамик" обработанный сигнал, к тому же, наверняка, под вопросом амплитуда сигнала в +/-10В.
Возможно проще таки будет собрать это решение на отдельных элементах АЦП/ЦАП?

 

Так как задумывается всё это как подарок "семпаю", то хотелось бы всё сделать своими руками, но, чтобы не сильно затягивать по времени - под мудрым руководством Исполнителя, готового стать ментором для чайника который сегодня вроде как уже перестал путаться в буквах при написании слова arduino

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

хорошая задумка

anzua
Offline
Зарегистрирован: 10.06.2020

вот тут бы и пригодилось "да, можно, железо позволяет" или "нет, забей и думай в другую сторону"..

если несколько упростить задание, то для начала будет "достаточно" даже только считать 2 аналоговых сигнала, вычесть один из другого, а результат выдать с задержкой в 5мс (четверть периода 50Гц)

ясное дело что это не совсем то (вернее совсем не то) что делают ОУ, но в первом приближении для стационарного режима сойдёт

microsystems
microsystems аватар
Offline
Зарегистрирован: 25.01.2020

Таки делайте на ОУ. Нахрена вам абдурина? Дань моде? 

anzua
Offline
Зарегистрирован: 10.06.2020

В какой-то степени - да
Решение на ОУ есть, есть схемы к нему и оно всё даже работает.. до тех пор пока там "что-то" не сдыхает от старости и начинается поиск - где, что и как это вылечить..
Вполне вероятно, что полная замена элементарной базы на современные аналоги решит все эти проблемы.
Возможно, задумаюсь и о таком варианте если в обозримом будущем не отыщется подходящего "цЫфрового" решения

Komandir
Онлайн
Зарегистрирован: 18.08.2018

Всё зависит от необходимой быстроты "Быстрого АЦ-ЦА преобразования"

anzua
Offline
Зарегистрирован: 10.06.2020

я ж вроде как указал:  меньше 10мкс - отлично, дольше 20мкс - неприемлимо.
хотя, в принципе, цифровой части можно "тупить" где-то до 4мс, главное чтоб выход ЦАПа был с точностью до этих самых 10мкс смещен на четверть периода относительно входа

Вот как-то так на примере двух входящих сигналов амплитудой 6 и 4. Выход амплитудой 2 с отставанием на четверть периода.

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

ТС! Частота сигналов секретная? Время установки после изменения сигналов тоже секретно? Нормализация требует минимум один полный период для расчета коэффициентов. Ну и так далее.
Сама возможность решения и выбор инструментов зависят от ответов.

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Да, следует добавить, что 16 бит это ОЧЕНЬ много. Если это требование не аргументировано, то оно кажется взятым "с потолка". Прошу не обижаться. Такие точности (обычно) используются на весьма низких частотах измерений.

nik182
Offline
Зарегистрирован: 04.05.2015

На ардуине не сделать ни как. От слова вообще. Цифровая обработка такого уровня требует ПЛМ. Ищите там, но порог входа на несколько порядков выше. Без знаний никак. А время входа больше года при постоянных занятиях. Ну или заказ далеко за 100 000 руб. 

rkit
Offline
Зарегистрирован: 23.11.2016

anzua пишет:

1) считать через АЦП 2 синусных сигнала с амплитудой +/-10В

Есть схема входа? И как фильтровать?

anzua пишет:

2) отмасштабировать их

Как?

anzua пишет:

3) вычесть из одного другое
4) взять производную от результата (ну типа заменить синус на косинус)

Легко

anzua пишет:

5) отмасштабировать (возможно и инвертировать тоже)

Как?

anzua пишет:

6) дополнить сигнал рядом тригерных событий - ВКЛ, ВЫКЛ, оффсет...

А конкретнее?

anzua пишет:

7) выдать результат через ЦАП (в идеале теперь уже косинусом с амплитудой до +/-10В)

Еще раз производную взять? Импеданс выхода?

 

anzua пишет:

хотелось бы всё сделать своими руками, но, чтобы не сильно затягивать по времени

Пайка, изготовление плат есть?

anzua
Offline
Зарегистрирован: 10.06.2020

wdrakula,
Первый сигнал - синус 50Гц или 60Гц
Второй - тоже 50/60Гц но с другой амплитудой и не чистый а с гармоническим шумом.
Сигналы нужны в статике, так что время установки не критично.
16 бит взято из справочника Стеля (стеля = потолок), по факту для точности выхода в 0.1% вполне достаточно 12 бит (не так ли?).

nik182,
Обидно, и за адруину, и за ПЛМ, и за 100тыр.
Попытаюсь "урезать осетра" от того что где-то когда-то видел и слышал до самого необходимого но достаточного минимума

rkit,
На счет схемы входа не понял: та что сейчас на ОУ? - есть. Данные источников сигнала тоже могу уточнить.
Фильтровать.. по идее, все что выше 1кГц можно убрать. Но можно и оставить если оно осложнит реализацию.
Масштабирование как входов так и выхода в пределах от 1/10 до х10 (возможно хватит даже 1/4...х4, но это не точно и надо уточнять), но с точностью до 0.1%
ВКЛ-ВЫКЛ на ОУ реализован как аналоговый компаратор и мосфет выключающий разность входов... предполагаю что это "легко" реализуемо через любой другой "медленный" 8ми-битный АЦП.
Оффсет - на выход, на случай если нуль уползёт, но, наверное, можно и без него?
Еще раз производную брать не надо: если на входах синус, то на выходе - косинус (это безотносительно амплитуды, речь только о фазе)
На выходе ожидается ~10..15кОм - параллельно висят 2 приемника по 40кОм и еще что-то высокоомное (не помню точно, надо поднимать документацию)
SMD-пайки хотелось бы избежать (опыт=0), но если без этого совсем никак, то это решаемо. Надеюсь имелось в виду именно это, а не изготовление платы с нуля (начиная с проекитрования и разведения дорожек)

rkit
Offline
Зарегистрирован: 23.11.2016

Еще хуже. Задачу внятно опиши, или никто не будет подписываться на работу через "могу уточнить" и "предполагаю". Работа это коммерческий расчет и претензии по недоработкам. По текущей каше слов работать нельзя.

anzua
Offline
Зарегистрирован: 10.06.2020

По какому из трёх вопросов это действительно критично?
Умножение выходного сигнала на ноль если сигнал с 8ми-битного АЦП выйдет за лимит?
То что масштабирование будет не х2.23 а х3.09 или х0.78 а не 0.19?
Или что на выходе висит 10кОм вместо 15кОм?

anzua
Offline
Зарегистрирован: 10.06.2020

Вообще, в любом случае, огромная благодарность за вопросы - они весьма помогли мне самому понять что требуется от прибора.
Самим вопросом я озадачился буквально вот-вот - еще и суток не прошло как (с тех пор как снова что-то там сгорело)
Однозначно, для уточнения ТЗ надо еще поднять кой какую документацию, "переспать с идеей" ночь-другую...
Но, как я понял, принципиальных препятствий нет и проект в принципе реализуем, верно?

nik182
Offline
Зарегистрирован: 04.05.2015

В принципе реализуемо всё. Вопросов встало ещё больше. Насколько стабильна частота входных сигналов? Как уже сказал Влад, нормализовать синус можно если получен полный период. Если это 50 Гц то 20 мс. Цифровая обработка на ардуине займет около 10 мс. Выдачу можно начать не раньше чем через 30 мс. Её можно привязать к началу следующего периода входных сигналов, а это уже 40 мс. И надо помнить, что при этом , что МС занимается оцифровкой, и выдачей и цифровой обработкой. Озвученные Вами времена 10 мкс совершенно не реальны на ардуине, хотя бы по тому, что ацп не может обеспечить поток входных данных по двум каналам с такой точностью. Соответственно производная разности будет иметь огромный шум и ошибки. Есть вариант уйти на процессор stm32f303. Там время оцифровки двух каналов 12 бит около 0.5 мкс полностью аппартно и не занимает процессор. Выдача тоже аппаратная. Время расчёта меньше 800 мкс. Но остаются 20 мс оцифровка периода. Если сигналы стабильны хотя бы несколько периодов то можно придумать алгоритм, где по прошлым периодам расчитываются коэффициенты, которые применяются к текущим входным данным. Тогда встаёт вопрос цифрового фильтра, который всегда вносит задержку, тем больше, чем ниже частота среза. Если фильтр 1 кГц то и задержка будет в этих пределах. Т.е опять упираемся в 1 мс задержки фазы выходного сигнала относительно входного при цифровой обработке.
Моё мнение, что почти всё надо делать на аналоговых МС. Если вставлять процессор, то на задачу стабилизации амплитуды входных сигналов управляя коэффициентом усиления регулируемого операционника и на задачу разных триггеров.

rkit
Offline
Зарегистрирован: 23.11.2016

nik182 пишет:
Цифровая обработка на ардуине займет около 10 мс.

Два вычитания и два умножения это 10 мс? Как всегда написал кучу бреда какого-то с умным видом.

nik182
Offline
Зарегистрирован: 04.05.2015

Ты опять переходишь на личности и при этом выглядишь человеком совершенно не в теме. Если я написал глупость, то опиши алгоритм нормализации амплитуды сигналов, которые потом два умножения и вычитания? Сколько алгоритм нормализации займет времени? Это требование ТС. Нормализация. И цифровой фильтр до вычитания и умножения тоже время. Тоже требования ТС. Про них ты забыл или просто не знаешь сколько они занимают время?

anzua
Offline
Зарегистрирован: 10.06.2020

Один из сигналов - эталонные 50/60Гц с точностью до 0.05% и "абсолютной" стабильностью.
Второй сигнал - оцифрованный в 1/512 цикла и изрядно измененный первый. Но в статике, по идее, тоже весьма стабилен (плюс, конечно же, шум)

Что критично - попасть выходным сигналом с точность до 10мкс в нужную фазу входного сигнала. Если это будет обработаный сигнал прошлого или даже позапрошлого периода - не критично.

Изначально ни о каких фильтрах речь не шла, по этому уточню: фильтры - минимально необходимые с точки зрения обработки цифрового сигнала.

Нормализация она как - можно при снятии/выдаче сигнала или нужно отдельное действие? Если первое, то тогда вообще "задача в 1 действие" - вычесть сигналы друг из друга. Вот только результат потом нужно придержать и выдать в нужный момент
Ну и плюс умножение на 0 по внешнему условию, но тоже не критичное по времени.

Аналоговые МС - хорошее решение. Наверное. Жаль что с ними у меня так же как и с ардуино - знаю о существовании, но не сильно более того =))
По всей видимости, для этого решения (впрочем как и для чисто аналогового на ОУ) нужно сменить форум.. или это решение можно подвязать к ардуине?

rkit
Offline
Зарегистрирован: 23.11.2016

ФАПЧ для инвертора какого-то, что ли?

nik182
Offline
Зарегистрирован: 04.05.2015

Нет минимально необходимых фильтров. Есть фильтры разной реализации, но в основе, для подобных задач, свертка входного сигнала на функцию фильтра. Производная без фильтра будет очень сильно шуметь при цифровой обработке. 

Непонятно про второй сигнал. Что значит оцифрованный? Как? Выдается оцифрованный в аналоговой форме? По времени понятно - а по амплитуде? Нужно подстраивать или можно один раз измерить и потом долго использовать коэффициент?   Выдавать 0 при условии можно без умножения.  Картинки из #6 не видно.

anzua
Offline
Зарегистрирован: 10.06.2020

rkit,
нет, не оно

nik182,
Это честная производная шумит?
А то ж в этом конкретном случае можно посмотреть амплитуду прошлого периода и потом корень из неё минус квадрат разности входов. Или это по ресурсам неподъёмно?
И, кстати, задержка в 1/4 периода (ну или в 5/4) тоже вполне удовлетворяет требованиям, т.е. производная - не самоцель.
Цель (если совсем полностью абстрагироваться от физической и математической подоплеки и рассматривать только статические состояния когда каждый период "равен" предыдущему) - выдать разность входов с максимально точной задержкой на выход .
Второй сигнал - не готов обсуждать. Он есть. С точностью по фазе до 1/512 периода 50/60Гц. Амплитуда - от +120% до -120% относительно первого.
Интересуют статические режимы, повторяемость периодов где-то на порядок выше запрашиваемой точности в 0.1%. Так что коэффициенты нужно выставить один раз и, если повезет, то никогда больше вообще не трогать. Ну или же что более вероятно - поверять и корректировать раз в 2-3 месяца.

Картинка... там для примера один период двух синусов с амплитудой 6 и 4 и их разность с амплитудой 2 смещённая на 90°

ПС
до понедельника я слабо доступен, как раз заодно проветрюсь и потом на свежую голову гляну чего я понаписал и чего мне присоветовали.

DIVGENY
Offline
Зарегистрирован: 23.08.2016

не хочешь просто выложить рабочий кусок схемы на ОУ, который хочешь заменить "цифрой"? ,тогда

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

anzua
Offline
Зарегистрирован: 10.06.2020

DIVGENY,
Уже подумывал об этом =))

promavto
Offline
Зарегистрирован: 30.04.2013

Микроконтроллер SAM3X8E (Arduino DUE) 12 разрядов. Обработка сигнала АЦП независимо от работы основного контроллера. Результат хранится в буферах. 

Фрагмент настройки АЦП. Измеряю и обрабатываю синусоидальные сигналы. Отображаю осциллограммы, вычисляю ток и РМС. Можете "покопать" в этом направлении.

//------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// настройки АЦП
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
#define NUM_CHANNELS 3   // Установить количество аналоговых входов
/*
ch7:A0
ch6:A1
ch5:A2
ch4:A3   
ch3:A4  
ch2:A5  
ch1:A6  
ch0:A7  
ch10:A8 
ch11:A9 
ch12:A10 
ch13:A11 
*/
 
 
#define ADC_CHANNELS  ADC_CHER_CH2 | ADC_CHER_CH3 | ADC_CHER_CH4
#define ADC_CHANNELS_DIS   ADC_CHER_CH0 | ADC_CHER_CH1 | ADC_CHDR_CH5 | ADC_CHDR_CH6 | ADC_CHDR_CH7| ADC_CHER_CH10| ADC_CHDR_CH11 | ADC_CHDR_CH12 | ADC_CHDR_CH13   // Отключить не используемые входа
#define BUFFER_SIZE 250*NUM_CHANNELS                                   // Определить размер буфера хранения измеряемого сигнала     
#define NUMBER_OF_BUFFERS 4                                            // Установить количество буферов
//#define VOLT_REF        (2400)                                       // Величина опорного напряжения
/* The maximal digital value */
//#define ADC_RESOLUTION 12                                     // Разрядность АЦП (максимальная для DUE)