Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Цифровой интегратор. Реализация на микроконтроллере.
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
MSP430F
Всем доброго времени суток!

Уважаемые коллеги, срочно нужна ваша помощь.

Вот такая задача.
Разрабатывается датчик виброперемещения. Пьезокерамика выдает напряжение, пропорциональное виброускорению. Затем стоит аналоговый интегратор, получаем на выходе виброскорость. Затем будем ставить сигма-дельта АЦП и контроллер с ЦАП, на которых будет реализован цифровой интегратор. С выхода ЦАП есть желание снимать уровень виброперемещения онлайн. Диапазон частот устройства 0,5-320 Гц. Частоту дискретизации сделаем 820 Гц.
С ходу задача кажется не сложной - надо просто оцифрованные значения на каждом шаге умножать на некий коэффициент и прибавлять к переменной - аккумулятору, а с него уже подавать на ЦАП. Но как избежать возможного насыщения цифрового интегратора ? Надо ли обязательно использовать float для вычислений или достаточно будет int (32 бит) ?

Буду признателен за любые подсказки.
Lmx2315
http://www.science-education.ru/107-8130

http://www.irbislab.ru/modules.php?name=Co...page&pid=18

..тут слова похожие, может поможет.
TSerg
Интегрирование константы - линейно-расходящийся процесс, но шутка в том, что интегрирование центрированного случайного процесса, процесс тоже расходящийся.
Вот и думайте.
MSP430F
Цитата(Lmx2315 @ Jun 17 2014, 18:11) *


Видел я эти ссылки... Первая и правда интересная, но что-то последние формулы "итоговая система равенств (19)" ввели в легкий ступор из-за полной потери интегрирующего-суммирующего свойства. Или я чего-то не догоняю, или ошибка в формулах!

Цитата(TSerg @ Jun 17 2014, 18:42) *
Интегрирование константы - линейно-расходящийся процесс, но шутка в том, что интегрирование центрированного случайного процесса, процесс тоже расходящийся.
Вот и думайте.


И я про то же! И как быть ?
andyp
Цитата(MSP430F @ Jun 17 2014, 18:58) *
И я про то же! И как быть ?


а) Не подавать на вход интегратора процесс с постоянной составляющей? (у интегратора коэфф. передачи на 0 частоте бесконечен)

б) Использовать вместо интегратора ФНЧ? Например, экспоненциальное усреднение y_k = 0.9*y_k-1 + 0.1 * x_k . В этом случае для скоростей, близких к постоянным, ЦАП будет выдавать не перемещение, а нечто другое.
Lmx2315
..в рамках дискуссии, не зная ответа я бы помоделировал в матлабе.
Tanya
Цитата(MSP430F @ Jun 17 2014, 18:58) *
И я про то же! И как быть ?

Да никак... Кого Вы хотите обмануть? Природу?
Вот у Вас уже есть операционный усилитель (первый интегратор), так поставьте второй и не заморачивайтесь.
Поставьте ключи. Тут нет никакого выхода, никакой магической формулы.
ViKo
Так же, как и в аналоговом интеграторе. Сбрасывать периодически, или параллельно конденсатору присобачить резистор (в цифровом виде).
MSP430F
Цитата(Tanya @ Jun 17 2014, 19:54) *
Да никак... Кого Вы хотите обмануть? Природу?
Вот у Вас уже есть операционный усилитель (первый интегратор), так поставьте второй и не заморачивайтесь.
Поставьте ключи. Тут нет никакого выхода, никакой магической формулы.


Что за ключи ? Не заморачиваться конечно даже нужно, но, к сожалению, в данном случае, решение принимаю не я, все равно придется городить второй интегратор в цифре.

Цитата(ViKo @ Jun 17 2014, 20:20) *
Так же, как и в аналоговом интеграторе. Сбрасывать периодически, или параллельно конденсатору присобачить резистор (в цифровом виде).


Ну примерно так я и думал. То есть, если на входе интегратора появился 0 (а до этого мы что-то наинтегрировали и на ЦАП поступает не 0, а какое-то отличное от 0 значение), то постепенно значение на выходе интегратора должно прийти к 0 (виртуальная емкость должна рассосаться).

Цитата(andyp @ Jun 17 2014, 19:49) *
а) Не подавать на вход интегратора процесс с постоянной составляющей? (у интегратора коэфф. передачи на 0 частоте бесконечен)

б) Использовать вместо интегратора ФНЧ? Например, экспоненциальное усреднение y_k = 0.9*y_k-1 + 0.1 * x_k . В этом случае для скоростей, близких к постоянным, ЦАП будет выдавать не перемещение, а нечто другое.


