UR5FFR

Радиолюбительские конструкции и программы
It is currently 04 Aug 2021, 01:57

All times are UTC + 2 hours [ DST ]




Post new topic Reply to topic  [ 8 posts ] 
Author Message
PostPosted: 22 Sep 2020, 23:13 
Offline
Site Admin

Joined: 21 Apr 2012, 22:00
Posts: 1172
Location: Odessa
Позывной: UR5FFR
ADAU1761 достаточно интересный DSP который программируется визуально с помощью среды SigmaStudio. Задумывалось по крайней мере именно так - снизить порог вхождения в программирование DSP. Но результат оказался несколько иной - ввиду откровенно хреновой документации и множества багов программирование превращается в квест.
В этом топике я буду постить всякие нюансы использования ADAU1761.


Top
 Profile  
 
PostPosted: 22 Sep 2020, 23:29 
Offline
Site Admin

Joined: 21 Apr 2012, 22:00
Posts: 1172
Location: Odessa
Позывной: UR5FFR
Конвертирование плавающей точки в формат 5.23

Формат данных 5.23 хотя и описан в документации, но кода для преобразования в/из плавающей точки я так и не нашел. AD предлагают это сделать самостоятельно. У меня получился такой код

Code:
#define SIGMASTUDIOTYPE_FIXPOINT_CONVERT(value)     (int32_t((value) * (int32_t(1) << 23)) & 0xFFFFFFF)

float CONVERT_523_TO_FLOAT(int32_t value) {
    return float(int32_t((value & 0x8000000) ? (value | 0xF0000000) : value)) / (int32_t(1) << 23);
}


SIGMASTUDIOTYPE_FIXPOINT_CONVERT преобразует плавающее в целое формата 5.23. Соответственно CONVERT_523_TO_FLOAT выполняет обратное преобразование

Блок деления

В среде есть блок деления. Так вот - никогда, НИКОГДА его не используйте так как реализован он через жопу :) А именно деление вычисляется следующим образом x/y = x*(1/y). Для этого вначале находится обратное значение для y а потом выполняется умножение. Все бы ничего, но в случае если y < 1/15 то вычисление 1/y приводит к переполнению и результат деления получается некоректный.
Проблема описана тут https://ez.analog.com/dsp/sigmadsp/f/q- ... sion-block
Там же есть пример как обойти это ограничение реализовав итерационный алогритм деления

Блок Counter

Есть такой блок который реализует счетчик с ручным сбросом.

Attachment:
2012.11.01_14.10.30.jpg
2012.11.01_14.10.30.jpg [ 22.89 KiB | Viewed 2886 times ]


Я долго ломал голову как же мне из контроллера сделать ему reset. Оказывается необходимо установить, а потом сбросить соответствующий регистр. Причем устанавливать его надо в 1 записанную в формате 5.23.

Code:
  SIGMA_WRITE_REGISTER_UINT32(MOD_COUNT1_ALG0_COUNTALG1RESET_ADDR,0x00800000);
  SIGMA_WRITE_REGISTER_UINT32(MOD_COUNT1_ALG0_COUNTALG1RESET_ADDR,0x0);


Top
 Profile  
 
PostPosted: 29 Nov 2020, 11:19 
Offline
Site Admin

Joined: 21 Apr 2012, 22:00
Posts: 1172
Location: Odessa
Позывной: UR5FFR
ADAU тактируется внешним клоком, причем диапазон тактирования очень широк. Но настройка PLL тактирования в IDE не совсем очевидна

Attachment:
adau_pll.png
adau_pll.png [ 41.31 KiB | Viewed 2487 times ]


Прописываем в поле MCLK Input частоту внешнего тактового генератора. В поле VCO Output вписываем Master clock freq. На скриншоте она равна 1024 * Fs = 1024 * 48000 = 49.152MHz. После этого жмем кнопку Load Parameters. Будут рассчитаны делители N/M/R. Если выдает ошибку то это говорит о том, что для данного внешнего клока параметры рассчитать невозможно - изменяем Input Clock Divider. В случае клока 26MHz установлен делитель на 2


