За последние 20 лет (не так уж и много в масштабах существования Hi-Fi аудио) отношение меломанов к компьютеру как к источнику качественного звука постоянно менялось. Фактически, это было полное отрицание подобной возможности его использования в конце 90-х, принятие его только как рекордера для CD-Audio дисков в самом начале «нулевых», огромная популярность в качестве именно источника сигнала уже в середине 2000-х — начале 2010-х, и некоторое снижение интереса к ним в последние годы. Причин подобных изменений настроения аудиосообщества достаточно много, и далеко не все они связаны именно с качеством звука. В то же время нужно признать, что многие меломаны начинают свой путь к качественному звуку именно с компьютера, как с наиболее доступного (то есть уже имеющегося в наличии) устройства, служащему одновременно и средством получения, а также хранения музыкального контента. Итак, как же слушать музыку с компьютера правильно?
Как выбрать внешний ЦАП?
Фото andrew welch / Unsplash
Встроенные звуковые карты
Любой компьютер оснащен некоторой встроенной звуковой системой и не все они обладают совсем уж отталкивающим звуком. Тем не менее, хорошим способом улучить его качество является установка качественной звуковой карты. Их выбор довольно широк, как и диапазон стоимости. Подыскивая такую карту, вполне можно ограничиться бюджетом три-четыре тысячи рублей и продукцией признанных лидеров данного рынка, таких как Creative или Asus. При этом в карте должен быть установлен ЦАП с параметрами как минимум 24 бит / 192 кГц и использоваться качественные выходные операционные усилители, хотя бы для основных стереоканалов (подавляющее большинство подобных плат многоканальные).
Если вы не планируете использовать ПК для записи звука (в том числе и его оцифровки), то целесообразность приобретения более дорогих звуковых карт для Hi-Fi-задач выглядит сомнительной задачей. А кроме того, работа в условиях сильных электрических помех, как проходящих по цепям питания, так и получаемых от других частей ПК (установку «линейных» блоков питания и другой апгрейд компьютера мы здесь рассматривать не будем), неминуемо снизит соотношение сигнал/шум таких плат, то есть ухудшит их звучание. Экраны, которыми иногда снабжаются подобные звуковые карты, хороши для нанесения красивых картинок, но не действенной защиты от электрических помех.
Современные звуковые карты подключаются к внешнему усилителю через обычный линейный вход. Обычно для этого требуется переходник mini-jack на RCA, и здесь лучше отдавать предпочтение продукции ведущих специализированных компаний, а не ноунейм-продукции из ближайшего супермаркета.
Кабель USB AudioQuest Cinnamon
USB – всему голова
Де-факто стандартом для подключения ПК к аудиосистеме стал разъем (интерфейс) USB, имеющийся в любом компьютере. При таком соединении никакой модернизации самого ПК не требуется. Отметим, что, если компьютер планируется использовать только для транспортировки аудио, его конфигурация может быть довольно простой. Ни мощный процессор, ни большой объем ОЗУ для этого не требуются.
Что такое ЦАП? #ДлячегоЦАП#DAC
Настроить же компьютер необходимо таким образом, чтобы все ненужные для воспроизведения музыки функции ОС были отключены. Впрочем, дополнительная вычислительная мощность все же понадобится тем пользователям, которые захотят осуществлять апсемплинг (повышение его частоты) сигнала перед отправкой на ЦАП.
В качестве операционной системы для подобных «аудио-компьютеров» сегодня все чаще используется Linux со специальной программной оболочной, который может быть запущен на миниатюрном одноплатном ПК. Хотя лидером здесь, безусловно, являются Windows и iOS с соответствующими программными аудиоплеерами.
Стереоусилитель TEAC AI-503
Однако вернемся к USB. Если вы только создаете свою первую аудиосистему, то в ней можно сразу предусмотреть устройство с таким входом. Это может быть интегральный усилитель с USB-входом, например, Rotel A12 или TEAC AI-503, или даже активная акустика – такая, как Klipsch The Sixes. Если же у вас уже есть стереосистема, к которой необходимо подключить ПК по USB, потребуется соответствующий внешний цифро-аналоговый преобразователь.
Активная полочная акустика Klipsch The Sixes
USB-ЦАП – какой выбрать?
Современные ЦАП-ы как правило оснащаются входными USB-интерфейсами на базе технологии XMOS или реже Amanero. Они работают в асинхронном режиме, что позволяет практически полностью устранить возможный джиттер, имеющийся во входном сигнале. Кроме того, многие USB-ЦАП оснащены и входными фильтрами, эффективно противостоящими помехам. Небольшим минусом XMOS и Amanero является то, что для полноценной работы многих ЦАП-ов на ее основе требуется использование специальных драйверов, которые необходимо установить на ПК. Впрочем, все компании-изготовители позволяют бесплатно скачать их на своих сайтах.
Внешний ЦАП M-Audio Micro DAC 24/192
Определяясь с выбором конкретной модели, в первую очередь необходимо определиться с тем, какие функции ЦАП вам нужны. Если требуется только прослушивание музыки с компьютера, то можно выбрать простую модель, например, M-Audio DAC 24 / 192. Этот ЦАП устанавливается непосредственно в свободный USB-порт компьютера.
А, например, более крупный ЦАП Cambridge Audio DacMAgic 100, кроме USB, имеет еще и два коаксиальных, а также оптический входы, которые можно использовать для подключения других цифровых источников. ЦАП топового класса T+A DAC 8 DSD, помимо широкого набора входов, имеет поддержку аудио высокого разрешения (PCM 24 бит / 192 кГц и DSD 2,8/5,6 МГц), а также может работать в качестве предусилителя. Последнее означает, что его можно непосредственно подключать ко входам усилителей мощности или активных колонок, не имеющих собственных регуляторов громкости.
Внешний ЦАП T+A DAC 8 DSD
В целом, при выборе USB-ЦАП, стоит отдавать предпочтение моделям с как можно более широкой поддержкой входных цифровых потоков (обязательным на сегодня является возможность воспроизведения PCM 24/192 и DSD256), а также выполненных на новых микросхемах от компаний AKM или Sabre.
Эту статью прочитали 58 895 раз
Статья входит в разделы: Как выбрать. Гид покупателя Полезные советы
Поделитесь статьёй:
Источник: www.audiomania.ru
Начинаем работать в STM32CubeMX. Часть 2
В прошлый раз мы научились создавать в STM32CubeMX новый проект, настраивать тактовый генератор, таймер и порт ввода-вывода, и немного помигали светодиодом. Сегодня мы освоим цифро-аналоговый преобразователь и научимся работать с ним через DMA. В результате у нас должен получиться простой генератор прямого синтеза (Direct digital synthesizer, DDS).
Работа с DAC
Большая часть микроконтроллеров STM32 оснащена 12-bit DAC в количестве одного или двух штук. При этом архитектура DAC одинакова во всех кристаллах, неважно, какое ядро ARM Cortex M там используется. Таким образом, сегодняшний эксперимент можно выполнить на любом микроконтроллере STM32, имеющем хотя бы один DAC.
Какова частота преобразования DAC? Ответ на этот вопрос не совсем прост. Если вы хотите подробностей, рекомендую эти два документа: [1][2]
Если излагать суть кратко, то она заключается в следующем: сам по себе ЦАП может обновлять выход с частотой до 5 MSPS (мегасэмплов в секунду), но буферный операционный усилитель (ОУ) на выходе не обеспечит такой скорости, ограничивая её до 1 MSPS. Если мы хотим больше, нам нужен внешний ОУ, к которому предъявляются некоторые требования по частотным характеристикам, о которых будет сказано ниже. Без буферного ОУ ЦАП использовать нельзя, так как он имеет довольно большое выходное сопротивление (> 10 кОм).
Немного схемотехники
На частоте выше сотни килогерц встроенный буферный усилитель начинает вносить существенные искажения в сигнал, поэтому я сразу поставил на выход внешний буферный усилитель, удовлетворяющий рекомендациям ST.
Для достижения скорости преобразования 5MSPS, ST рекомендует использовать ОУ с частотой единичного усиления не менее 10 MHz, усилением при разомкнутой обратной связи не менее 60 дБ и скоростью нарастания выходного сигнала не менее 16,5 В/мкс. ST в качестве примера рекомендует ОУ LMH6645/6646/6647 производства Texas Instruments.
Я использовал ОУ AD845JN, который имеет частоту единичного усиления 16 МГц, типовое значение коэффициента усиления 500 В/мВ (около 114 дБ) и скорость нарастания 100 В/мкс. Питание ОУ производится от DC/DC преобразователя 5 В/±9 B. Можно питать буферный усилитель однополярным питанием, например, взяв 5 В прямо с платы, но тогда понадобится rail-to-rail усилитель. Схема подключения приведена на рис. 1.
Рис. 1. Схема выходного буферного усилителя
Специальную плату делать не стал, смонтировал проводом на макетной плате, которая вставлена в arduino-совместимое посадочное место на отладке.
Рис. 2. Вид платы буферного усилителя
Внутренний буферный усилитель микроконтроллера начинает вносить заметные нелинейные искажения уже начиная с частоты 100-150 кГц. Если вы не собираетесь использовать DAC для генерации сигналов выше этих частот, можно обойтись и без буфера.
Теперь переходим к программной части.
Конфигурация DAC
Будем считать, что мы уже умеем создавать проект в CubeMX, выбирать микроконтроллер и настраивать тактовый генератор, как в первой части. Можно просто взять проект из первой части и продолжить его.
На плате, которой я пользуюсь, выходы DAC выведены не слишком удобно, к сожалению, DAC_OUT1 (вывод N4) выведен на разъем DCMI, DAC_OUT2 (вывод P4) подключен к интерфейсу USB и вряд ли может быть использован в качестве выхода DAC. Поэтому остаётся только DAC_OUT1. Включаем его во вкладке Pinout:
Во вкладке «Configuration» у DAC есть только одна интересная нам настройка: Output Buffer. Если вы не используете внешний усилитель, он должен быть включен, если используете — выключен.
Можно управлять выходом DAC «вручную» из программы, можно задействовать DMA. Второй способ хорошо подходит для генерации периодического сигнала произвольной формы, и его мы рассмотрим ниже, а сейчас используем первый способ. Просто установить на выходе постоянное напряжение неинтересно, попробуем сгенерировать сигнал. Для этого нам понадобится таймер.
Делаем всё как в первой части, только частоту таймера устанавливаем больше, например, 500 кГц. Для этого нужно установить значение Prescaler = 215, тогда мы получим 216 МГц/(215 + 1) = 1 МГц, и Counter Period = 1, что даст 1 МГц / (1 + 1) = 500 кГц. Напоминаю, что 216 МГц — частота тактирования периферии в нашей конфигурации системы тактирования.
Генерация сигнала из обработчика прерываний
Генерируем код, открываем проект и вписываем следующее:
/* USER CODE BEGIN 0 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) < static int val = 0; if (htim->Instance==TIM1) //check if the interrupt comes from TIM1 < HAL_DAC_SetValue( val = val? 0: 4095; >> /* USER CODE END 0 */ . /* USER CODE BEGIN 2 */ HAL_TIM_Base_Start_IT( __HAL_DAC_ENABLE( /* USER CODE END 2 */
Ещё раз напоминаю, что весь пользовательский код пишется между строками вида /* USER CODE BEGIN… */… /* USER CODE END… */
Первый участок кода — обработчик прерывания таймера, в котором в регистр DAC записывается попеременно 0 и 4095, т. е. минимальное и максимальное значение DAC. Второй участок кода включает таймер и DAC. Получаем прямоугольные колебания с частотой 250 кГц, но из-за вносимых буферным усилителем искажений они выглядят так:
Пришло время задействовать внешний буфер, отключив внутренний. Для этого в STM32CubeMX заходим на вкладку Configuration, нажимаем кнопку DAC, на вкладке Parameter Settings устанавливаем Output Buffer = Disable. Заново генерируем код и прошиваем в плату. Сейчас импульсы выглядят как меандр, пропущенный через ФНЧ (в силу того, что полоса пропускания системы всё же ограничена):
Можно даже приблизительно оценить частоту среза ФНЧ.
Способ понятен из рисунка: проводим касательную к экспоненте до пересечения с верхним уровнем сигнала. Расстояние по шкале времени от начала импульса до пересечения и будет постоянной времени фильтра τ = 400 нс, частота среза равна fср = 1/2πτ ≈ 0,4 МГц.
Попробуем увеличить частоту в два раза, уменьшив Prescaler до 107, но нас ждёт разочарование: выше 333 кГц частота не поднимается. Вероятно, нужна некоторая оптимизация кода.
В действительности, наибольшую задержку вносит огромный обработчик прерывания таймера в недрах HAL (функция HAL_TIM_IRQHandler). Его можно заменить своим. Для этого находим файл stm32f7xx_it, и в нём изменяем функцию TIM1_UP_TIM10_IRQHandler:
void TIM1_UP_TIM10_IRQHandler(void) < /* USER CODE BEGIN TIM1_UP_TIM10_IRQn 0 */ static int val = 0; /* TIM Update event */ __HAL_TIM_CLEAR_IT( if (htim1.Instance==TIM1) < *(uint32_t*)(DAC_BASE + 0x00000008U) = val; val = val? 0: 4095; >return; /* USER CODE END TIM1_UP_TIM10_IRQn 0 */ HAL_TIM_IRQHandler( /* USER CODE BEGIN TIM1_UP_TIM10_IRQn 1 */ /* USER CODE END TIM1_UP_TIM10_IRQn 1 */ >
HAL_TIM_IRQHandler больше не вызывается. Теперь частоту таймера можно поднять до 2 МГц, а частоту меандра, соответственно, до 1 МГц. Для этого нужно в настройках таймера установить значение Prescaler = 53, и тогда мы получим такую картину:
Это, вероятно, максимальная частота, достижимая на данном микроконтроллере.
Библиотека HAL, конечно, удобная вещь, но внутри неё происходит много разных действий, которых можно избежать. Просто следует помнить, что преждевременная оптимизация — зло, и прибегать к ней только когда мы достигли ограничения, как в этот раз.
Ещё один нюанс. Мы можем заметить, что в сигнале иногда попадаются странные скачки, имеющие период 1мс.
Они получаются в результате того, что у нас в системе есть ещё одно прерывание, имеющее больший приоритет, чем наш таймер. Оно спрятано внутри HAL, и это системный таймер SysTick, имеющий наивысший (нулевой) приоритет прерываний. Для исправления ситуации заходим в STM32CubeMX->Configuration->NVIC->Time base: System Tick Timer->Preeption Priority = 1. Заново генерируем код, искажения сигнала исчезли.
Попробуем сгенерировать синусоидальный сигнал. Для этого нам нужен массив длиной N значений, заполненный значениями функции round(A * cos((pi / 2) * (n / N))), где A — амплитуда сигнала, N — количество точек в массиве, n — номер точки. При выводе будем сдвигать точки на shift = 2048, амплитуда пусть будет А = 2047, тогда значения DAC будут от 1 до 4095. Массив можно заполнить только на четверть периода, от 0 до pi/2, а недостающие значения получать из него путём очевидных арифметических действий. Почему используем функцию косинуса, а не синуса, я напишу дальше.
Как выбрать N? С одной стороны, чем больше N, тем лучше, значения будут более близкими к точным величинам, с другой стороны, ограниченная разрядность DAC делает такое увеличение бесполезным после величины [A * pi / 2] = 3215. В самом деле, при N = 3215 приращение угла составит pi / (2 * 3215) = 4.89e-4, а приращение амплитуды вблизи середины шкалы, где скорость нарастания максимальна, составит 4.89e-4 * 2047 = 1 дискрет DAC.
6.5. Программа для работы цап и ацп на языке c
Не забудьте поместить файл – библиотеку ADuC812.h в папку с программой. C51 COMPILER V6.22 DAC_ADC 12/14/2009 01:59:17 PAGE 1 C51 COMPILER V6.22, COMPILATION OF MODULE DAC_ADC OBJECT MODULE PLACED IN DAC_ADC.OBJ COMPILER INVOKED BY: C:KeilC51BINC51.EXE DAC_ADC.C DEBUG OBJECTEXTEND stmt level source 1 #include «ADuC812.h» // библиотека для работы с микроконтроллером ADuC812 2 3 #defineBUSY0x80 // определяем битBUSYдля контроля конца преобразования 4 5 #define DAC0 0 6 #define DAC1 1 7 8 #define ON 1 9 #define OFF 0 10 #define VDD 5.0 // напряжение питания 5 В 11 12 bitchannel; // переменная, содержащая № канала ЦАП и АЦП 13 unsignedshortmax_val; // количество шагов квантования 14 unsignedshortval; // переменная содержит значение преобразованного напряжения 15 16 unsignedchardata*p1=0x07; // указатели на адрес возврата 17 unsigned char data* p2=0x08; 18 19 unsignedcharoldp1=0x07; // переменные содержат указатели на адрес возврата 20 unsigned char oldp2=0x08; 21 22 void SetVoltage(float v) 23 < 24 1 oldp1=*p1; 25 1 oldp2=*p2; 26 1 27 1 if(DACCON 29 2 max_val= 0xFF; // 8ми битный режим (255) 30 2 >31 1 else 32 1 < 33 2 max_val= 0xFFF; // 12ти битный режим (4095) 34 2 >35 1 36 1 val= (unsignedshort)(v*max_val/VDD); // перевод аналогового напряжения в цифровой код 37 1 38 1 val 39 1 40 1 if(channel == DAC0) // выбор канала 41 1 < 42 2 DAC0H=val>> 8; // запись старших 4 бит ЦАП 43 2 DAC0L=val; // запись младшихстарших 8 бит ЦАП 44 2 > 45 1 else 46 1 < 47 2 DAC1H=val>> 8; // запись старших 4 бит ЦАП 48 2 DAC1L=val; // запись младшихстарших 8 бит ЦАП 49 2 > 50 1 *p1=oldp1; 51 1 *p2=oldp2; 52 1 > 53 54 55 float GetVoltage(unsigned char channel) 56 < 57 1 float v; 58 1 59 1 while(ADCCON3 // ждем конца преобразования АЦП 60 1 61 1 ADCCON2 = 0x10 |channel; // выбираем канал 62 1 63 1 while(ADCCON3 ждем конца преобразования 64 1 65 1 v = ((unsigned short)(ADCDATAH< 8) | ADCDATAL; // запись 66 1 v=v* 5.0 / 0xFFF; // перевод цифрового кода в аналоговое напряжение 67 1 68 1 return v; 69 1 >70 MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 172 —- CONSTANT SIZE = —- —- XDATA SIZE = —- —- PDATA SIZE = —- —- DATA SIZE = 8 8 IDATA SIZE = —- —- BIT SIZE = 1 —- END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S) Уровень квантования определяется по формуле , где n – разрядность ЦАП. Для SDK разрядность ЦАП составляет 8 или 12. При разработке микропроцессорных систем управления необходимо учитывать погрешность, вносимую разрядностью ЦАП.
08.03.2016 18.35 Mб 10 ~WRL3745.tmp
Ограничение
Для продолжения скачивания необходимо пройти капчу:
Источник: studfile.net