Я так понимаю, что формула y_k = 0.9*y_k-1 + 0.1 * x_k как раз и обеспечивает постепенный разряд виртуальной емкости цифрового интегратора ?
Кажется, здесь уже не важно, чтобы сумма коэффициентов была равно ровно 1 - это же не скользящее среднее ?
Например y_k = 0.999*y_k-1 + K * x_k, где K - некий коэффициент.
Tanya
Цитата(MSP430F @ Jun 17 2014, 21:00) *
Что за ключи ? Не заморачиваться конечно даже нужно, но, к сожалению, в данном случае, решение принимаю не я, все равно придется городить второй интегратор в цифре.

А чем цифровой интегратор лучше аналогового в данном случае? У Вас и тот и другой будет "ноль" неправильно интегрировать. Какой смысл оцифровывать АЦП, а потом цифру превращать обратно в аналог ЦАПом? Где мы тут выигрываем?
Ключами можно сбрасывать интегратор. Его конденсатор?
Вот я иногда специально ставлю аналоговый интегратор - его точность выше, чем дает 16-разрядный ЦАП. Примерно как у 20-разрядного.
andyp
Цитата(MSP430F @ Jun 17 2014, 17:59) *
Всем доброго времени суток!

Уважаемые коллеги, срочно нужна ваша помощь.

Вот такая задача.
Разрабатывается датчик виброперемещения. Пьезокерамика выдает напряжение, пропорциональное виброускорению. Затем стоит аналоговый интегратор, получаем на выходе виброскорость. Затем будем ставить сигма-дельта АЦП и контроллер с ЦАП, на которых будет реализован цифровой интегратор. С выхода ЦАП есть желание снимать уровень виброперемещения онлайн. Диапазон частот устройства 0,5-320 Гц. Частоту дискретизации сделаем 820 Гц.
С ходу задача кажется не сложной - надо просто оцифрованные значения на каждом шаге умножать на некий коэффициент и прибавлять к переменной - аккумулятору, а с него уже подавать на ЦАП. Но как избежать возможного насыщения цифрового интегратора ? Надо ли обязательно использовать float для вычислений или достаточно будет int (32 бит) ?

Буду признателен за любые подсказки.


Если серьезно, то для Ваших параметров можно примерно оценить динамику на выходе простейшего интегратора: для 0.5 Hz усиление будет ~32 dB. Для 320 - ~4.1 dB. считал по формуле 10*log10(abs(1/(1-exp(-j*f/F_sam)))) . Т.е. на минимальной частоте стоит добавить 11 разрядов к динамике входного сигнала.


Цитата(MSP430F @ Jun 17 2014, 21:07) *
Я так понимаю, что формула y_k = 0.9*y_k-1 + 0.1 * x_k как раз и обеспечивает постепенный разряд виртуальной емкости цифрового интегратора ?

угу. соответствует простейшей RC цепочке
Цитата
Кажется, здесь уже не важно, чтобы сумма коэффициентов была равно ровно 1 - это же не скользящее среднее ?
Например y_k = 0.999*y_k-1 + K * x_k, где K - некий коэффициент.

K будет определять коэффиент передачи фильтра на нулевой частоте (просто некоторое усиление). При k=0.001 оно будет рано 1.
MSP430F
Цитата(andyp @ Jun 17 2014, 21:51) *
Если серьезно, то для Ваших параметров можно примерно оценить динамику на выходе простейшего интегратора: для 0.5 Hz усиление будет ~32 dB. Для 320 - ~4.1 dB. считал по формуле 10*log10(abs(1/(1-exp(-j*f/F_sam)))) . Т.е. на минимальной частоте стоит добавить 11 разрядов к динамике входного сигнала.


Мы считали немного не так. Соотношение частот = 320 / 0,5 = 640. Значит отношение коэффициентов усиления на 0,5 и 320 Гц также 640. 640 - это скорее 10 бит (точнее 9,3), но не 11.
Потому и ставим сигма-дельта 24-разрядный АЦП. Надеемся, разрядности хватит, хотя, понятно, что 23 с чем-то разряда получают только в лаборатории AD на их же специальных стендах. sm.gif
andyp
Цитата(MSP430F @ Jun 17 2014, 22:14) *
Мы считали немного не так. Соотношение частот = 320 / 0,5 = 640. Значит отношение коэффициентов усиления на 0,5 и 320 Гц также 640. 640 - это скорее 10 бит (точнее 9,3), но не 11.
Потому и ставим сигма-дельта 24-разрядный АЦП. Надеемся, разрядности хватит, хотя, понятно, что 23 с чем-то разряда получают только в лаборатории AD на их же специальных стендах. sm.gif