Top
 Profile  
 
PostPosted: 01 Dec 2020, 23:01 
Offline
Site Admin

Joined: 21 Apr 2012, 22:00
Posts: 1172
Location: Odessa
Позывной: UR5FFR
Если вы такой умный что решили почитать документацию по сигмастудии, то аналоговые девицы быстро остудят ваш пыл и заставят себя почувствовать форменным идиотом. Как говорил К. Прутков - "не верь глазам своим". Именно этим лозунгом судя по всему разработчики и пользовались во всю.

Берем достаточно незатейливый блок генератора синусоидального сигнала. Называется он Tone

Attachment:
sinewave014.jpg
sinewave014.jpg [ 2.42 KiB | Viewed 2440 times ]

Теперь надо правильно задать частоту. Смотрим документацию:
Quote:
Frequency - This sets the frequency of the sine tone. Its value is stored as a fixed point 5.23 number, equal to Frequency / (Sample Rate * 0.5).

Ну логично - частота задается в долях от половины семпл рейта. Точно так же она задается и для блоков генераторов управляемых напряжением и все работает - проверял. Меня немного смутило что по умолчанию частота равна 500, ну да фиг с ним - документация ж говорит что надо по другому. Прописал частоту в долях от семплрейт - нихрена не работает. А все потому что ... частота задется задается в герцах!!! Что и было выяснено опытным путем.

Но ошибка не только в документации. В 2019 году в Q&A задали вопрос по установке частоты для Tone и там точно так же напписано что
Quote:
The frequency parameter can be calculated like this: Param = 2 * f / fs. For example, f = 100 Hz, fs = 48K, then Param = 2 * 100 / 48000 = 0.0041667 Not surprisingly, this is also the "voltage" you'd apply to a VCO input to get 100 Hz. out.


Top
 Profile  
 
PostPosted: 12 Dec 2020, 00:37 
Offline
Site Admin

Joined: 21 Apr 2012, 22:00
Posts: 1172
Location: Odessa
Позывной: UR5FFR
Если у вас возникнет желание сделать перестраиваемый notch-фильтр то вас могут ожидать некоторые сюрпризы. Например то, что коэффициенты A1 и A2 хранятся в параметрах с отрицательным знаком. Тоесть если вы в редакторе SigmaDSP пропишите A1=1, то в случае если нужно загрузить этот параметр внешним контроллером надо загружать не 1, а -1. А параметры B0/B1/B2 загружаются без инверсии.
Уже после того как я прошелся по этим граблям я нашел на форуме упоминание об этом.

Так же вы хрен найдете в документации формулы для рассчета IIR коэффициентов notch-фильтра. На форуме техподдержки отыскался пост где есть экселовская таблица.

Более сложные IIR фильтры удобно считать в Iowa Hills IIR Filter Designer. В IIR фильтре можно загружать коэффициенты из текстового файла. Формат такой - по одному коэффициенту на строчку, порядок b0,b1,b2,a1,a2 (a0 всегода 1). Десятичная точка всегда точка а не запятая! Иначе IDE падает с ошибкой.

При загрузке значений надо учитывать порядок следования байт. В ADAU1761 он big endian - первым идет самый старший байт. А в атмеге - less endian. Как следствие массовая загрузка регистров возможна, но их надо подготовить с реверсированием байт в словах.

Про загрузку тоже отдельная история. Safeload может загрузить не более 5 слов. Если у вас перестраиваемые фильтры высокого порядка (чебышев например) то надо останавливать DSP или отключать выход, грузить параметры и потом его заново стартовать. При таком подходе артефакты есть но они минимальны.

Еще любимый глюк SigmaDSP - самопроизвольно сбрасывать некоторые регистры. В частности регистр sample rate, dsp enable и dsp run :) Как следствие после загрузки программы нифига не работает. Поэтому загрузка должна выглядеть примерно так:

