Профессиональный ЦАП с микропроцессорным управлением

Вступление:  

Данный проект начал свое развитие еще из далекого 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

tembr68_sch3.png

Эта схема показывает принцип коммутации цифрового сигнала. А также можно понять принцип работы авто поиска. Авто поиск работает очень просто:

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

Фото ЦАП:

tembr68-4.jpg

tembr68-5.jpg

tembr68-6.jpg

tembr68-7.jpg

2013-02-11_220555.png

Фьюзы ЦАП для прошивки контроллера:

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

фьюзы.png

Ссылка на программатор: http://avr.nikolaew.org/progr

Измерения:

Данные тесты проводились на бюджетной ЗК  ( ~100$ )

В результате получены следующие картинки:

генера�%

2013-04-03_195620.png

2013-04-03_195837.png

2013-04-03_195856.png

Измерялось при 24бит 44.1кГц.

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
Схема №1
МК AVR 8-бит ATmega32A 1
MOSFET-транзистор IRLML2502 2
Биполярный транзистор 2N5551 1
Биполярный транзистор 2N5401 1
Линейный регулятор LM7808 1
Линейный регулятор LM1117-N 1
А1 Диод Шоттки MBRA340 1
D1, D2, D5-D8 Выпрямительный диод 1N4148 6
D3 Светодиод 1
D4 Стабилитрон 9 V 1
С1, С6, С7 Конденсатор 10 мкФ 3
С2, С3, С12 Конденсатор 1 мкФ 3
С4, С5 Конденсатор 22 пФ 2
С9-С11 Конденсатор 0.01 мкФ 3
R5, R12-R15, R21, R25 Резистор 1 кОм 12
R6, R8, R16-R19 Резистор 10 кОм 6
R7 Резистор 10 кОм 1
R20, R22 Резистор 47 кОм 2
R23 Резистор 10 Ом 1
R24 Резистор 680 Ом 1
R27 Резистор 75 Ом 3
R26 Резистор 100 Ом 3
Кварцевый резонатор 4 MГц 1
K1.1 Кольцо ферритовое 1
K1.2, K1.3 Реле сигнальное TQ2-5V/A-5W-K 2
LS1 Динамик 1
L1 Дроссель 1
J9.1, J8.2 Панелька BH-10 1
J1-J5, J7, J1 Кнопка 7
Схема №2
D1 Приёмник WM8804 1
Цап AD1955 1
U2, U3 Операционный усилитель AD8066 2
U4 Операционный усилитель LM4562 1
Линейный регулятор LM317HV 1
Линейный стабилизатор MC7805CT 1
Линейный регулятор LM1117-N 1
Линейный регулятор LM1117-N 1
U9 Сверхмалошумящий стабилизатор M5230L 1
A2-A4 Диод Шоттки MBRA160T3 3
D2 Выпрямительный диод 1N4148 1
MOSFET-транзистор IRLML2502 1
Q2 Биполярный транзистор BC547 1
Q3 Биполярный транзистор BC557 1
Q4 Биполярный транзистор 2SA1837 1
Q5 Биполярный транзистор 2SC4793 1
С1, C3, C6, C22, C25-C27, C30, C32, C37, C38C42, C44, C47, C51, C52 Конденсатор 0.1 мкФ 18
С2, C36, C43 Конденсатор 47 мкФ 35B 3
С4, C5, C21, C39, C41 Конденсатор 10 мкФ 5
C7-C10, C19, C20 Конденсатор 100 пФ 6
C11, C12, C15, C16 Конденсатор 270 пФ 4
C13, C14, C17, C18 Конденсатор 560 пФ 4
C28, C29 Конденсатор 390 пФ 2
С31 Конденсатор 0.01 мкФ 1
С33-С35 Конденсатор 2200 пФ 3
С45,С46 Конденсатор 470 мкФ 2
С48-С50 Электролитический конденсатор 4700 мкФ 35В 3
С55-С58 Конденсатор 470 пФ 4
R1, R5, R6, R25, R26 Резистор 100 Ом 7
R3, R4 Резистор 10 кОм 2
R7, R21-R24, R46 Резистор 2.2 кОм 6
R8 Резистор 2.8 кОм 1
R9-R12, R50-R52 Резистор 2 кОм 7
R13-R16 Резистор 6.8 кОм 4
R17-R20 Резистор 3.3 кОм 4
R27, R28 Резистор 22 Ом 1
R29, R34-R37, R39-R43, R45, R49 Резистор 1 кОм 12
R30 Резистор 300 Ом 1
R31-R33 Резистор 75 кОм 3
R38 Резистор 47 кОм 1
R44 Резистор 18 Ом 1
R47 Резистор 470 Ом 1
R48 Резистор 240 Ом 1
К1,1 Кольцо ферритовое 1 Мотается в два провода 0.1-0.3мм 10витков
Гнездо RCA 2
Резисторы без обозначения
Резистор 1 Ом 4
L1-L3 Дроссель 1
Резистор 22 кОм 2
Резистор 10 кОм 9
Резистор 1.82 кОм 1
Схема №3
IC1 Преобразователь ADM1485 1
IC2 Рфзвязка ADUM1100 1
IC3, IC4 ИС буфера, драйвера SN74AHC1G125 2
IC5 Приемник SPDIF TORX179 2
R2, R7-R9, R11 Резистор 70 Ом 6
R3, R6, R10 Резистор 10 кОм 3
R12 Резистор 1 МОм 1
R13 Резистор 300 Ом 1
R14 Резистор 1 кОм 1
R15 Резистор 100 Ом 1
C1 Конденсатор 100 нФ 1
С2 Конденсатор 2200 пФ 1
С3 Конденсатор 10 нФ 1
Tr1 Трансформатор 1