Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: сигма-дельта модулятор + МК
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
skyv
Всем доброго дня.
Есть несколько вопросов по работе с сигма-дельта модулятором.
Исходно имеем частоту модулятора Fsampl = 16МГц и частоту дискретизации
выходного сигнала Fd = 10кГц. Число разрядов – 16.
1. Во многих примерах видел обработку данных модулятора плиской или DSP. Как оценить необходимую производительность контроллера типа ARM7?
2. Каким интерфейсом контроллера принимать поток данных модулятора?
3. В даташите на модулятор есть пример фильтра-дециматора на VHDL.
Где найти аналогичный пример на С?
rezident
ИМХО программно обработать такую частоту весьма проблематично. И в периферии МК нет аппаратной возможности, чтобы впрямую принять поток от сигма-дельта модулятора. Хотя, если модулятор тактируется от того же МК или есть возможность тактировать таймер МК этой частотой, то можно попробовать capture-ить поток с выхода модулятора. Вход захвата должен быть настроен на оба фронта. Результат capture от одного фронта следует суммировать, а от противоположного вычитать. Понадобится еще один канал в режиме compare или match или второй таймер, тактируемый опять же той же самой частотой, чтобы отмерять интервал суммирования (измерения). Как-то так по-моему. laughing.gif
skyv
А какие интерфейсы существуют в DSP.
По поводу интервала суммирования.
Если я правильно понял, Вы предлагаете прямой метод накопления,
который подходит для медленно меняющихся входных сигналов
( дословно из DSP-ПРОЕКТ «НАРОДНЫЙ УЧЕБНИК»).
При таком способе обработки частота моего выхода будет определяться:
Fd = 16.0e+06 / 65536 (Гц)
sysel
У меня тоже есть мысль приладить сигма-дельта модулятор AD7401A(похожая штука есть у TI) к микроконтроллеру LPC17xx с ядром Cortex-M3.

У AD740x кроме потока данных с модулятора есть ещё и клок, так что таймер с Capture вовсе необязательно.

Гуры рекомендуют для первичной децимации делать цифровой Sinc3 фильтр. В даташите на AD7401 есть код на верилоге (3 сумматора -> дециматор -> 3 дифференциатора), поток с него передаётся на DSP для дальнейшей обработки.

Самый прямй путь - поставить CPLDшку, которая будет этот Sinc3 делать, потом поток с неё направить на МК или DSP.

Альтернативный путь(ещё не изведан): хочу поток принять на SSP (что-то типа SPI, только можно гнать непрерывным потоком + DMA).
Будет поток байт, биты которых - выход сигма-дельта модулятора.
Самая затратная по ресурсам часть - реализация трёх сумматоров битового потока (если брать Sinc3 фильтр).
Её можно оптимизировать, составив предварительно таблицы инкрементов для всех трёх сумматоров в зависимости от принятого байта. Размер таблицы: 256*3 байт. Теперь можно работать с байтами, а не битами.
Для такого Sinc3 фильтра коэфф. децимации надо будет брать кратным восьми.
Дальше на дифференциаторы и по тексту реализации Sinc3.
skyv
Именно этот модулятор я и рассматриваю.
Подобная идея обработки прокручивалась в голове.
Спасибо sysel за достаточно подробное
описание Вашей едеи.
Подозреваю, что в DSP данная задача реализуется аналогично.
Для себя хочу рассмотреть возможность приема непрерывного потока
по SPI с использованием двух буферов + ДМА. Софт будет
поочередно обрабатывать эти буферы.
ПЛИС + МК как-то накладно. Тогда уже просто использовать одну ПЛИС без МК.
sysel
Цитата(skyv @ Oct 20 2010, 11:33) *
Именно этот модулятор я и рассматриваю.
...
Для себя хочу рассмотреть возможность приема непрерывного потока
по SPI с использованием двух буферов + ДМА.


Получается, что SPI должен работать в режиме MASTER, чтоб генерировать клок для модулятора (проверить, потянит ли SPI тактовую 16 МГц). Судя по даташиту на AD7401 минимальная частота 5 МГц, так что м.б. и исходить из 5 МГц.
Также необходимо убедиться, что SPI не будет между байтами (или словами) пропускать биты (за счет вставки CS=1 между передачами).
На моём МК (LPC1754) к SPI DMA не прикручивается...