На 320 интегратор все еще будет разгонять сигнал. Это еще один разряд (ну или делить (сдвигать) выход)

PS тоже думаю, что ~140 dB динамики на выходе в аналоге вы не увидите.

PPS Если боитесь, что на вход инегратора будет попадать постоянная составляющая (например инструментальная погрешность измерителя скорости и тп), то поставьте на входе простенькую схемку коррекции постоянки - оценка постоянки на скользящем среднем и вычитание оценки из сигнала.
MSP430F
Вот такой еще вопрос.
Пишут, что одним из оптимальных методом интегрирования является метод трапеций:
Yn+1 = Yn + 1/2(Xn+1 + Xn). Но в чем тут смысл ? В следующей итерации оставшаяся половина от Xn+1 также будет просуммирована.
Тогда в чем разница от метода прямоугольников, чтобы не написать просто Yn+1 = Yn + Xn+1 ?

Или все дело в частотах и метод трапеций начинает работать при частотах входного сигнала, сопоставимых с частотой Найквиста ?
Petrovich
Уберите аналоговый интегратор, оцифруйте сигнал виброускорения.
Делайте FFT и все дальнейшие вычисления виброскорости и виброперемещения делайте в частотной области. Интегрировать сигнал в частотной области удобнее. Вычисления не сложные.
Лет 5ть назад делал подобное. Все работало.
prig
Цитата(Petrovich @ Jun 19 2014, 14:13) *
Уберите аналоговый интегратор, оцифруйте сигнал виброускорения.
...


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

Но что верно, то верно. Если в системе есть ресурсы, и задача позволяет, то лучше всё переводить в цифру.
Уровень гибкости и возможности цифровых и аналоговых решений просто несопоставимы.
shf_05
периодически, если это допустимо и возможно ставьте ваш объект в "0" координату- контролируйте конечным выключателем и т.п. и сбрасывайте оба интегратора в 0.

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

если измерять двойным интегрированием перемещение, (которое может быть в общем случае бесконечно), то надо однозначно определиться с диапазоном интегрирования-(перемещения)

а в цифре или аналоге зависит от точности и грамотности построения того или другого.
есть возможность - сделайте в аналоге 2 интегратора со сбросом и/или "разрядом"- не понравится - отключите второй (пустите сигнал в обход) и интегрируйте в цифре.

Цитата(MSP430F @ Jun 17 2014, 19:59) *
Диапазон частот устройства 0,5-320 Гц. Частоту дискретизации сделаем 820 Гц.

еще подумайте насколько круто ограничен диапазон за 320 Гц и корректно ли будет работать ваш сигма дельта при таких соотношениях частот дискретизации и сигнала.
Scientificer
Вставлю и я пять копеек. Закидывать значения АЦП в кольцевой буфер такого размера, чтобы получилось правильное время интеграции. Затем все складывать и делить на размер буфера. Если правильно выбрать тип данных, то насыщаться не будет. Т.к. точки, которые были раньше чем длина буфера больше не входят в сумму.

Это будет прямоугольное окно.

Если перед усреднением умножать на маску размера буфера, скажем гауссову, то будет гауссово окно.

MSP430F
Цитата(Scientificer @ Jun 24 2014, 23:24) *
Вставлю и я пять копеек. Закидывать значения АЦП в кольцевой буфер такого размера, чтобы получилось правильное время интеграции. Затем все складывать и делить на размер буфера. Если правильно выбрать тип данных, то насыщаться не будет. Т.к. точки, которые были раньше чем длина буфера больше не входят в сумму.

Это будет прямоугольное окно.

Если перед усреднением умножать на маску размера буфера, скажем гауссову, то будет гауссово окно.


Спасибо, очень оригинально! Если все считать в целых числах, то вместо сложения всех элементов буфера можно выполнять только две операции - сложение нового элемента и вычитание самого старого. Этим можно очень сэкономить на вычислениях.
Pavia
Цитата(MSP430F @ Jun 19 2014, 14:04) *
Вот такой еще вопрос.
Пишут, что одним из оптимальных методом интегрирования является метод трапеций:
Yn+1 = Yn + 1/2(Xn+1 + Xn). Но в чем тут смысл ? В следующей итерации оставшаяся половина от Xn+1 также будет просуммирована.
Тогда в чем разница от метода прямоугольников, чтобы не написать просто Yn+1 = Yn + Xn+1 ?

