USB звуковая карта на основе Microchip PIC
 
Главная... → USB звуковая карта на основе Microchip PIC
USB звуковая карта на основе Microchip PIC

USB звуковая карта на основе Microchip PIC

Введение

Идея создания USB звуковой карты на основе PIC родилась в дискуссиях людей, уже собиравших подобные устройства, на форуме Microchip USB. Все микросхемы карты производства фирмы  Microchip. Программное обеспечение использует модифицированную версию Microchip USB framework, которая управляется прерываниями вместо традиционного механизма опроса. Устройство представляет собой составное USB устройство. Первое устройство реализовывало интерфейс USB Audio 1.0, последующие устройства используют специальный интерфейс на основе интерфейса HID. Специальный интерфейс используется с целью программирования серийного номера устройства, обновления прошивки (firmware) и в будущем, для любой другой конфигурации не подде6рживаемой непосредственно протокол USB Audio 1.0. В предыдущей версии использовался интерфейс WinUSB. Потестировав карту некоторое время, я решил, что будет лучше, если для карты не будут требоваться драйверы, особенно с учетом того, что интерфейс HID/WinUSB хоть и редко, но используется.

Звуковая карта работает с частотами дискретизации 48 кГц, 32 кГц и 24 кГц, по выбору операционной системы, с вертикальным разрешением 12 бит. Частота дискретизации CD 44.1 кГц не реализована в связи со сложностью и необходимостью дополнительных вычислений. Все реализованные частоты дискретизации кратны кадру USB 1 мс, что означает, что каждый кадр несет в себе тоже самое количество данных. Частота дискретизации в 44.1 кГц требует поддержки картой кадров с другим количеством данных, что в свою очередь требует более сложной техники буферизации и синхронизации и большей вычислительной мощности. Microsoft Windows автоматически преобразует CD аудио 44.1 кГц в 48 кГц.



USB аудио потоковое устройство v1.2

Аппаратная часть


Кликните для увеличения


Схема USB аудио потокового устройства v1.2

Eagle и PDF версии схемы и платы

Аппаратная часть звуковой карты основана на USB процессоре Microchip PIC18F2550. Процессор тактируется частотой 8 МГц, которая является максимальной для этого процессора, так же она кратна поддерживаемым частотам дискретизации. Микроконтроллер подключен к двум 12 битным ЦАП Microchip MCP4822 через SPI интерфейс. Регулировка громкости реализована на микросхеме Microchip MCP41010, управляемой по протоколу SPI через отдельный (программный) SPI порт. Причина использования отдельного SPI порта в том, что управление громкостью реализовано в микроконтроллере с другим уровнем приоритета, чем вывод звуковых данных. Микросхема операционного усилителя Microchip MCP6022 используется как выходной усилитель.

К операционному усилителю MCP6022 подключена емкость, более чем достаточная для подключения дешевых наушников, не создавая искажений. Сопротивление моих наушников приблизительно 25 Ом. Мощности операционных усилителей не достаточно, чтобы работать с динамиками сопротивлением 8 или 4 Ом. Микросхемы MCP41010 и MCP6022 способны давать выходное напряжение от отрицательного до положительного напряжения питания, хотя некоторые нелинейные эффекты слышны, если звук слишком громкий или когда сигнал достигает уровня минимума или максимума. Так как USB обеспечивает однополярное питание 5 В, звуковая карта может использовать только положительное напряжение питания в отличие от традиционного биполярного, для систем поддерживающих 16 битный стандарт кодирования PSM. В результате сигнал должен быть программно поднят на 2.5 В.

Программное обеспечение

Программное обеспечение звуковой карты USB состоит из нескольких компонентов. Это прошивка аудио карты (firmware), библиотека С++, которая предоставляет интерфейсы HID и WinUSB и утилита командной строки для прошивки. Я прилагаю исходный код для изучения. Мне не интересно что вы будете с этим делать, но я не несу ответственности за любые повреждения, которые могут произойти при использовании. ПОМНИТЕ: Неправильное использование устройства или программы может привести к серьезному ущербу для здоровья или даже смерти. :)

Исходный код для USB Аудио карты V1.2

Я использовал Microsoft Visual Studio 2005 Professional, но я слышал, что этот проект можно откомпилировать в Visual Studio Express. Чтобы откомпилировать этот проект необходимо загрузить последнюю версию WDK, чтобы получить файлы заголовков и библиотек для HID и WinUSB. Установки каталогов по умолчанию в Visual Studio должны быть модифицированы так, чтобы указывали на каталоги с этими ресурсами в WDK. Если вы используете Visual Studio Express, вам необходимо повторно создать все файлы проектов и изменить «соглашение о вызовах» (calling convention) установленное по умолчанию на _stdcall.