Через пару дней мне придут образцы AD7401A, так что если будет свободное время - обязательно поиграюсь с ними.
skyv
Так точно, SPI - мастер. У меня, на SAM9, максимум выходного клока до 50 МГц.
По поводу использования SPI план такой:
- Сигнал CS не дергать вообше. Один раз сформировать
выбор устройства и все.
- Настроить SPI на прием слов или байт и паузы между ними не делать.
- У SAM7,9 есть два указателя на приемные буферы. Вот теперь надо
разобраться можно ли их использовать для организации непрерывного
потока.
sysel
Цитата(skyv @ Oct 20 2010, 13:47) *
[рассказ]


Отпишите, пожалуйста, что у Вас выйдет
skyv
Пока лучше опишу чего не выходит.
Посмотрел текст фильтра на VHDL и возникают вопросы.
1. Сигнал reset нужен только для начальной инициализации и в
процессе работы он не нужен?
2. Не пойму комментарий.
if(mdata1==0)
ip_data1 <= 0; /* change from a 0 to a -1 for 2's comp */
else
ip_data1 <= 1;
Если mdata1==0, то всегда ip_data1 = 0, а где и когда получаем -1?
3.Долее, не пойму как могут работать интеграторы если ip_data1 всегда
0 или 1.
sysel
Цитата(skyv @ Oct 20 2010, 14:34) *
Пока лучше опишу чего не выходит.
Посмотрел текст фильтра на VHDL и возникают вопросы.
1. Сигнал reset нужен только для начальной инициализации и в
процессе работы он не нужен?

Замечание: там не VHDL код, а Verilog.
VHDL приводиться в документации на TIшную м/сх AMC1203.
Сигнал "reset" только для начальной инициализации.
Цитата(skyv @ Oct 20 2010, 14:34) *
2. Не пойму комментарий.
if(mdata1==0)
ip_data1 <= 0; /* change from a 0 to a -1 for 2's comp */
else
ip_data1 <= 1;
Если mdata1==0, то всегда ip_data1 = 0, а где и когда получаем -1?

В интернетах об этот комментарий много копий сломано на буржуйских форумах.
Я эту штуковину моделировал в Delphi. Брал "0" и "1" как в тексте.
Цитата(skyv @ Oct 20 2010, 14:34) *
3.Долее, не пойму как могут работать интеграторы если ip_data1 всегда
0 или 1.

К Acc1 либо прибавляется единичка, либо нет.
В схеме с интеграторами нас интересует только изменение Acc3 за промежуток между децимацией.
Ну да, случаются переполнения, ну и аллах с ними, нас же интересует только приращение Acc3 и всё.
А при должной разрядности сумматоров (чтоб между моментами выборки дециматора не произошло 2 или более переполнения Acc3) одно переполнение ни как не скажется на вычислении приращения.

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

Мне пока не совсем понятны частотные характеристики этого чуда.

Есть такой чип AMC1210, который может сам всё отфильтровать.
skyv
За ответы на вопросы спасибо.
Моделировать фильтр для себя я тоже планирую,
но когда все более менее определится.
АЧХ фильтра будет зависеть от Fsample и Fd.
В даташите на AD7705 приведено описание sinc3 фильтра.
Там есть картинка АЧХ.
Софт для интеграторов требует шорошего быстродействия
и я уже параллельно смотрю на CPLD от Atmel.

sysel
Цитата(skyv @ Oct 20 2010, 15:36) *
Софт для интеграторов требует шорошего быстродействия
и я уже параллельно смотрю на CPLD от Atmel.

Лучше на Atmel не смотрите, смотрите что-нибудь от Altera или Xilinx. У них средства разработки удобнее.
Я бы посоветовал MAX II (Altera) младший, хотя можно поискать что-то более бюджетное.
_4afc_
Цитата(skyv @ Oct 19 2010, 15:57) *
Есть несколько вопросов по работе с сигма-дельта модулятором.
Исходно имеем частоту модулятора Fsampl = 16МГц и частоту дискретизации
выходного сигнала Fd = 10кГц. Число разрядов – 16.
3. В даташите на модулятор есть пример фильтра-дециматора на VHDL.


Скажите, а если этот поток с модулятора прогнать через НЧ фильтр с частотой среза 5кГц и взять каждый 16000 отсчёт, то чем это плохо?
Типа ресурсов много сожрёт или некачественно будет?

А то я в этих сигма дельта ничего не понимаю, особенно когда они имеют порядок.
Тем более, что в одном из имеющихся у меня - количество единиц превышает количество нулей...
sysel
Цитата(_4afc_ @ Oct 20 2010, 16:02) *
Скажите, а если этот поток с модулятора прогнать через НЧ фильтр с частотой среза 5кГц и взять каждый 16000 отсчёт, то чем это плохо?
Типа ресурсов много сожрёт или некачественно будет?

