Зачем

Как и любой человек, я люблю все новое, а уже если это новое в области увлечения и получения удовольствия, то это вдвойне приятно.

Но гораздо более приятно, когда новое можно сделать своими руками. Поэтому послушав и сравнив свой ЦАП на базе ESS9038Q2M с ЦАПом построенным на R2R технологии, несмотря на технические ограничение R2R, и обнаружив совершенно неожиданные плюсы второго, захотелось что-то подобное себе.

В погоне за вкусным звуком своих любимых песен был куплен Soekris 1021 - платка DIY, которая по вполне удобоваримой цене, давала тот самый приятный звук, глубокую сцену, и выигрывала у стандартного китайца Topping D50s не по измерениям, а именно по личным впечатлениям от прослушивания. Ссылка на саму плату и ее описание тут.

Далее будет описание проекта с небольшими порциями электроники и Ардуино.

Требования к проекту

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

Поэтому был взят Ардуино НАНО на базе которого и стал строится ЦАП.

В качестве монитора взят стандартный 16x2 тектовый контроллер, а в качестве управлялки использована одна кнопка.

Общая конструкция

Изначально, планировался один блок питания, выдающий ±9 вольт как и требуется схеме Soekris, но так как инвертированную схему с общей землей неудобно использовать для работы с другими уровнями питания, а так же с возникшей проблемой медленного старта Ардуино, которая отставала от практически мгновенного старта схемы ЦАП и не успевала к первому выводу установок которые ЦАП выплевывает по UART, то пришлось заиметь второй трансформатор, который питает отдельными 12 вольтами саму Ардуино, и дает 24В для управляющего питания на реле, которые и включают ЦАП при подачи 5 вольт с пина Ардуино на транзисторный ключ.

Общая схема питания выглядит примерно так (я не специалист в рисовалке и EAGLE не имеет картинок ни схемы монитора ни Ардуино, ни даже использованных типов реле, поэтому не судите строго - схема дает представление об идее и подключениях).

Первый БП имеет в составе два LM317 для стабилизации выходных 9В с обеих обмоток с радиаторами, и дополнительные фильтрующие конденсаторы на 47мФ, а второй не задается такой целью, так как получает нужные 12 и 24 вольта с обмоток второго трансформатора. Более того ни управление реле ни Ардуино, не нуждаются в стабилизированном питании.

Немного описания

Soekris доступный по ссылке представляет собой немного нестандартное решение для входа с USB при этом полностью соответствует моему личному представлению о правильной организации системы асинхронной передачи данных.

А именно - в нем реализован входной буфер FIFO который помогает избежать затыков, рассинхронизации клоков, и прочих стандартных болезней на входе в ЦАП по USB.

Кроме того, все управление осуществляется через обычный интерфейс COM порта, что дает легкую возможность управлять системой через Ардуино Serial.

Поэтому у Ардуино задействован стандартный железный Tx/Rx транспорт, для монитора используется обычная стандартная система через I2C, управление обычной кнопкой с софтварным PULL_UP.

Реализован отложенный старт, и включение ЦАП осуществляется отдельным цифровым выходом подключенным к базе транзистора, виден на схеме, с помощью которого открывается проход на землю 24В требуемых двумя реле для включения и подачи питания на ЦАП.

В стандартном режиме на мониторе отображен вход, используемый поток (PCM/DSD, 44K / 192K и т.д. и текущий фильтр 1 из 4 выбранных). Долгое нажатие включает поочередно режим смены фильтра, режим смены входа и может по кругу вернуться в стандартный режим. При отсутствии действия на кнопке в течении 30 секунд возврат обратно автоматический.

Короткое нажатие переводит экран в режим стареньких индикаторов, имитация которых реализована с использованием второго выхода с ЦАП (там два аналоговых выхода для использования чистого выхода или буфера с ОП усилков). Я использую для прослушивания чистый выход ЦАП без операционников, а буферный выход заведен на две ардуиновские аналоговые ноги, состояние которых оценивается и выводится простеньким алгоритмом в виде аналоговых уровневых индикаторов.

Код

Код можно найти тут https://github.com/Gromush/adac на гитхабе.

Скетч поделен на файлы по тематике и легко модифицируется под любое изменение. Все константы зашиты в defs.h, в C формате, тем самым не надо бегать и искать где, что валяется.

Писать описания кода - дело неблагодарное, поэтому только суть.

Все константы для восстановления настроек пользователя лежат в EEPROM

Вся настройка в setup()

