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

 Данный проект начал свое развитие еще из далекого 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) и всякие мелкие функции типа сброса настроек и сброса конфигурации к заводским настройкам.

Исходный код написан на языке Си. Это дает большие возможности. Можно без проблем модифицировать код, добавить что то особенное и т.д.

Исходный код хорошо прокомментирован. Благодаря этому программист быстро сможет "въехать" в алгоритм работы.

Приведу пару важных участков кода. А также постараюсь их описать.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// процедура запуска тактового генератора в режиме 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 - можно смело выкинуть кусок кода и часть аппаратной части.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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кГц (код не совсем оптимизирован в этом плане, но работает отлично. Сейчас сделал бы по другом)

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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();
      }
   }
 
 }

Этот код запускает процесс перехода в режим микро потребления. Из кода все довольно хорошо понятно.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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кГц.


Отправить комментарий

0 Комментарии