Каталог

Функция

inc

Общий каталог с заголовками

boot

Загрузчик (Компилируется первым)

audiostream

Прошивка звуковой карты

usbdevprogramer

Программатор – утилита командной строки (Компилируется в последнюю очередь)

Модули исходного кода

При компиляции прошивки звуковой карты есть одна хитрость. Хитрость состоит в том, что изначально имеются два отдельных проекта, которые потом необходимо соединить в один. Откомпилируйте каталог boot первым, полученный код отвечает за обновление прошивки. Затем откомпилируйте собственно прошивку. Перед программированием. Зайдите в меню Configure/Settings/Program Loading и отключите опцию «очистить память программ на загрузку новой программы». После того, как прошивка звуковой карты будет откомпилирована, зайдите в меню file/import и импортируйте hex файл для загрузчика (из каталога boot). Два проекта сольются вместе без вырезаний и вставок. Теперь можно прошивать PIC. Помните что загрузчик необходим только для прошивки звуковой карты без ICD/Pickit. При отладке карты желательно не использовать загрузчик. Для этого не требуется вносить изменения в исходный код или сценарий компоновщика. Просто не включайте загрузчик в образ для прошивки.

Прошивка звуковой карты

Прошивка звуковой карты базируется на модифицированной версии Microchip USB framework. Framework был сжат в единственный файл исходного кода с обратными вызовами между framework-ом и основным кодом. Framework (в моем случае это чуть более чем библиотека) был модифицирован для использования прерываний вместо традиционного метода опроса. Вместо того, чтобы вызывать сервис USB драйвера в цикле, эти функции вызывается когда происходит прерывание от USB. Библиотека отвечает за обработку управляющих запросов на конечной точке 0. Framework обрабатывает стандартные USB запросы, а основной код отвечает за обработку специфических нестандартных запросов, запросов ввода/вывода и всех других конечных точек.

Это устройство является составным устройством, состоящим из устройства USB Audio 1.0 и пользовательского HID интерфейса. С помощью USB Audio 1.0 все данные звукового сигнала передаются через отдельную от контрольной, конечную точку. Контрольные запросы, такие как управление громкостью идут через конечную точку 0 (контрольная конечная точка). HID использует свою собственную конечную точку. Так как каждая функция карты имеет свою собственную конечную точку, каждая функция может быть реализована со своим уровнем приоритета без особых проблем. Контроллер PIC18F2550 имеет два приоритета прерываний плюс основной код, в сумме получается три. Так как функция воспроизведения звука наиболее критическая, ей назначен наивысший приоритет. Затем идут запросы к контрольной конечной точке, которые включают стандартные запросы плюс запросы Audio 1.0. Так как эти функции имеют относительно небольшое время выполнения им назначен низкий приоритет. HID функции помещены в основной код потому как действия, такие как запрос версии прошивки, установка серийного номера или запись новой прошивки не критичны ко времени.

Конечная точка

Приоритет

Функция

EP 2

Прерывание(Высокий приоритет)

Поток данных Аудио к ЦАП

EP 0

Прерывание (Низкий приоритет)

Контрольная конечная точка и запросы Audio 1.0

EP 1

Main(В фоновом режиме)

Не стандартные функции

Контрольные точки, приоритеты и функции прошивки

Ядро аудио

Обработчик прерываний низкого приоритета выполняет две функции. Первая – проверка конечной точки ISO через SIE () для данных. Если данные доступны, буфер проходит к коду с высоким приоритетом прерываний, и следующий буфер, который делает таким образом циклическую очередь, возвращается к SIE. Буферы находятся в USB RAM контроллера, по этому данные в них не копируются между ними. В протоколе Audio 1.0 хост всегда посылает строго определенное количество отсчетов заполняющее кадр размером 196, 128 или 96 байт, в зависимости от используемой частоты дискретизации.

Вторая функция обработчика прерываний с низким приоритетом – обработка SOF (старт кадра). Приняв SOF, PIC заменяет текущий буфер воспроизведения на следующий доступный буфер и запускает таймер 2, задающий частоту дискретизации. Таймер 2 всегда перезагружается при старте кадра (SOF), чтобы синхронизировать частоту дискретизации. Если событие SOF произойдет прежде, чем текущий буфер будет проигран, воспроизведение переключится на следующий буфер. Если SOF случится после того, как буфер будет проигран, последняя выборка будет растянута (продублирована многократно). Так как дрейф тактовой частоты очень мал, большинство выборок воспроизводятся вовремя. Время последней выборки немного различается. Это не заметно при воспроизведении аудио и немного заметно при воспроизведении синусоидальных сигналов.