Code:
  default_download_IC_1();
  SIGMA_WRITE_REGISTER_BYTE(REG_SAMPLE_RATE_SETTING_IC_1_ADDR,1); // set samplerate to 48kHz
  SIGMA_WRITE_REGISTER_BYTE(REG_DSP_ENABLE_REGISTER_IC_1_ADDR,1); // enable dsp
  SIGMA_WRITE_REGISTER_BYTE(REG_DSP_RUN_REGISTER_IC_1_ADDR,1); // run dsp


Top
 Profile  
 
PostPosted: 26 Dec 2020, 13:45 
Offline
Site Admin

Joined: 21 Apr 2012, 22:00
Posts: 1172
Location: Odessa
Позывной: UR5FFR
Блок регулирования уровня с плавным нарастанием/спадом (slew). Выглядит вот так:
Attachment:
sw_slew.png
sw_slew.png [ 2.21 KiB | Viewed 2086 times ]

Традиционно вы не найдете в документации никакой информации как связанно время нарастания/спада с параметром slew. Информация нашлась на форуме:
Quote:
- Rise and fall times were identical
- Increasing the slew number by 1 doubles the slew time (a power-of-2 relationship)
- The slew numbers useful in typical applications range from about 8 to 15

Таблица соответствия параметра времени нарастания/спада
Attachment:
sw_slew_rate.png
sw_slew_rate.png [ 9.49 KiB | Viewed 2086 times ]


Top
 Profile  
 
PostPosted: 08 Feb 2021, 19:04 
Offline
Site Admin

Joined: 21 Apr 2012, 22:00
Posts: 1172
Location: Odessa
Позывной: UR5FFR
Чебышев тип II сделан в адау не для людей :) Вместо того чтобы задавать частоту среза по уровню 3дб там задается частота максимального подавления ближайщая к частоте среза. Например если фильтр 14го порядка с подавлением 80дб то чтобы получить частоту среза по уровню 3дб равную 3кГц в адау надо в блок фильтра прописать частоту 3.78кГц :)
Математика пересчета достаточно простая и есть в википедии


Top
 Profile  
 
PostPosted: 17 Feb 2021, 21:04 
Offline
Site Admin

Joined: 21 Apr 2012, 22:00
Posts: 1172
Location: Odessa
Позывной: UR5FFR
В сигмастудии есть полезная тулза которая генерирует массивы коэффициентов для простых фильтров. Казалось бы проще некуда - генерируем и загружаем. Но беда в том, что коэффициенты студия генерирует в порядке B0B1B2A0A1, а для ADAU1761 коэффициенты фильтра в памяти идут в другой последовательности - A0A1B0B1B2. Естественно что при неправильном порядке коэффициентов фильтр не работает. Решение - или руками правим сгенерированные коэффициенты, или пишем код который меняет их порядок на лету при загрузке.

А над следующим глюком я рыдал до слез. Есть среди блоков дженерик фильтр 1го порядка. Выглядит вот так

Attachment:
gen1storder.png
gen1storder.png [ 5.69 KiB | Viewed 1569 times ]


Вот вы как думаете - какой тип фильтра изображен на скриншоте? Логично предположить что ФНЧ. Ставим стимул и пробу, строим график - таки да, ФНЧ.

Attachment:
gen1storder_graph.png
gen1storder_graph.png [ 26.67 KiB | Viewed 1569 times ]


А вот хренушки :) Студия генерирует коэффициенты с точностью до наоборот. Если вы заказывали ФНЧ - вам сгенерится в результате ФВЧ. А если вам нужен был ФВЧ. то будет сгенерирован ФНЧ. Милая такая фича из-за которой я потратил лишние 15 минут.


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 8 posts ] 

All times are UTC + 2 hours [ DST ]


Who is online

Users browsing this forum: No registered users and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Group