Как раз это и надо сделать. Вопрос в реализации этого фильтра и дециматора. Суть в том, чтобы с поток с большой частотой семплирования (16MГц) максимально простым фильтром и дециматором привести к меньшей частоте семплирования, а потом на этой частоте семплирования строить фильтр со срезом 5кГц и ещё разок проводить децимацию до Fs = 10 кГц.
Цитата(_4afc_ @ Oct 20 2010, 16:02) *
Тем более, что в одном из имеющихся у меня - количество единиц превышает количество нулей...

Значит по входу у Вас сигнал больше чем полшкалы.

Хорошее подспорье для понимания - MATLAB + Delta Sigma Toolbox
Там есть документация и "How it works" на одном листке.
hobgoblin
Цитата
Скажите, а если этот поток с модулятора прогнать через НЧ фильтр с частотой среза 5кГц и взять каждый 16000 отсчёт, то чем это плохо?
Типа ресурсов много сожрёт или некачественно будет?

При очень большом соотношении частоты дискретизации к полосе использовать простые децимирующие FIR фильтры неэкономично по ресурсам. По этой причине в сигма-дельта модуляторах повсеместно используют CIC фильтры или комбинацию CIC и FIR (для исправления завала АЧХ CIC).

Цитата
В даташите на модулятор есть пример фильтра-дециматора на VHDL.
Где найти аналогичный пример на С?

http://www.analog.com/static/imported-file.../EE-350rev1.pdf
http://www.analog.com/static/imported-file...es/EE350v01.zip

но лучше, ИМХО, простую плисину прикрутить, благо написать CIC-дециматор не составляет особых проблем
skyv
Цитата(hobgoblin @ Oct 20 2010, 16:25) *
но лучше, ИМХО, простую плисину прикрутить, благо написать CIC-дециматор не составляет особых проблем


Реализация на ПЛИС сомнений не вызывает, но хотелось бы
оценить требования к МК для этой задачи.
hobgoblin
Цитата(skyv @ Oct 20 2010, 16:35) *
Реализация на ПЛИС сомнений не вызывает, но хотелось бы
оценить требования к МК для этой задачи.

В принципе, в той статье, на которую я ссылку дал, есть описание расчета ресурсов. Но во-первых, как здесь уже говорили, есть проблема с вводом данных в МК на такой частоте (в статье используется последовательный порт блэкфина, но у него частота тактовая может быть довольно высокая, не уверен что в ARMе есть что-то подобное). Во-вторых, делать CIC, который напрямую будет, децимировать в 16000 раз, нежелательно. а) Разрядность на выходе будет большой: ceil(K*log2(M)). K -порядок фильтра, M - коэффициент децимации. Например, для CIC третьего порядка, арифметика должна быть для чисел с разрядностью больше 32 бит (3*15). б) у Вас все равно останется много внеполосного шума, который по любому надо будет отфильтровать, например halfband фильтром.
skyv
По поводу ресурсов увидел, что использован BF533 с частотой 594 MHz.
SAM9 у меня по SPI работает на 25 MHz без проблем, но под другой задачей.
А для этой похоже ему не дотянуть.
skyv
Цитата(sysel @ Oct 20 2010, 14:04) *
Отпишите, пожалуйста, что у Вас выйдет


Решил посмотреть в симуляторе какое число тактов затратит SAM9
на вычисление трех интеграторов sinc3 фильтра. Ядро ARM9 работает на 200 МГц,
т. е. 1 такт = 5нс.
Условия для себя принял следующие:
- Частота модулятора = 20 МГц. Частота формирования выходных отсчетов
примерно 10 кГц. Из этих условий я нахожу необходимый размер буфера = 1984 бит
или 62 32-х разрядных слова. Время заполнения буфера составит 1984 * 0.05 мкс = 99.2 мкс.
- В программе я обрабатываю весь буфер = 1984 бит за 10305 тактов, а это соответствует
времени 10305 * 5нс = 51.5мкс. Программный код на обработку 1-го бита такой:
Integr_3 += Integr_2; - 1 такт
Integr_2 += Integr_1; - 1 такт
Integr_1 += ( input >> .... ) & 0x00000001; - 4 такта
Когда использовал цикл по битам, то получил 18672 такта (99 мкс). Пришлось
его развернуть.
Итого из 99.2 мкс потратили 51.5 мкс. Запас в 50 мкс обнадеживает.





