Всем привет. Продолжается история изобретения аудиоплеера, и закончится она не скоро. Я так понимаю, это процесс бесконечный. Сегодня рассмотрим новую железяку. Собрал я наконец ЦАП на AK4490 с правильным тактированием как чипа ЦАП, так и источника i2S (мини ПК Nano Pi neo2 / AIR). Модуль разрабатывался как экспериментальный, но тем не менее показал превосходное качество звучания.
Содержание статьи / Table Of Contents
↑ Характеристики модуля
Формат входных данных: PCM (i2S)
Частоты дискретизации: 44.1 КГц, 88.2 КГц, 176.4 КГц, 352.8 КГц; 48 КГц, 96 КГц, 192 КГц, 384 КГц.
Разрядность сэмпла: 32 бит.
Напряжение питания: 5V — DC и 2×12V — AC
Выходное напряжение: 1,5V RMS (синус уровнем 0дБ)
Неравномерность АЧХ: -1.02 дБ
Искажения THD: не хуже 0,01%
Искажения IMD: не хуже 0,004%
Уровень шумов: не хуже -100 дБ
Входные данные модуля PCM в формате i2S, однако AK4490 может воспроизводить и DSD поток. Чувствую, что можно передавать DSD в фреймах i2S шины, так называемый режим DoP. Для этого надо чтобы плеер это поддерживал, и правильно проинициализировать чип. Оставлю это на десерт, займусь попозже. А с PCM всё, выше уже некуда!
Выходное напряжение указано при положении регулятора PGA2310 — 0dB. Питание 12V позволяет поднять его до +11,5 dB (PGA2310 может не только ослаблять, но и усиливать сигнал). Есть мысль скорректировать резисторами в выходном фильтре коэффициент усиления (усилить) и ограничить PGA2310 до 0 db. Придут резисторы — попробую, с контролем искажений.
Измерения опять проводил встроенной звуковухой, результаты гораздо лучше, чем в прошлый раз. Думаю, что в реальности некоторые параметры могут быть и по лучше. Аналоговый фильтр все тот же, немного скорректировал под удобные номиналы резисторов и конденсаторов и все.
↑ Зачем все эти сложности? Для победы над джиттером!
Зачем всё это, почему так, а не иначе? Попробую объяснить. Когда мини ПК сам выдает тактовые сигналы i2S, они дрожат во времени (джиттер), так как формируются с помощью всяких PLL и в последствии, это портит работу ЦАП и отражается на искажениях.Это дрожание прекрасно видны на осциллографе — голубая линия.
Вид. 1 Дрожание тактового сигнала BCLK от мини ПК.
Вид. 2 Отсутствие дрожания тактового сигнала BCLK от ПЛИС
На плате установлены два тактовых генератора, они условно идеальны, с приемлемым джиттером. И задача сводится к тому, чтобы использовать нормальные генераторы и корректно затактировать как источник данных, так и чип ЦАПа.
Рис. 2 Структурная схема.
Когда плеер инициализирует ALSA, модифицированный китайский драйвер шины i2S — sun4i_i2s (я тоже внес в его свои 5 копеек) переключает аппаратную часть i2s на прием тактовых импульсов извне. Дополнительно на GPIO выставляет три сигнала: PA6 — выбор тактового генератора, фактически этот сигнал говорит о том, к какой сетке частот принадлежит данный режим ALSA — 44.1 или 48 КГц. И два сигнала PG6 и PG7 управляют делителем частоты с выбранного тактового генератора (MCLK — Master Clock). После делителя имеем сигналы (BITCLK или BCLK — Bit Clock и LRCLK — Left Rightt Clock, они идут на одноплатный компьютер и на чип ЦАП одновременно. Синхронно с этими тактовыми импульсами мини ПК выдает данные на чип ЦАП. Он выдает данные из аппаратного fifo i2S, который входит в состав SoC Allwinner. Этот буфер наполняет ALSA. А плеер наполняет буфер ALSA, данными, которые декодировал.
Вот и все. Все просто. Здесь следует отметить, что на модуль данные всегда идут в 32-разрядной пачке. Это как автобус на 32 человека, но в нём едут только 8, или 16, или 24, или 32 человека. На осциллограмме это хорошо просматривается, реальные данные аудио смещены влево.
Рис. 3. Желтый — Данные, Синий — LRCLK.
И получается, если частота 384 КГц, да 2 канала, да 32 бит, то частота Bit Clock составляет 24 576 000 — то есть без деления и BCLK = MCLK.
Рис. 4. Схема принципиальная ПЛИС EPM3064A
Для прошивки ПЛИС EPM3064A нужна программа Quartus II 9.1sp2 Web Edition. И программатор USB Blaster.
Инициализация AK4490 реализована через порт SPI. Потому что она на плате не одна, а есть еще и PGA, а она SPI. Порт SPI в моем плеере можно задействовать системный — линукса, это файл /dev/spidev0.0 (в настройках SPI0.0) или 2 порта на моей USB плате расширения. Раньше, на этих пинах просто висела PGA2310 и индикатор уровня громкости. Теперь это однонаправленные SPI порты, на которые можно (в настройках USBSPI0.0) подключить и другие устройства.
Если посмотреть схему ПЛИС можно заметить, что AK4490 и PGA2310 подключены параллельно, не просто параллельно, но и сигналы Chip Select (CS) тоже. По классической схеме параллельное соединение допускается, но в случае разных CS. Я сначала думал, соединю последовательно, данные 4 байта пройдут сквозь PGA2310, первые два останутся в AK, а последние 2 в PGA, после поднятия CS (СS=1).
Но не тут, то было! AK4490 принимает первые два байта после обнуления CS и все, последующие, которые войдут в нее игнорируются, но зато они остаются в PGA. В результате, первые 2 байта которые для AK проходят через PGA, параллельно фиксируются в AK, а следующие 2 не воспринимаются AK, но заходят в PGA и потом CS устанавливается в 1.
Хорошо, что все SPI я завел на ПЛИС, и без труда пересоеденил программно внутри ПЛИС.
↑ Выбор модуля в настройках плеера
C программной точки зрения, модуль ЦАП наследует функционал регулятора громкости. Так как в практически любом чипе ЦАП есть свой регулятор громкости, в моем случае на плате установлен еще и PGA2310. Поэтому в настройках надо раскомментировать модуль BD_ADAK4490S83V10 SPI0:0 и порт, по которому производится управление платой.А регулятор громкости задать как VR_DAC. Что будет означать, что регулятор громкости использовать установленный на плате ЦАП. То есть модуль цап является и регулятором громкости.
Так же можно выбрать BD_AK4490 SPI0:0, это просто поддержка чипа AK4490 в случае когда плата какая-то другая. Здесь порт можно задать i2c, но по i2c я не проверял, так как разводил под SPI. В этом случае регулировка громкости будет производится средствами самого чипа AK4490.
↑ Разъемы модуля ЦАП Разъемы модуля ЦАП
Рис. 5. Разъемы модуля ЦАП.
Подключение выведено на гребенку 2,54. Ох, намучался я с китайскими проводками. Вообще надо было сделать плату подлинее и воткнуть в нее NanoPi. NanoPi не следует размещать слишком далеко от модуля ЦАП. Частоты i2S достаточно высоки. Провода лучше использовать экранированные. Например, разрезать кабель от старых VGA мониторов.
↑ Организация питания
В питании нет ничего особенного, применены обычные стабилизаторы, есть парочка малошумящих. Для питания выходного аналогового фильтра понадобится трансформатор с двумя отдельными обмотками питания на 12V переменки, можно чуть и повыше.Рис. 6. Трансформатор для питания модуля.
Трансформатор лучше применить такой, чтобы нигде не купить и нигде не найти, аудиофильский короче, тут всё понятно я думаю 😊
Рис. 7. Питание выходного фильтра.
Рис. 8. Питание AK4490.
Посмотрел, что люди ставят. LP5907-3.3 заявлена как Ultra-Low-Noise, а LP2985 как Low-Noise. Они используются у меня для питания AK4490, если кто знает, что-то аналогичное Ultra-Low-Noise, но на 5V — пишите в комментарии.
Питание 5V для цифровой части берем от того же блока питания, который питает миникомпютер. Nano PI потребляют мало, рекомендую питать его от линейного стабилизатора и трансформатора. Потребление по 5V всего лишь 300 — 500mA вместе с USB модулем расширения, но это с SD картой вместо жесткого диска.
У AIR есть встроенная память, операционку можно перенести на нее, а в свободный SD слот можно оставить для музыки.
↑ Управление фильтрами AK4490
Вид. 3. Осциллограмма прямоугольника с различными режимами фильтра.
В AK4490 есть различные режимы цифровой фильтрации. Увидеть их воздействие можно на осциллографе при воспроизведении меандра. А вот услышать — это вряд ли. Переключать их можно с клиента на странице «Другие устройства». См. рисунок 9.
Рис. 9. Переключение режима цифровых фильтров в AK4490.
↑ Измерения
Опять я провожу измерения встроенной звуковой картой.🤨 Проигрался немного с настройками. Как оказалось, шумы и искажения зависят от положения ползунка в регуляторе громкости Windows. Как бы там ни было, можно сказать с уверенностью, что в пределах 100дБ результат отличный. Так же радует, что на 50Гц нету никаких бугорков, особенно если учесть, что питание обычное.
Рис. 10. Файл 1КГц, 0дБ, Fs=44,1 КГц
Рис. 11. Файл 10КГц, 0дБ, Fs=44,1 КГц
Рис. 12. Файл 20КГц, 0дБ, Fs=44,1 КГц
Есть мысли захимичить АЦП для измерений, и так же подключить к одноплатному мини ПК. Но пока это только мысли. По идее, что ЦАП, что АЦП — всё должно работать. Пин входа данных i2S свободный.
↑ Загрузки образов и ПО для Nano Pi neo, прошивки
ПО для Nano Pi Neo 2 (aarch64) и Nano Pi Neo Air (armv7). В обоих операционная система Armbian c модифицированным i2S драйвером.Рядом будут лежать и обновляться архивы для обновления бинарного файла моего плеера AC83.
К слову, плеер мой теперь не использует mplayer. Теперь это чисто мой аудиоплеер «AC83» с использованием ffmpeg в качестве декодера аудио форматов.
Клиент под андроид тоже был переписан по-новому, под Qt с использованием QML. Получилось гораздо красивее.
Бинарники плеера могут пойти, а могут и не пойти на других операционных системах, есть некоторые обратные несовместимости библиотек. После добавления поддержки радио с ssl шифрованием потока — переносимость упала.
Логин SSH: root; пароль pi.
В случае использования AIR, для первоначального подключения к мини ПК понадобится USB-TTL переходник для подключения через PuTTY. Далее через утилиту nmtui надо подключится к желаемой домашней WiFi сети и отложить переходник в сторону.
В образах задействованы три звуковые карты. Аудиокарту можно и нужно выбирать с клиента. Теперь такая возможность есть.
Line OUT — Линейный выход — H3 Audio Codec.
SPDIF — On-board SPDIF, выход pin — PA17.
i2S — External DAC или i2s Master в зависимости от режима i2s.
H3 Audio Codec. При использовании линейного выхода доступен регулятор громкости в ALSA mixer. Его можно задействовать в настройках плеера. Регулятор громкости ALSA (выбирается не с клиента, а в файле настроек вручную) с канала «Line Out» (канал можно выбрать с клиента при условии, что выбран ALSA регулятор громкости.
Или можно задействовать встроенный программный регулятор громкости плеера (так же через файл настроек). Линейный выход не аудиофильский, но тем не менее нормально играющий. Его рекомендуется использовать как временное решение, в процессе настройки.
I2S. Режим i2s определяется в файле /boot/armbianEnv.txt выбором оверлея sun8i-h3-i2s0-slave (мини ПК ведомый) или sun8i-h3-i2s0-master (мини ПК ведущий)
SPDIF. SPDIF я не юзал. Посмотрел осциллографом, что поток есть и все. Может быть полезен.
↑ Файлы
🎁Проект в AD17 4.63 Mb ⇣ 29🎁Блок с трансформатором 1.22 Mb ⇣ 20
🎁Схема принципиальная 335.85 Kb ⇣ 46
🎁Список элементов 9.63 Kb ⇣ 20
🎁Прошивка ПЛИС 571.76 Kb ⇣ 20
🎁Пример кода для управления модулем ЦАП 9.79 Kb ⇣ 22
Спасибо за внимание!
Надеюсь, было интересно.
Камрад, рассмотри датагорские рекомендации
🌼 Полезные и проверенные железяки, можно брать
Опробовано в лаборатории редакции или читателями.