void setup() {
  
  sprintf(VersionString, "FW:  %s", VERSION_STRING);
  saved.bytes.filter = EEPROM.read(SAVED_ADDR_FILTER);
  saved.bytes.input = EEPROM.read(SAVED_ADDR_INPUT);
  SetupLed();
  SetMainPwrOn();
  InitLCD();
  ButtonInit();
  LCD_Print(0,0, "Starting...", true);
  LCD_Print(0,1, VersionString,false);
  LCD_PritLogo(12,0);
  analogReference(DEFAULT); 
  analogWrite(BRIGHTNESS,BRIGHTNESS_VAL);
  InitSerial();
  GetGConfig()->inputType = UNINIT_VAL;
  GetGConfig()->mode = MODE_NORMAL;
  //DAC ON
  pinMode(DAC_PWR_ENABLE,OUTPUT);
  digitalWrite(DAC_PWR_ENABLE, HIGH);
  SetPwrRdyOn();
  WaitSerialChar(INFINIT);
  GetDACDataSerial();
  
  if (saved.bytes.filter == 0xFF)
  {
    saved.bytes.filter = GetGConfig()->FilterNum;
    saved.bytes.filter = GetGConfig()->inputType;
    EEPROM.write(SAVED_ADDR_FILTER, saved.bytes.filter);
    EEPROM.write(SAVED_ADDR_INPUT, saved.bytes.input);
  } else
  {
    // Put saved data to struct and DAC
    SetFilter(&saved, true);
    SetInput(&saved, true);
  }
  GetDACDataSerial();
  PrintDisplay();
}

Функциональность легко отключается в main функции которая по сути вызывает блочно каждый элемент.

void loop() {
  //
  //CheckMode();
  //
  ButtonAction(&saved);
  BlinkRdyLed(gBConf);
  GetDACDataSerial();
  ReturnToMainMode();
  IndicatorAnalogs();
 
}

Заключение

Надеюсь мое решение будет полезно тем, кто тоже хочет сделать себе простой и качественный DIY ЦАП и сможет рассмотреть вариант системы как отправную точку.

