Вступление:
Данный проект начал свое развитие еще из далекого 2010г. Был сконструирован модуль ЦАП на связке AD1955 + DIR9001 , без всяких конфигураторов и т.д.
Первое включение меня ошеломило! Очень понравилось звучание. И я пошел дальше.Начитавшись того что если переключить ЦАП в 16бит. (а это возможно только при наличии микроконтроллера) звук стает еще более натуральный и качественный. Я взялся за поиски разработчика ПО для моего проекта. В скором времени я нашел исполнителя. Он создал мне софт для управления ЦАПом. Но меня не устроил его функционал. И я решил своими силами создать программу для ЦАП.
В программировании на то время я был полный ноль. (я с трудом понимал что такое байт, бит.. о системах счисления я вообще молчу) Начал изучение. Долго не давалось… но спустя некоторое время мне удалось добиться первых результатов.
Итак, спустя год я написал 1 версию программы для новой версии ЦАП (в этой версии была полностью переработана аппаратная часть) устройство было уже построено на современном приемнике WM8804 который по всем параметрам превосходил DIR9001 (убивало в этом приемнике срыв синхронизации SPDIF при грязной сети в доме…) Была полностью переразведена аналоговая и цифровая часть устройства. Микроконтроллер был интегрирован на плату что исключило сбои из за наводок на шлейфы. Микропроцессор тактировался уже от кварцевого резонатора на 4мГц а не от встроенного генератора. Было создано два независимых программных SPI (это позволило регулировать тактовую частоту шины в широких пределах) интерфейса для управления AD1955 и для WM8804 Что также исключило возможность сбоев. Также были заказаны заводские Печатные платы. Плату разводил в старой, доброй, простой программе — Sprint Layout . Некоторые могут сказать что я сошел с ума 🙂 но мне было удобно рисовать в ней, так как я ее отлично знал.
На сегодняшний день уже создана 4 версия программы. Отточена до идеала. В настройках отображается как 4.0SP
Индикация и управление:
Управление осуществляется одним «джойстиком» на четыре положения с центральным нажатием.
Индикация с помощью ЖК дисплея на 2 строки и 16 символов. В данном случае применил Winstar WH1602D
Возможности данного ЦАП:
1) Конфигурирование ЦАПа и приемника на лету (одновременно оба, для тестирования звучания при разных форматах)
2) Регулирование громкости средствами ЦАП. (отключаемая в меню)
3) Функцию HI-END MODE . Останавливается тактовый генератор MCU Отключается LCD , работает только ЦАП и приемник.
Эта опция срабатывает По истечению программного таймера примерно через > 30сек.
При нажатии любой из кнопок запускается MCU и активируется LCD при чем команда не срабатывает при первом нажатии, а только при втором.
(отключаемая в меню)
4) Функцию AUTO SEARCH поиск входа с наличием аудио потока.
Работает следующим образом:
При «пропадании» сигнала высвечивается NO SIGNAL потом через секунду SCAN в правом верхнем углу и после начинает переключать по порядку входы. Как только находит — сканирование прекращается. (функция отключается в меню) Также в этом режиме можно переключать входы кнопками NEXT и PREV.
5) Функцию авто отключения подсветки (настраивается в меню)
6) Устройство имеет на борту три входа: USB , coaxial , toslink и два выхода отключаемые с меню, toslink и coaxial
7) Устройство Умеет сканировать ЧД и выводить на дисплей .Отображаются соответствующие частоты 22kHz, 32kHz, 44.1kHz, 48kHz, 88.2kHz, 96kHz, 192kHz.
8) Так же имеется на борту «Зуммер» Тоже отключаемый по желанию.
9) Авто подстройка цифрового фильтра (отключаемое в меню).
10) Для отладки. Возможность просматривать массив еепром памяти.
11) Подстройка тактовой частоты (можно ставить кварц от 1 до 8МГц) пробовал от 2 до 6МГц
12) и всякие мелкие функции типа сброса настроек и сброса конфигурации к заводским настройкам.
Исходный код написан на языке Си. Это дает большие возможности. Можно без проблем модифицировать код, добавить что то особенное и т.д.
Исходный код хорошо прокомментирован. Благодаря этому программист быстро сможет «въехать» в алгоритм работы.
Приведу пару важных участков кода. А также постараюсь их описать.
// процедура запуска тактового генератора в режиме HI-END mode
interrupt [EXT_INT1] void ext_int1_isr()
{
sleep_disable();
timer_sleep=0;
enable_mcu=1;
//************************************************************//
flags_enab=1; // флаг активирующий подсветку дисплея
min=sek=time=0; // таймер активирующий подсветку
//************************************************************//
LED=1;
timer_delay_read=TCCR1B=TCNT1=timer_sck=0;
}
В этой функции обрабатывается запуск процессора после Power down mode . Если не использовать опцию HI-END mode — можно смело выкинуть кусок кода и часть аппаратной части.
if (in_scan == 0) // отображаем частоту дискретизации
{
if (freg > 5999 && freg < 9000) //32000
{
lcd_gotoxy(0,1);
lcd_putsf(» 32kHz «);
if (flags_sample_rate)
{
data_spi1 = data_spi1 &~ (1<<0);
data_spi1 = data_spi1 &~ (1<<1); // 48kHz
if (flags_sample_rate1)
{
flags=1;
flags_sample_rate1=0;
flags_sample_rate2=1;
flags_sample_rate3=1;
}
}
}
Этот код определяет ЧД для 32кГц (код не совсем оптимизирован в этом плане, но работает отлично. Сейчас сделал бы по другом)
Для других частот код похож. Также в этом участке кода идет определение режима цифрового фильтра — если мы разрешили в настройках управлять автоматически цифровым фильтром.
if (hi_end_mode==1) // Флаг активации этого режима
{
if(++timer_sleep > 250) // счетчик включения индикации HI-END MODE
{
flags_led_active=0;
LED=1; // включаем подсветку
timer_sleep=251;
flags_scan_=1; // поднимаем флаг исключения глюка дисплея (Отображение частоты дискретизации)
timer_delay_read=0; // сбрасываем таймер подсчета импульсов (образцовый таймер)
timer_sck=0; // таймер тактовой
lcd_gotoxy(0,1);
lcd_putsf(» HI-END MODE «);
if (++timer_sleep_enable > 200) // таймер отключения дисплея и МК
{
timer_sleep_enable=0;
timer_sleep=0;
button_active=0; // флаг активации клавиатуры, нужен для исключения выполнения команд когда активирован этот режим
LED=0;
lcd_clear();
flags_led_active=1;
enable_mcu=0; // активируем прерывание
delay_ms(20);
sleep_enable();
powerdown();
}
}
}
Этот код запускает процесс перехода в режим микро потребления. Из кода все довольно хорошо понятно.
void menu_shou()
{
switch (menu)
{
case 0: menu_active(); break;
case 1: menu_mclk_mode(); break;
case 2: menu_data_width(); break;
case 3: menu_serial_data_format(); break;
case 4: menu_de_emphasis(); break;
case 5: menu_pcm_sample_rate(); break;
case 6: menu_out_format(); break;
case 7: menu_reset(); break;
case 8: menu_mute_system(); break;
case 9: menu_version_system(); break;
case 10: menu_reset_system(); break;
case 11: menu_hi_end_mode(); break;
case 12: menu_zummer_enable(); break;
case 13: menu_spdif_enable1(); break;
case 14: menu_spdif_enable2(); break;
case 15: menu_led_control(); break;
case 16: volume_control(); break;
case 17: mode_WM8804_control(); break;
case 18: mode_calibration(); break;
case 19: menu_eeprom();break;
case 20: menu_end(); break;
}
}
Здесь мы можем «наращивать» функции , добавлять пункты меню и т.д.
Исходник имеет линейную структуру. То есть, мы включаем устройство и ходим по настройкам. Также само выглядит и код. вверху — начало меню , вниз — конец.
Необходимые компоненты:
Резисторы СМД счетверенные, шаг – 0.5мм
33 – 100 Ом – 1шт.
4.7к – 1шт.
Резисторы СМД 0603
22 Ом – 1шт.
1к – 1шт.
Резисторы СМД 0805
16 Ом – 3шт.
100 – 3шт.
300 Ом – 1шт.
1к – 11шт.
1.2к – 1шт.
1.5к – 3шт.
1.8к – 1шт.
2к – 5шт.
2.2к – 5шт.
3.3к – 3шт.
5.6к – 3шт.
10к – 6шт.
16к -1шт.
47к – 3шт.
150к – 1шт.
1мОм – 1шт.
Резисторы СМД 1206
0 Ом – 3шт.
1 Ом – 6шт.
4.7 Ом – 6шт.
75 Ом – 12шт.
200 Ом – 1шт.
220 Ом – 2шт.
470 Ом – 1шт.
680 Ом – 5шт.
820 Ом – 1шт.
1к – 4шт.
1.2к – 1шт.
1.8к – 1шт.
2к – 4шт.
3к – 1шт.
3.3к – 4шт.
4.7к – 1шт.
6.8к – 4шт.
10к – 4шт.
33к – 1шт.
1мОм – 1шт.
Конденсаторы СМД 0805 NP0
100пФ – 8шт.
270пФ – 4шт.
560пФ – 4шт.
10нФ – 12шт.
100нФ – 2шт.
Конденсаторы СМД 1206 NP0
10нФ — 19шт.
1мкФ – 5шт.
Конденсаторы танталовые СМД (сниженные габариты)
10мкФ/16В – 4шт.
Конденсаторы выводные Nichicon Stand Power (для аналога)
4700мкФ/35В – 2шт.
4700мкФ/25В – 1шт.
Конденсаторы выводные SAMWA (для цифры) 105гр.
4700мкФ/25В – 1шт.
47мкФ/50В – 1шт.
Конденсаторы выводные Nichicon FG
470мкФ/25В или 470мкФ/16В MUSE – 2шт.
Конденсаторы выводные Nichicon MUSE
47мкФ/16В или 25В – 4шт.
100мкФ/16В или 25В – 1шт.
Конденсаторы выводные Nichicon FG
22мкФ/25В или 47мкФ/25В– 7шт.
Конденсаторы выводные ELNA SILMIC2
100мкФ/16В или 100мкФ/25В – 1шт.
Конденсаторы выводные пленочные WIMA MKP2 или подобные по качеству
10нФ – 5шт.
15нФ – 1шт.
100нФ – 3шт.
680нФ – 2шт.
Конденсатор 2кВ
4.7нФ – 1шт.
Диоды СМД 1206
1N4148 – 9шт.
Ферритовые бусины СМД 0805
2-10мкГ — 1шт.
Ферритовые бусины СМД 1206
2-10мкГ — 5шт.
Ферритовые бусины выводные
?мкг – 8шт.
Резисторы выводные 0.25Вт
300 Ом – 2шт.
10к – 2шт.
Резисторы выводные 1Вт
1 Ом – 1шт.
4.7 Ом – 2шт.
10 Ом – 6шт.
39 Ом – 1шт.
Резисторы выводные 2Вт
2.2 Ом – 2шт.
Стабилитроны выводные 0.25- 1Вт
12В – 1шт.
Диоды выводные
FR207 – 5шт.
Разьем штырьковый двухрядный, шаг 2.54
BH-10 — 2шт.
BH-10 R – 1шт.
Разьем штыревой однорядный, шаг 2.54
ZL202-40G – 1шт.
ZL201-40G – 1шт.
Кварцевые резонаторы
4МГц – 1шт.
12МГц – 2шт.
Кнопка тактовая СМД -1шт. 5мм
Кольцо ферритовое СВЧ наружный диаметр 4мм. – 1шт.
Мотается в два провода 0.1-0.3мм 10витков
Потом провода отделяются на первичную и вторичную обмотку
Кольцо такое можно выколупать с трансформатора гальвано-развязки сетевой карты 100мБит.
Список ИМС и их корпуса:
AD1955
SSOP-28
1шт.
ЦАП
WM8804
SSOP-20
1шт.
Приемник
PCM2705
SSOP-28
1шт.
Конвертер
AD8066
SOIC-8
2шт.
ОУ
LM4562
DIP-8
1шт.
ОУ
ADM1485
SOIC-8
2шт.
Преобразователь
ADUM1100
SOIC-8
1шт.
Развязка
AHC1G125
SOT23-5
2шт.
Ст. Логика
Atmega32/16
TQFP-44
1шт.
Микроконтроллер
WH1602D
…
1шт.
Дисплей
IRLML0030
SOT23
3шт.
Силовой транзистор
BC847
SOT23
1шт.
Транзистор
BC857
SOT23
1шт.
Транзистор
TQ2-5V/A-5W-K
DIP-10
2шт.
Реле сигнальное
LM1117-5V
SOT-223/D-PAK
3шт.
Линейный стабилизатор
LM1117-3.3V
SOT-223/D-PAK
1шт.
Линейный стабилизатор
LM317
D2PAK/TO220mod
1шт.
Линейный регулятор
M5230L
SIP-8
1шт.
Сверхмалошумящий стабилизатор
2SC4793
TO220F
1шт.
Силовой транзистор
2SA1837
TO220F
1шт.
Силовой транзистор
L7808-09
TO220F
2шт.
Стабилизатор общего назначения
L7805
TO220F
1шт.
Стабилизатор общего назначения
MBRA340
SMA
4шт.
Диод Шоттки
MBRA160
SMA
12шт.
Диод Шоттки
TORX179
…
1шт.
Приемник SPDIF
TOTX179*
…
1шт.
Передатчик SPDIF
Гнездо тюльпан
…
4шт.
Гнездо USB-B
…
1шт.
Краткое описание работы меню можно увидеть в архиве.
Также там можно увидеть монтажную схему для сборки устройства.
Схема устройства состоит из 3-х частей.
1) Микропроцессорная
2) Основная (аналог + частично цифра)
3) Мультиплексорная часть.
Схема №1
Схема №2

Схема №3

Эта схема показывает принцип коммутации цифрового сигнала. А также можно понять принцип работы авто поиска. Авто поиск работает очень просто:
Приемник генерирует сигнал отсутствия «аудио», а микропроцессор тем временем перебирает входы. Когда выбран вход с наличием «аудио» приемник снимает сигнал ошибки, и МК перестает переключать входы. Эта функция может отключаться в главном меню.
Фото ЦАП:





Фьюзы ЦАП для прошивки контроллера:
Программа для прошивки Uniprof специально сделал ее скрин, так как она самая простая. Советую шить в ней на маленькой скорости!

Ссылка на программатор: https://avr.nikolaew.org/progr
Измерения:
Данные тесты проводились на бюджетной ЗК ( ~100$ )
В результате получены следующие картинки:




Измерялось при 24бит 44.1кГц.
Скачать список элементов (PDF)
Прикрепленные файлы:
- DAC_HI_END_MEGA32_Sour.zip (15 Кб)
- Exe_DAC_HI_END.zip (15 Кб)
- Звуковая карта HI-END WM8804 V2_5.rar (160 Кб)
- Описание работы модуля+ монтажка.zip (4472 Кб)