Прерывание с высоким приоритетом выключает таймер 2 и имеет функцию форматирования данных в формат, требуемый для ЦАП и загружает эти данные в ЦАП через SPI порт PIC контроллера. Выборки преобразуются из 16 битных целых со знаком в 12 битные без знака. После того как буфер закончится, таймер 2 остановится, и тактовая частота карты будет опережать хост по этому последняя выборка будет растянута.

Запросы протокола AUDIO 1.0

Все запросы Audio 1.0 обрабатываются через USB framework. Прерывание с низким приоритетом вызывает службу USB которая обслуживает управляющие запросы. Если запрос представляет собой стандартный USB запрос, он обрабатывается непосредственно самим framework-ом. Если нет, framework делает обратный вызов основного кода, который проверяет запрос. Если запрос распознан, основной код обрабатывает запрос. Если запрос является запросом чтения, основной код устанавливает адрес переменной, чтобы послать ее хосту. Если это запрос на запись, переменная записывается, но прошивка устанавливает завершающую подпрограмму, которая будет выполнена в конце запроса.

Данная звуковая карта обрабатывает только два типа запросов, это запросы управления громкостью и установки частоты дискретизации. Текущее значение обоих параметров содержится в глобальной переменной. Если новое значение громкости будет назначено, новое значение будет записано в аттенюаторы. Если назначена новая частота дискретизации, новое значение будет записано в PR2 для таймера 2.

HID запросы и программное обеспечение на компьютере

Основной код опрашивает конечную точку 1 на предмет пользовательских запросов в цикле. Если запрос представляет собой нечто иное чем установка серийного номера или перепрошивка, запрос обрабатывается основным кодом. В ином случае процессор переходит в специальный режим программирования. При входе в этот режим все прерывания блокируются и USB библиотека используется в традиционном режиме опроса, блоки памяти программ перемещаются с компьютера. Прошивка микроконтроллера это код многоразового использования, который используется для множества проектов.

ПО на стороне компьютера состоит из библиотеки на C++, которая покрывает HID и утилиты командной строки для конфигурирования карты. Эти утилиты используются для множества проектов и будут обсуждаться в отдельных статьях.

Тестирование 123

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

Чтобы измерить точность я использовал программу Audicity для того, чтобы проиграть двадцати секундные синусоидальные сигналы с разными частотами и записал выходной сигнал на ноутбук Dell со встроенной 24 битной звуковой картой Sigmatel, поддерживающей частоту дискретизации до 96 кГц. Полагая что 24 битная звуковая карта лучше чем наше USB устройство. Выходной сигнал я записал с помощью Audicity и распечатал его спектр. Идея заключалась в том, что совершенное устройство даст максимум в спектре на частоте сигнала и ничего в остальной части спектра. Эксперимент проводился с этой звуковой картой и коммерческой 16 битной USB звуковой картой Turtle Beach Audio Advantage. Во всех случаях использовалась частота выборок 48 кГц. На нижеследующих графиках наша USB карта слева и карта от Turtle Beach справа.



Кликните для увеличения



Кликните для увеличения

1 кГц Синусоидальный сигнал

 



Кликните для увеличения



Кликните для увеличения

4 кГц Синусоидальный сигнал



Кликните для увеличения



Кликните для увеличения

20 кГц Синусоидальный сигнал

Как видно из графиков, точность обоих устройств падает с ростом частоты. Вплоть до 12 кГц оба устройства имеют приблизительно одинаковый уровень шума. Однако после 12 кГц производительность нашей карты быстро падает. Оба устройства являются изосинхронно-адаптивными, но очевидно, что карта от Turtle Beach имеет более совершенные алгоритмы контроля дрейфа. На 20 кГц даже карта от Turtle Beach имеет уровень шума -40 Дб, что уже не хорошо. Создается впечатление, что разработка высококачественного USB аудио устройства задача очень сложная даже для коммерческих разработчиков.

Частота сигнала

Наша USB карта

Карта от Turtle Beach

1 кГц

-50дБ

-55дБ

2 кГц

-50дБ

-55дБ

4 кГц

-45дБ

-50дБ

8 кГц

-40дБ

-40дБ

12 кГц

-35дБ

-45дБ

16 кГц

-30дБ

-40дБ

20 кГц

-25дБ

-40дБ

Уровень шума обоих устройств

На английском языке: USB Audio Streamer A Microchip PIC based USB sound card





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

    Комментариев нет..
Тип комментария
Имя *
Email

Введите проверочный код *