Комментарии (34)


  1. Gromushka Автор
    15.10.2022 19:14
    -1

    Придется написать комментарий отдельно. Для тех кот в танке, это не тема о том, что слышат или не слышат, не о том, какой формат лучше PCM или DSD, не о том, услышат ли разницу между встройкой и нормальным ЦАП.

    Тема про то, как взяв DIY ЦАП от Soekris и прикрутить к нему Ардуино с БП и кодом для Ардуино.


  1. GennPen
    15.10.2022 10:47
    +9

    Думал статья будет как собирался ЦАП на КДПВ.
    А тут просто ардуину подцепили для снятия показаний, еще и зачем то два отдельных трансформаторных блока питания.

    Да и "цап на рассыпухе", чем он так хорош в отличие от нормального? Только без аудиофильских субъективных терминов типа "приятный звук", "глубокая сцена" и т.п.

    Hidden text

    Для сравнения графики искажений ES9038Q2M и тот, который на КДПВ.


    1. Gromushka Автор
      15.10.2022 13:54
      -12

      О графики!!! Как же могла тема ЦАП на R2R матрицы обойтись без этого. И да - ответа не будет, а знаешь почему? Он уже есть внутри текста и про причине двух трансформаторов, и о причине по которой был взят этот ЦАП. И да - когда я слушаю музыку - я не слушаю график, а ты слушай ES9038Q2M.


      1. GennPen
        15.10.2022 15:10
        +5

        Извиняюсь, что задел за живое.

        И да, я слушаю через встроенную в материнку звуковуху, мне пофигу какой там цап стоит.

        И да, в материнках сейчас ставят более-менее нормальный звук, а не перделки с миллионом искажений как раньше.


        1. Gromushka Автор
          15.10.2022 15:48
          -7

          Ну да все стандартно. Какие-то фантастические способности не только оценить звук по картинкам, но и телепатически определить что живое там задействовано у собеседника. Такой жирный троль, что даже скучно.


          1. GennPen
            15.10.2022 17:52
            +6

            Я вам так скажу, что акустика через которую вы слушаете звук и помещение вносят горааааздо больше искажений, чем ЦАП через который это все воспроизводится. И в домашних условиях в слепом тесте (дабы исключить влияние эффекта плацебо) вы не услышите никакой разницы между платой за 2т.р. с Алика на ES9038Q2M и "цапом на рассыпухе" за 20т.р.


            1. Gromushka Автор
              15.10.2022 19:09
              -7

              Как все запущено то…


        1. Bablozavr
          15.10.2022 18:47
          +1

          >я слушаю через встроенную в материнку звуковуху

          а зачем ты этим гордишься? ) ничего не могу сказать про этот соекрис, но в наушниках за хотя бы 10тыр разница между встройкой и USB-звукашкой за 7-12тыр просто колоссальная. вот дальше(дороже) уже труднее разницу услышать.


  1. tormozedison
    15.10.2022 11:31

    ЦАП на резисторах, помню, собрал вскоре после приобретения 386-го. Первое впечатление — ничего себе, что эта машина, уже порядком устаревшая к тому моменту, оказывается, может.


    1. Gromushka Автор
      15.10.2022 13:55

      На деле тут датчанин провел неплохую работу над ошибками. В отличии от современных тут есть разделение клоков, FIFO обеспечивающее полное отделение воспроизведения от транспорта, более интересные решения в софте ( FPGA Xilinx на борту ).

      Звук мне очень зашел.


      1. Javian
        15.10.2022 18:01

        Нет предела совершенству. Попробуйте после PCM перейти на DSD, используя соответствующий ЦАП.

        DSD цап DSC1 от Signalyst
        DSD цап DSC1 от Signalyst


        1. yroman
          15.10.2022 18:50
          +1

          DSD, безусловно, хорош (особенно трансферы классики с мастер лент), вот только контента в DSD не так много, как хотелось бы. А перегонять из PCM (пусть даже через тот же HQPlayer) это такое себе. Ну и отмечу, что вместо DSC1, имхо, стоит посмотреть на более продвинутые ревизии.


          1. sim2q
            15.10.2022 19:22

            очень извиняюсь и надеюсь я как слушатель (*)mp3 своим вопросом не оскверню сей возвышенный тред, но.... тут же трансформаторы!?!?
            *mp3 - не от хорошей жизни - новое во flac не особо ищется....


            1. Javian
              15.10.2022 19:34

              Трансформаторы для Балансного подключения. Действительно важная деталь - при покупке китайских, но недешевых трансформаторов оказалось, что они умудряются в обмотках не одинаковое количество витков мотать, чем всё портят. Как в сказке "Не гонялся бы ты, поп, за дешевизной" и сразу надо покупать дороже у проверенных производителей.


              1. sim2q
                15.10.2022 20:40

                Функционал понятен, но зачем оно тут ?
                Как то привычней в нашем веке всё же на ОУ

                ps у нас даже на площадках где в теории могуть даже не то что разные фазы а и генеры - такого нет (хотя сейчас вроде начинаем по цифре гальваническую развязку делать)


                1. Javian
                  16.10.2022 12:35

                  При слепом прослушивании я отличаю подключение по баластному кабелю. Поэтому при наличии такой возможности буду слушать при таком подключении.


                  1. Gromushka Автор
                    16.10.2022 14:32

                    Баластный кабель для сброса баласта - как сбросил сразу звук круче.

                    Куда скатился хабр?


                  1. sim2q
                    16.10.2022 15:48
                    +1

                    Балансное подключение - рулит однозначно! Это наше всё!
                    Смущает, что трансформатор (сердечник) - нелинейный элемент. Наводки опять же.
                    Некие сложности могут возникать если делать балансный выход. Со входом - проще. Можно какой нибудь инструментальник поставить или что там сейчас, по идее полно специализированного.
                    Но возможно это предубеждение и детская травма от схем приёмника с межкаскадными трансформаторами :)
                    Но я не настаиваю, цифр не видел, ну и на фото конечно монстр - логично предположить, что там там относительно линейный участок работы выбран с запасом, всё хорошо экранированно итд.
                    ps так то и сам использую звуковые трансы во время теста, что бы безопасно всё развязать.


            1. Gromushka Автор
              15.10.2022 20:22
              +1

              Что именно не ищется? Тут приводить ссылку не буду, но на всяких руторах и прочих качалках есть все новое. А вот из старого, или скажем классику, в оригиналах действительно хрен найдешь.


          1. Javian
            15.10.2022 19:36

            Системные требования для HQPlayer и BeagleBone тянут на отдельную статью.


        1. Gromushka Автор
          15.10.2022 19:10

          Зачем мне переходить - я и так прекрасно слушаю DSD.


    1. Zenj
      15.10.2022 16:01
      +2

      Помнится, это называлось COVOX, я прямо на разъеме принтерного порта распаивал, очень достойно получилось. Скрим-трекер на этом играл божественно :) 286-й вполне хватало :)


  1. GarryC
    15.10.2022 14:23
    +3

        saved.bytes.filter = GetGConfig()->FilterNum;
        saved.bytes.filter = GetGConfig()->inputType;

    неплохо так...


    1. Gromushka Автор
      15.10.2022 14:25

      Да надо исправить - просто этот код бежит только первый раз, когда EEPROM пуст. Поэтому не нашел при тестировании. Спасибо - исправлю.


  1. Gromushka Автор
    15.10.2022 19:14
    -1

    Придется написать комментарий отдельно. Для тех кот в танке, это не тема о том, что слышат или не слышат, не о том, какой формат лучше PCM или DSD, не о том, услышат ли разницу между встройкой и нормальным ЦАП.

    Тема про то, как взяв DIY ЦАП от Soekris и прикрутить к нему Ардуино с БП и кодом для Ардуино.


    1. GennPen
      15.10.2022 20:42
      +6

      Я конечно извиняюсь, что завел вечный спор.

      Но открывая статью "DIY ЦАП" ты ожидаешь почитать о том как собирать этот ЦАП самостоятельно, а не брать готовый чтобы его прикрутить в коробку. Ну, потому что DIY - это "Do It Yourself", "сделай сам" то бишь. Называйте вещи своими именами и не будет недопониманий.


      1. Gromushka Автор
        16.10.2022 00:42
        -6

        Какое полезное замечание :)


  1. Karlson_rwa
    15.10.2022 20:54
    +2

    проблемой медленного старта Ардуино, которая отставала от практически мгновенного старта схемы ЦАП и не успевала к первому выводу установок которые ЦАП выплевывает по UART
    Шта, простите?


    1. Gromushka Автор
      16.10.2022 00:44
      -6

      О, а вот знатоки мне сейчас расскажут, что надо было Serial инициализировать раньше, потом читать вывод с ЦАП и только потом зажигать LCD ведь так?


      1. Karlson_rwa
        16.10.2022 01:50
        +4

        Во-первых, сбавьте обороты, пожалуйста. Вы как-то очень резко реагируете на вполне логичные вопросы публики. Во-вторых, мне не удалось быстрым гуглежом найти boot-up time вашего ЦАПа. Вы его замеряли? Зная, что в ардуине стоит ATMega328 или какая там у вас ардуина используется, очень странно читать про

        медленного старта Ардуино
        без указания конкретных времён. Медленный старт — это сколько в микросекундах? В-третьих, ничего советовать не буду, потому что принципиально не читаю ардуинокод :) Мой глаз зацепился исключительно за медленный старт. Зная возможности контроллера, очень любопытно узнать, что вы под этим подразумевали. Особенно учитывая, что ваш ЦАП построен на шестом спартане, которому нужно время на то, чтобы вычитать свою прошивку из чего там у него еще на плате стоит в качестве загрузочной флешки. Если за обмен по UART отвечает спартан, а не стм-ка, которая вроде тоже есть на плате.


        1. Gromushka Автор
          16.10.2022 07:41
          -6

          Во-первых, сбавьте обороты, пожалуйста. Вы как-то очень резко реагируете на вполне логичные вопросы публики. 

          Внимание вопрос

          Шта, простите?

          Ржу в голос. Пожалуйтесь в спортлото. :)


    1. Gemerus
      16.10.2022 05:26
      +4

      Я думаю, проблема автора в том, что Ардуино имеет довольно "своеобразно" реализованный загрузчик. После включения она каждый раз ждёт, что в неё начнут загружать по USB(на само деле по UART) прошивку, и только потом стартует. Причем на разных платах от разных китайцев время ожидание разное, и может доходить до 10с, так как кривые копии CH340+кривые драйвера далеко на сразу стартуют. Достаточно просто использовать прошивку без загрузчика и загружать её программаторам , тогда старт будет довольно быстрым, с учетом зарядки конденсаторов и запуска тактирования, не более 150мс.


      1. Gromushka Автор
        16.10.2022 07:44
        -5

        Я думаю, проблема автора в том, что 

        У автора проблем нет, от слова совсем.

        Достаточно просто использовать прошивку без загрузчика и загружать её программаторам

        Зачем?


      1. GennPen
        16.10.2022 12:51
        +1

        с учетом зарядки конденсаторов и запуска тактирования, не более 150мс

        Около 65мсек запуск с внешним кварцом, думаю от настроек во фузах зависит.
        С внутренним генератором пишут, что около 100мксек(и меньше) можно добиться время старта.


        1. Gemerus
          16.10.2022 17:01
          +1

          Ну, я привел оценку сверху, указав "не более 150мс". Есть много факторов, которые могут замедлить запуск всей системы в целом, начиная от DC-DC, заканчивая инициализацией периферии в прошивке. Но, за 150мс вы почти точно дойдёте до первой строчки пользовательского кода.