sysel
Мой результат, используя таблицу инкрементов

Фильтр CIC (4 интегратора -> децимация в 200 раз -> 4 дифференциатора) -> Фильтр FIR (компенсация CIC + НЧ для дальнейшей децимации) (36 коеф. 32 бита) с децимацией в 5 раз.
Итого децимация в 1000 раз.

Алгоритмы реализованы на С, компилятор из IAR, оптимизация по скорости.

Процессор LPC1754 (Cortex-M3) на частоте 100 МГц.

На вычисление одного выходного отсчета сигнала (CIC+FIR) требуется 53 мкс.
skyv
Цитата(sysel @ Oct 25 2010, 13:25) *
...
Процессор LPC1754 (Cortex-M3) на частоте 100 МГц.

На вычисление одного выходного отсчета сигнала (CIC+FIR) требуется 53 мкс.

Вот интересно как 100 МГц МК LPC1754 вычисляет быстрее, чем 200 МГц SAM9?
sysel
Цитата(skyv @ Oct 25 2010, 15:14) *
Вот интересно как 100 МГц МК LPC1754 вычисляет быстрее, чем 200 МГц SAM9?

Я использую таблицу инкрементов и оперирую в алгоритме байтами, а не битами. Что само по себе быстрее.
Как допишу алгоритм полностью, вышлю Вам реализацию.
skyv
Тогда еще один вопрос. Просто для себя я его пока не рассматривал детально.
Данный АЦП предназначен для непосредственного подключения к шунтам с целью
измерения тока. У Вас АЦП также используется или нет? Я собираюсь его использовать для
измерения напряжений +- 10В.
sysel
Цитата(skyv @ Oct 25 2010, 15:38) *
Тогда еще один вопрос. Просто для себя я его пока не рассматривал детально.
Данный АЦП предназначен для непосредственного подключения к шунтам с целью
измерения тока. У Вас АЦП также используется или нет? Я собираюсь его использовать для
измерения напряжений +- 10В.


Я тоже мерю ток с шунта.
По ТЗ Rшунт = 1 Ом и он находиться внутри девайса, так что я его могу разбить на несколько последовательно включенных резисторов.

Для измерения напряжения я эту схему не рассматривал. Хотя что-т подобное видел в даташите на TI.
Скорее всего Вам нужно будет перед модулятором ставить буфер на операционнике.
skyv
С вашей схемой понятно. В моем случае надо будет оценить
итоговое разрешение после приведения входного сигнала с помощью ОУ.
У TI как раз видел использование различных АЦП в схеме привода.
Spider
Ребят, можно разворошить старое? Чем всё кончилось? sm.gif
Нет ли у кого PDM -> PCM ?
sysel
Цитата(Alexey Belyaev @ May 20 2012, 17:11) *
Ребят, можно разворошить старое? Чем всё кончилось? sm.gif

Кончилось всё запуском этого решения в серию. Довольно удачно получилось:
LPC1754, 96 Мгц.
AD7401A подключен на SSP порт.
клок на модулятор 6МГц.

Поток обработки:
Вход(6 MSPS, 1-bit) -> CIC (3 секции, децимация 80) -> CIC (5 секций, децимация 5) -> FIR (порядок = 54, разрядность коэф. 32 бита, децимация 5) -> Выход (3 KSPS, 24 bit)
т.е. произвожу децимацию в 2000 раз.

Загрузка процессора = 22 % (оценивал осциллографом)
т.е. на обработку одного бита с модулятора затрачивается 3.5 такта (с учетом всех трёх секций фильтра).

Цитата(Alexey Belyaev @ May 20 2012, 17:11) *
Нет ли у кого PDM -> PCM ?

У меня нет.
dumb
Цитата(sysel @ May 25 2012, 14:00) *
Кончилось всё запуском этого решения в серию. Довольно удачно получилось:
LPC1754, 96 Мгц.
AD7401A подключен на SSP порт.
клок на модулятор 6МГц.

Поток обработки:
Вход(6 MSPS, 1-bit) -> CIC (3 секции, децимация 80) -> CIC (5 секций, децимация 5) -> FIR (порядок = 54, разрядность коэф. 32 бита, децимация 5) -> Выход (3 KSPS, 24 bit)
т.е. произвожу децимацию в 2000 раз.


Тоже разворошу былое sm.gif
И сколько получилось реальное разрешение из этих 24 бит?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.