Или все дело в частотах и метод трапеций начинает работать при частотах входного сигнала, сопоставимых с частотой Найквиста ?

Методы имеют одинаковый порядок ошибки:
Доказательство
Но 1/2 как правило выполняется с округлением или отбрасыванием последнего бита. Поэтому в методе трапеций ещё присутствует неявный нч фильтр.



Цитата(MSP430F @ Jun 17 2014, 17:59) *
Всем доброго времени суток!

С ходу задача кажется не сложной - надо просто оцифрованные значения на каждом шаге умножать на некий коэффициент и прибавлять к переменной - аккумулятору, а с него уже подавать на ЦАП. Но как избежать возможного насыщения цифрового интегратора ? Надо ли обязательно использовать float для вычислений или достаточно будет int (32 бит) ?

Буду признателен за любые подсказки.

Float тоже имеет насыщение. Причем сопоставимое с тем же int32. Если числа типа float при сложении имеют разный порядок, то они будут складываться с ошибками или во все не складываться.
shf_05
Цитата(MSP430F @ Jun 25 2014, 23:24) *
Спасибо, очень оригинально! Если все считать в целых числах, то вместо сложения всех элементов буфера можно выполнять только две операции - сложение нового элемента и вычитание самого старого.

пожалуйста, математически запишите, не могу понять что вы имеете ввиду.
Scientificer
Цитата(MSP430F @ Jun 25 2014, 20:24) *
Если все считать в целых числах, то вместо сложения всех элементов буфера можно выполнять только две операции - сложение нового элемента и вычитание самого старого. Этим можно очень сэкономить на вычислениях.

Как же я сам не додумался! Я в своей задаче каждый раз заново считаю.
shf_05
Цитата(Scientificer @ Jun 26 2014, 03:03) *
Как же я сам не додумался! Я в своей задаче каждый раз заново считаю.

аа понял, дак это не интегратор получается, а что-то вроде CIC фильтра или скользящего среднего.
скорее всего так вы получите некий интеграл на промежутке времени, скорее всего для оценки скорости и перемещения не абсолютного это подойдет.
MSP430F
Цитата(shf_05 @ Jun 26 2014, 09:17) *
аа понял, дак это не интегратор получается, а что-то вроде CIC фильтра или скользящего среднего.


Ну мне именно скользящее среднее и предложили использовать в качестве интегратора... Я просто предложил экономичный алгоритм его расчета для целых чисел. Вы считаете, что скользящее среднее и интегратор сильно разные вещи ?
shf_05
ага его всегда так и считают, в этом его плюс- малая вычислительная потребность.
разница безусловно есть, вы запишите несколько осциллограмм с датчиков или с имитируйте примерно такие сигналы, как с них идут, и попробуйте в матлабе или аналогичном ПО и скользящее, и интеграл- решите подходит вам то или другое.
Fat Robot
Сначала решите простую задачу:

Вы сели в автомобиль и поехали. Из приборов у вас только спидометр и секундомер. Как определить пройденный путь по истечении времени ? В соответствии с курсом средней школы:



Это если вы едете в чистом поле. Понятно, что чем дольше вы так едете, тем большая абсолютная ошибка накопится из-за неидеальности ваших средств измерения.

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

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

У вас примерно та же ситуация, только в случае с акселерометром вместо спидометра будет 2 последоваетльных интегратора.

Цитата(MSP430F @ Jun 26 2014, 11:25) *
Ну мне именно скользящее среднее и предложили использовать в качестве интегратора... Я просто предложил экономичный алгоритм его расчета для целых чисел. Вы считаете, что скользящее среднее и интегратор сильно разные вещи ?
thermit
Цитата(MSP430F @ Jun 26 2014, 14:25) *
Ну мне именно скользящее среднее и предложили использовать в качестве интегратора... Я просто предложил экономичный алгоритм его расчета для целых чисел. Вы считаете, что скользящее среднее и интегратор сильно разные вещи ?



Пф скользящего среднего:



Пф интегратора:



Не очень одинаковые.
shf_05
если нет конечников, и автору не нужны абсолютные координаты, а скажем просто нужно понять на сколько "уехал" за секунду его датчик, то и скользящее среднее подойдет, в этом случае чем больше N, тем точнее оценка.
ведь интегрируя мгновенное ускорение автор получит мгновенную скорость, (если средняя скорость нулевая!!!), интегрируем мгновенную скорость в течение некоего времени получим некое расстояние.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.