Питание
Начнем с питания. Чип имеет 3 питания. Digital 1.8V, 3.3V. Analog 3.3V или 5V. Причем 1.8V можно получить либо от внешнего либо от внутреннего источника питания. В зависимости куда подключен вывод LDDE. Если нога LDDE на 3V3 берется внутренний источник. Но на него надо внешне подключить конденсатор
Схема немного "паукообразная" и я как-то не так провел пальцем по линиям. Подключил наоборот. Пришлось добавить внешний LDO на 1V8. Резать дорожку под микросхемой QFN и подводить под нее сигнал не получилось
Сброс
Требуется подать 1 на PDN pin и после этого установить RSTN bit в регистре управления с аресом 00H
Код сброса AK4452
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_Delay(100);
/*
for (int i=1; i<128; i++)
{
// the HAL wants a left aligned i2c address
// &hi2c1 is the handle
// (uint16_t)(i<<1) is the i2c address left aligned
// retries 2
// timeout 2
uint16_t addr = (uint16_t)(i<<1);
HAL_StatusTypeDef res = HAL_I2C_IsDeviceReady(&hi2c1, addr, 2, 50);
if (res == HAL_OK) {
// i = 10 addr = 0x20 Находим адрес AK4452
printf("0x%X", i); // Received an ACK at that address
} else {
printf("Error", i); // Received an ACK at that address
}
}
*/
Аттенюатор
В микросхеме есть регулятор уровня. Но к моему разочарованию использовать его можно только для сглаживания щелчка Mute. Имеется 256 уровней (8bit) с шагом 0.5db. Было бы здорово организовать аппаратный регулятор громкости на этом чипе. Пока не удалось это попробовать
Регистры
Коммуникация с AK4452 осуществляется по шине I2C выставлением на 13 пин 3V3. Есть возможность сконфигурировать SPI
13 pin I2C - Control Mode Select Pin
“L”: 3-wire serial control mode
“H”: I2C Bus serial control mode or Parallel control mode.
Для запуска AK4452 достаточно выставить только один регистр 00H
ACKS=1 - автоматически детектировать MCKL
DIF2-1=NNN - Выставить скорость обмена и формат данных
RSTN=1 - Надо сделать сброс внешней ногой PDN и потом выставить этот бит в 1 (см. Сброс и начало работы)
STM32 кроме I2S поддерживает так же LSB/MSB justified. Наверное режимы будут полезны для совместимости специальных контроллеров управления без I2S стандарта
Аналоговый выход
Преобразование дифференциального сигнала в сигнал с общей землей
Выход дифференциальный. Я взял сдвоенный ts922. Операционный усилитель не дорогой, может работать на наушники 32 Ом. Rail-to-rail, high output current, dual operational amplifier
На фильтры в обратной связи операционника я конечно забил, для простоты конструкции. Думаю в следующей итерации добавить, если она будет
Схемотехника
Отмечены ошибки и схема дополнительного внешнего питания 1V8. AOUTL1P Это положительный дифференциальный выход Левого канала, соответственно AOUTL1N отрицательный. P-positive N-negative. Неправильное соединение резисторов в цепи обратной связи для одного из каналов
Включив тест я получил на дифференциальных выходах AK4452 сдвинутую на 180 градусов синусоиды. На выходах была странная картина. Один вход обрезался
The analog outputs are full differential outputs and 2.8Vpp (typ, VREFH1 - VREFL1 = 5V) centered around VREFH/2. The differential outputs are summed externally, adding voltage VAOUT is calculated as (AOUT+) - (AOUT). If the summing gain is 1, the output range is 5.6Vpp (typ, VREFH1 - VREFL1= 5V). The bias voltage of the external summing circuit is supplied externally. PCM input data format is 2's complement. The output voltage (VAOUT) is a positive full scale for 7FFFFFH (@24bit) and a negative full scale for 800000H (@24bit). The ideal VAOUT is 0V for 000000H(@24bit)
Амплитуда на выходе AK4452 достигала около 2 вольта!
Даже заменил операционный усилитель на LM358 и уменьшил усиление изменением номиналов резисторов в обратной связи. Ничего не помогло
Посмотрел характеристики TS922 внимательнее и проблема очевидно крылась в ограничении характеристик по дифференциальному входу
The differential voltage is the non-inverting input terminal with respect to the inverting input terminal. If Vid±1 V, the maximum input current must not exceed ±1 mA. In this case (Vid > ±1 V), an input series resistor must be added to limit the input current
В референсном дизайне оценочной платы операционный усилитель видимо не имеет таких ограничений, поскольку питание операционного усилителя ДВУХПОЛЯРНОЕ и значительно выше питания самого AK4452. Поэтому проблем с перегрузкой нет
Выход или делать резисторный делитель или уменьшать VREFH или "гасить" программно через центр 0x80000 для 16bit и 0x800000 для 24bit. Но есть ещё поддержка 32bit см. Таблица режимов и форматов данных
VREFH значительно уменьшать не получится. VREFH1 min AVDD-0.5
Программно уменьшать это снижать разрядность или динамический диапазон, что не приемлемо
Остается поделить уровень сигнала до операционного усилителя
Следующая итерация
Попытка подружить ЦАП с Усилителем питаемым однополярным источником питания не получились. Посмотрел как это делают в Texas Instruments
Обратная связь по положительному и отрицательному входу дифференциального операционного усилителя различна. В одном случае она последовательная в другом параллельная, что в свою очередь влияет на входное сопротивление каждого из каналов. Чтобы исключить влияние этих входных сопротивлений/импедансов применяют согласовывающий буфер, для каждого входа
AKM еще и активные фильтры низких частот второго порядка добавили в буфер
Преобразователь двухполярного напряжения TPS65135 питает TPA6120A2. На сколько я понял, TPA6120A2 это популярная микросхема у аудиофилов
Небольшая ремарка. Питание будет только +5В/-5В
Подумал что может тогда и аналоговую часть ЦАП запитать +5В?
Коэффициент Нелинейных Искажений + Шум (THD+N) различается почти на 10dB
Не так давно заказывал TPS61040. Смущает, что изначально она проектировалась для питания светодиодов
The device is ideal to generate output voltages up to 28 V from a dual-cell NiMH/NiCd or a single-cell Li-Ion battery. The part can also be used to generate standard 3.3-V or 5-V to 12-V power conversions.
Для целей фильтрации питания после импульсных преобразователей есть специальный набор микросхем. Например LT3042. Правый край показывает величину подавление на частоте импульсного преобразователя, большинство из них работает на частоте 1..2 МГц. Левый край это сглаживание 50Гц-60Гц после выпрямителя блока питания
Вообще микросхема эта относительно дорогая. И для полного HiEnd надо запитать каждый канал от отдельного стабилизатора. Например в серии AK4490 наружу выведены отдельные пины, для питания левой и правой аналоговой части
Хотя в datasheet и показан общий источник, я встречал схемы питания именно с раздельными стабилизаторами для каждого канала и внутренних опорных напряжений. Это сделано чтобы снизить влияние между каналами. На сколько это оправдано и заметно на слух вопрос, но снятые АЧХ может показать влияние при определенных условиях
Для питания VREFHL/R в демо плате AKM применяется такое решение. Буферный усилитель (повторитель напряжения)
Для сравнения характеристики подавления пульсаций в зависимости от частоты обычной LM1117
Если не получится кину перемычку и будет 3.3В как прежде. На всякий случай добавил фильтрующую LC цепочку на выход. Хотя это может быть источником дополнительных помех. Посмотрим..
Программная часть
Потратил время на выяснение почему не работает I2S через DMA при использовании HAL. Оказалось, что куб генерирует инициализацию в неверном порядке. Сначала надо MX_DMA_Init() а потом MX_I2S3_Init(); В комментариях наверное появятся рекомендации выкинуть HAL и писать в ручную. Но можно допустить такую ошибку и самому. Где-то в недрах мануалов должна быть описана эта ситуация. А вы знали о ней?
Исправление последовательности инициализации
DMA must be initialized before ADC peripheral, but generated code performs initialization in wrong order. It is well known minor flaw in default configuration of current STM32CubeIDE. Try to change
MX_GPIO_Init();
MX_I2S3_Init();
MX_DMA_Init(); // wrong order
to
MX_GPIO_Init();
MX_DMA_Init(); // right order
MX_I2S3_Init();
To make permanent changes,
Open "Project Manager" (tab near Pinout / Clock Configuration)
Project Manager → Advanced Settings → Generated Function Calls
Use tiny arrow buttons near this list to move MX_DMA_Init() above MX_I2S3_Init()
Save the project, generated code will have correct order
PCB
Отделил питание цифровой и аналоговой части на разные стабилизаторы. Взял AMS1117 3V3. Думаю хорошо бы подошел HT7833. AMS1117 у меня много для экспериментов, лента на 100 шт. Так же для устранения попадания паразитных частот от контроллера STM32, сделал "отдельную" аналоговую землю. Под ногами кварцевого резонатора убрал землю. Надо расположить в следующей итерации как можно ближе к STM32
PCB 2
Развел новый вариант на другом усилителе для наушников
Стабилизатора питания теперь три . На 3В, 5В и +5В/-5В. Точнее 3 источника питания HT7833, TPS61040 и TPS65135. Как то сложно для плеера, вы не находите?
Пока ждал новую версию платы захотел попробовать новый усилитель, который распаян отдельной платой. Купил в широко известном в узких кругах магазине
Во первых столкнулся с сильным перегрузом выходного сигнала. На выходе R16, R17 не референсного значения. Перепаял на 75 Ом. Но это не особо помогло. По питанию была сильная помеха, в момент пиков. Я уже стал грешить на недостаточную емкость в фильтре питания, но все оказалось проще
R14-R15 стояли 2.2 КОм вместо 820 Ом. Можно сказать, что монтаж не соответствует схеме. Вместо усиления равного единице получается два-три. При этом изменение номиналов было только для отрицательного входа. R1-R4 тоже не соответствовали номиналу. Вместо 470 Ом стояли 120 Ом. Отдать под Электронный трибунал, за такую работу!
Вот такие сюрпризы
Помеха по питанию +5/-5 осталась 100 мВ/200 мВ
После того как я перепаял резисторы, все заиграло новыми чистыми красками. Сразу почувствовал, что наушников за 25$ не хватает. Бубнят они сильно. Небольшой звон тоже присутствует. Динамический диапазон чувствуется. Слабые звуки слышны отчетливо. Ощущение как в концертном зале со средненькой акустикой
Запустил плеер из урока STM Урок 46. I2S AUDIO. Часть 1
Пробовал stm32-i2s-examples. Пример без DMA, урок более грамотно составлен. Подозреваю часть взята из примера STMicroelectronics
На тот момент выглядело это так. Подумал перенести MP3 плеер Helix отсюда Программный декодер MP3(+). Переход на платформу STM32F407
Есть у производителя STM32 своя либа без исходных кодов, но оптимизированная. Интересно как реализована management of input signal volume with negative gains in range [-80 dB: 0 dB] with 0.5 dB. Можно ли это как полноценную регулировку уровня звука использовать?
Some features
MP3 encoder (MP3Enc): encoder for MPEG-1,2 or 2.5 formats (for layer 3 only) supporting fixed or free format bit rate for mono or stereo audio input streams.
Gain manager (GAM): management of input signal volume with negative gains in range [-80 dB: 0 dB] with 0.5 dB granularity without compression
Graphical equalizer (GREQ): 5, 8 or 10 bands. Adjustable gain factors from -12 dB to +12 dB in standard mode
X-CUBE-AUDIO ACTIVE - Audio effects software expansion for STM32Cube
Есть еще проект USB микрофона с использованием эквалайзера от Andy I2S USB Microphone
Из этого проекта сколхозил (см. GitHub) регулятор громкости. На самом деле можно было и из примера ST взять. Регулятор как и Эквалайзер программный. Отъедает ресурсы системы
Вызываются части обработки звука последовательно. Причем с возвратом результата в исходный буфер, что удобно
Вызов процессинга регулировки громкости и эквалайзера
_graphicEqualiser.process(_processBuffer, MIC_SAMPLES_PER_PACKET / 2);
_volumeControl.process(_processBuffer, MIC_SAMPLES_PER_PACKET / 2);
В чипе имеется дополнительный функционал по регулировке звука и фильтры
Daisy Chain
AK4452 Может работать в четырех, восьми и шестнадцатиканальном режиме. Чипы в таком режиме составляются в последовательную гирлянду
Регулировка качества звука
Режим регулировки качества звука. Не выяснил что это подразумевается
Цифровые фильтры
Как написано в описании предоставляется различная окраска звука. Видимо что-то наподобие Джаз/Поп/Рок предустановок
Выводы
В заключении скажу что я слушал маленькую широкополосную колонку на cs4434 и pcm5102 разница была заметна невооруженным ухом, так сказать. Что касается AK4452 DAC отличный. Моих бюджетных Philips RP‑HTF295 наушников явно нехватает для такого DAC и усилителя. Посоветуйте в коментариях, что взять на пробу
Теплый ламповый звук 1956 Silvertone 1333 хорошо бы подошел для такого ЦАП
Сылки на материалы из статьи
https://www.akm.com/eu/en/products/audio/audio-dac/ak4452vn/
https://www.analog.com/media/en/technical-documentation/data-sheets/3042fb.pdf
https://files.teson.ru/iblock/a85/a85a6324951de60cde7553b5d6f5cc57/kit_9_2019.pdf
https://www.ixbt.com/multimedia/sound-faq.shtml
https://www.st.com/en/embedded-software/stm32-audio100a.html
Комментарии (9)
Chaa
10.12.2021 09:35+3Автор, вы видимо увлекаетесь цифровыми схемами, STM32 и все такое. Это здорово, но вам стоит подтянуть теоретические знания про аналоговые вещи. Потому что вы пишете совершенную дичь, особенно там, где картинка с PCM1792.
Далее, ОУ в выходном ФНЧ должны бороть остатки от работы цифрового фильтра, это шум от сотен килогерц до десятков мегагерц. Ни TS922, ни тем более LM358, здесь не подойдут. Из дешевых возьмите OPA1656. И да, и резисторы, и конденсаторы в ФНЧ обязательны.
Было бы здорово организовать аппаратный регулятор громкости на этом чипе. Но не получится
В даташите есть целый раздел "Output Volume".
app-z Автор
10.12.2021 17:09В даташите есть целый раздел "Output Volume".
Да это именно для Mute уровни. Я отметил это в статье и конечно пробовал срачала исподбзовать регистор для регулирования уровня выходного сигнала.
Вы этот DAC запускали? У вас получилось сделать регулятор выходного уровня?
app-z Автор
10.12.2021 19:30Может быть вы правы на счет Output Volume, но когда я менял значение регистра звук пропадал. Надо перепроверить
sterr
10.12.2021 20:57Почему нельзя изначально сделать нормальное стандартное питание +-15в? Тогда все проблемы сразу уйдут. Почему вы не понимаете что помеха 200мв по питанию в 5в и 15в - это абсолютно разные вещи? Плюс динамика. Че вы все время катитесь в низковольтку? Поставьте нормальный операционник в 50в/мкс и радуйтесь звуку.
AndreyDmitriev
Спасибо, всегда была любопытна схемотехника такой штуки.
По наушникам могу посоветовать попробовать Sennheiser HD599. Мне очень нравится конструкция, ну и звук неплохой. Я их с ibasso dx50 использую и всё нравится. Но они открытого типа.
KakOS
Я бы автору посоветовал сходить в аудиомагазин по типу DrHead, где можно послушать почти всё, ну и послушать сначала несколько ушей совсем дорогих, как референс, а далее по своему бюджету слушать что похоже на понравившиеся уши.
Субъективщина конечно, каждый по разному слышит (или не слышит) казалось бы одни и те же нюансы. Ранее использовал HD598 (минорные отличия от 599), на свои деньги конечно хороши. Однако после Focal Elear и Westone B50 Sennheiser HD5xx-HD6xx звучат довольно мутно, детализации сильно не хватает.
AndreyDmitriev
Абсолютно согласен. Как по мне, так с качественным звуком дела обстоят также как и с вином - я довольно легко отличаю вино за пару евро от вина за десятку, однако если поднять ценник, скажем до тридцати евро, то там отличия для меня невелики (за редкими исключениями). Ну и есть ещё красное и белое - это как накладные уши или затычки. Я вот ненавижу затычки. А Зеннхайзеры мне нравятся тем, как они на голове сидят (у меня ещё PXC 550 есть, но это для улицы и командировок). Вообще тут главное - вовремя остановиться, иначе ведь и до прогрева проводов можно дойти...