Программирование ARM AN3126: формирование аудиосигнала с помощью DAC STM32 Fri, October 11 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

AN3126: формирование аудиосигнала с помощью DAC STM32 Печать
Добавил(а) microsin   

В этой статье (перевод апноута AN3126 [1]) описываются примеры генерации звука с помощью встроенного в STM32 аналого-цифрового преобразователя (Digital to Analog Converter, DAC).

Модуль DAC микроконтроллера (MCU) STM32 12-разрядный, с тремя каналами вывода сигналов. Этот DAC может использоваться во многих звуковых приложениях, таких как системны сигнализации, гарнитуры Bluetooth®, говорящие игрушки, автоответчики, интерфейс между машиной и человеком, недорогие проигрыватели музыкальных файлов. Также можно использовать DAC для генерации сигналов в различных устройствах измерения и контроля.

В апноуте [1], кроме описания основных возможностей STM32 DAC, приведены 2 примера:

– В первом примере DAC используется для генерации синусоидального сигнала.
– Во втором примере показано проигрывание WAV-файлов.

В чипах STM32, основанных на ядре Arm®(a) Cortex®, встроенный DAC может реализован в разных конфигурациях, с различными возможностями:

• С каналами от одного до трех.
• С возможностью генерации шума.
• С возможностью генерации сигнала треугольной формы.
• С поддержкой флага недогрузки DMA (DMA under run).
• С выделенным тактированием аналогового тракта.

Для получения подробной информации по возможностям и функциям определенного DAC обращайтесь к даташиту на используемый MCU STM32. Дополнительную информацию можно найти в апноуте AN4566 [2].

Как показано на рис. 1, модуль DAC принимает данные в трех целочисленных форматах: 8 бит (байт, находящийся в младших разрядах регистра хранения данных, data hold register), 12 бит с выравниванием вправо (двенадцать бит также находятся в младших разрядах data hold register) и 12 с выравниванием влево (двенадцать бит находятся в старших разрядах data hold register).

AN3126 DAC data format fig01

Рис. 1. Форматы данных DAC.

Уровень аналогового выходного напряжения каждого канала DAC определяется по формуле:

DACOutput = VREF · DOR / 4096

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

Выделенные таймеры. В дополнение к программным и внешним триггерам, преобразование DAC может запускаться от разных таймеров. Базовые таймеры TIM6 и TIM7 [7] предназначены для управления запусками преобразований DAC. Каждый раз, когда интерфейс DAC детектирует фронт нарастания на выбранном выходе триггера таймера (TIMx_TRGO), последние данных, сохраненные в регистр DAC_DHRx, передаются в регистр DAC_DORx (пример для STM32F100x показан на рис. 2).

AN3126 STM32F10x DAC trigger channels fig02

Рис. 2. Каналы триггера (запуска) STM32F10x DAC.

DMA. В чипах MCU STM32 имеется как минимум один модуль DMA с несколькими каналами передачи данных. Каждый канал DAC привязывается к отдельному каналу DMA, формируя поток данных (stream). Например, для STM32F10x DAC channel1 соединяется с DMA channel3, и DAC channel2 соединяется с DMA channel4.

Когда DMA не используется, данные для DAC должен своевременно предоставлять CPU, чтобы корректно сформировать необходимый сигнал. Данные для DAC сохраняются в RAM или энергонезависимой памяти, либо могут генерироваться на лету.

AN3126 DAC interaction without DMA fig03

Рис. 3. Взаимодействие с DAC без DMA.

При использовании DMA общая производительность системы увеличивается, потому что CPU освобождается от действий по предоставлению данных для DAC. Причина в том, что данные могут передаваться из памяти в DAC блоком DMA, без участия CPU. Таким образом, процессорное время CPU становится доступным для других операций.

AN3126 DAC interaction with DMA fig04

Рис. 4. Взаимодействие с DAC при помощи DMA.

В некоторых случаях может произойти ошибка недогрузки DMA (DMA under run error), когда передачи DMA происходят медленнее, чем преобразования DAC. В этих случаях DAC определяет, что часть данных сигнала не была получена, и корректное формирование сигнала не может быть продолжено, и по этому факту выставляет флаг ошибки "DMA under run error".

[Генератор белого шума]

На рис. 5 показана функция генератора псевдослучайного кода STM32 DAC. В зависимости от того, какие используются отводы от разрядов сдвигового регистра [8], может быть сгенерирована последовательность 2n-1 псевдослучайных чисел до того, как эта последовательность повторяется.

AN3126 DAC Pseudo random code generator fig05

Рис. 5. Генератор псевдослучайных чисел, встроенный в DAC.

Шум, производимый этим генератором, обладает плоским распределением уровня по спектру, и может считаться белым. Вместо Гауссовского выходного распределения, распределение равномерное, см. рис. 6.

AN3126 Noise waveform fig06

Рис. 6. Форма сигнала шума.

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

AN3126 Noise waveform with modifiable offset fig07

Рис. 7. Шум с модифицируемым смещением.

Применение генератора белого шума. Чипы STM32 поставляются с 12-разрядным АЦП (ADC) с частотами дискретизации, которые могут превышать 1 мегасемплов в секунду. В большинстве приложений важна разрешающая способность, и когда нужна большая точность, может быть применена концепция передискретизации и децимации входного сигнала, чтобы не использовать внешний АЦП и тем самым снизить общую стоимость и энергопотребление устройства. Сигнал генерируемого шума может использоваться для расширения точности ADC в процессе применения передискретизации. Более подробно этот метод описан в секции "Oversampling using white noise" апноута AN2668 [3].

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

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

[Генератор треугольника]

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

Таблица 2. Предварительно программируемые значения амплитуды треугольного сигнала (при VREF = 3.3V).

Биты MAMPx[3:0] Цифровая амплитуда Аналоговая амплитуда (V)
0 1 0.0008
1 3 0.0024
2 7 0.0056
3 15 0.0121
4 31 0.0250
5 63 0.0508
6 127 0.1023
7 255 0.2054
8 511 0.4117
9 1023 0.8242
10 2047 1.6492
≥ 11 4095 3.2992

Более подробно про генерацию треугольного сигнала см. соответствующие секции в руководстве. Частота сигнала треугольной формы связана с частотой триггера - источника сигнала запуска (trigger source).

AN3126 Triangular waveform fig08

Рис. 8. Формирование треугольного сигнала.

Смещение треугольного сигнала программируется (см. рис. 9). Путем изменения смещения треугольника по предварительно запрограммированной таблице смещений (шаблон сигнала), пользователь может получить сигнал, который соответствует сумме сигнала и шума. Поскольку здесь нет аппаратной защиты от переполнения, сумма смещений и амплитуды не должна превышать 4095.

AN3126 Triangular waveform with modifiable offset fig09

Рис. 9. Синусоидальный сигнал с изменяемым смещением.

Генераторы треугольника часто используется в синтезе звука, так как тембр треугольника менее жесткий, чем у прямоугольного сигнала (амплитуда верхних гармоник падает быстрее).

[Буферизация выхода]

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

Когда выход DAC не буферизирован, и в схеме присутствует нагрузка выхода, выходное напряжение становится ниже, чем это необходимо (см. рис. 10) из за выходного сопротивления DAC.

AN3126 DAC non buffered channel voltage fig10

Рис. 10. Выход не буферизированного канала (с нагрузкой и без нагрузки).

Соответствующий параметр выходного импеданса DAC см. в даташите на используемый STM32 (например, для серии STM32F4 резистивная нагрузка должна быть выше 1.5 мегаома, чтобы выходное напряжение упало меньше 1%).

Когда выходной буфер разрешен, уровень выходного сигнала на нагрузке почти не снижается (см. рис. 11).

AN3126 DAC buffered channel voltage fig11

Рис. 11. Выход буферизированного канала (с нагрузкой и без нагрузки).

[Использование DAC для генерации синуса]

В этом примере показано, как генерировать сигнал синусоидальной формы, в его спектре (при отсутствие искажений) присутствует только одна частота.

Для подготовки цифрового шаблона для сигнала синуса, необходимо создать соответствующую таблицу, где будут рассчитаны уровни сигнала с помощью математических функций. В этом примере сформировано 10 цифровых данных, которые соответствуют форме синуса в диапазоне изменения фазы сигнала от 0 до 2Pi радиан за полный период (от 0 до 360 градусов).

AN3126 DAC sine wave model samples fig12

Рис. 12. Цифровая модель синусообразного сигнала.

Шаг изменения фазы от выборки к выборке составляет 2Pi / ns (number of samples, количество выборок в секунду). Значение sin(x) изменяется в диапазоне от -1 до 1, эти значения необходимо сместить вверх, чтобы получить положительные (целые значения без знака) уровни синуса в виде выборок в диапазоне между 0x000 и 0xFFF (что соответствует диапазону изменения напряжения от 0 до 3.3V при VREF = 3.3V).

                          2Pi            0xFFF + 1
ySineDigital(x) = (sin(x · -----) + 1) · (-----------)
                           ns                 2

Цифровые входные данные прямо пропорционально преобразуются в выходные напряжения в диапазоне между 0 и VREF. Выходные напряжения на ножке каждого канала DAC определяются по формуле:

                             DOR
DACOutput = VREF · -------------------------
                    DAC_MaxDigitalValue + 1

Примечание: для 12-битного разрешения с выравниванием вправо DAC_MaxDigitalValue = 0xFFF. Для 8-битного разрешения с выравниванием вправо DAC_MaxDigitalValue = 0xFF.

Уровень аналогового напряжения синуса ySineAnalog можно определить по формуле (при VREF = 3.3V):

                       ySineDigital(x)
ySineAnalog(x) = 3.3V · --------------
                         0xFFF + 1

Таблица 3. Цифровые данные и соответствующие значения уровня напряжения для синусообразного сигнала.

Выборка (x) Значение цифровой
выборки
ySineDigital(x)
Аналоговое значение выборки (V)
ySineAnalog(x)
0 2048 1.650
1 3251 2.620
2 3995 3.219
3 3996 3.220
4 3253 2.622
5 2051 1.653
6 847 0.682
7 101 0.081
8 98 0.079
9 839 0.676

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

Установка частоты синуса. Чтобы установить частоту синусообразного сигнала, пользователь должен установить частоту выхода триггера таймера (fTimerTRGO). Генерируемая частота синуса будет определяться по следующей формуле:

             fTimerTRGO
fSinewave = -----------
                ns

Таким образом, если выходная частота триггера TIMx_TRGO равна 1 МГц, то частота, генерируемая DAC, составит 100 кГц.

Примечание: в этом примере для упрощения сформирована маленькая таблица синуса. Чтобы максимально приблизиться к целевой чистой форме тона, рекомендуется использовать как можно большее количество выборок в таблице синуса ns (разница в качестве формирования сигнала показана на рис. 13 и 14).

AN3126 DAC sine wave generated ns10 fig13

Рис. 13. Синус, генерируемый с помощью таблицы из 10 выборок (ns = 10).

AN3126 DAC sine wave generated ns256 fig14

Рис. 14. Синус, генерируемый с помощью таблицы из 256 выборок (ns = 256).

[Использование DAC для проигрывания звука]

В этом примере реализован аудиоплеер на STM32, который может проигрывать WAV-файлы. В примере используется минимальное количество внешних компонентов. Звуковые файлы сохраняются на карте microSD, доступной для MCU STM32 через шину SPI.

AN3126 Flow data from microSD to external speakers fig15

Рис. 15. Поток данных от карты microSD до внешних излучателей звука.

Аудиоплеер, описанный в этой секции, поставляется как часть демонстрационного пакета firmware для платы разработчика STM32100B-EVAL вместе с соответствующим руководством пользователя UM0891, все это можно загрузить с сайта STMicroelectronics www.st.com.

Примечание: для других отладочных плат см. проекты с файлом waveplayer.c из архива [9].

В этом приложении подразумевается, что проигрываемый WAV-файл имеет следующий формат:

• Звук закодирован как PCM. Это данные без компрессии, где каждое значение данных представляет выборку сигнала в моменты дискретизации.
• Частота дискретизации (sample rate): может быть 8000, 11025, 22050 или 44100 Гц.
• Разрядность одной выборки (bits per sample): 8 (диапазон данных уровня звука [0-255]).
• Количество каналов: 1 (mono).

Формат WAV-файла [5] это подмножество спецификации Resource Interchange File Format (RIFF), используемой для хранения мультимедийных файлов. Файл RIFF начинается с заголовка, за которым друг за другом следуют секции секции данных. Часто WAV-файл используется только с одной секцией WAVE, состоящей из двух подсекций:

1. Подсекция fmt, которая описывает формат данных звука.
2. Подсекция data, где содержатся реальные данные звука.

Заголовок RIFF формата WAV-файла указывает длину файла. Далее подсекция fmt определяет формат выборки, здесь содержится информация о том, как закодирован звук (PCM или другой формат), количество каналов (mono или stereo), частота дискретизации (sample rate, количество выборок в секунду, например 22050) и размер (разрядность) одной выборки (например 8 или 16 бит). И наконец, в секции data содержатся данные выборок звука.

Пример приложения аудиоплеера основан на использовании внутренних периферийных устройств SPI, DMA, TIM6 и DAC микроконтроллера STM32. В момент запуска приложение сначала использует SPI для подключения к карте microSD, и анализирует её содержимое, используя файловую систему DOS (FAT16 или FAT32), при этом осуществляется поиск файлов с расширением *.WAV в папке USER. Как только найден допустимый WAV-файл, он считывается через SPI, и его данные передаются с помощью CPU в буферный массив RAM. Для передачи данных из буфера RAM в DAC используется блок DMA. TIM6 используется для запуска преобразования DAC, в результате чего цифровые данные звука преобразуются в аналоговый сигнал.

Перед тем, как могут быть воспроизведены звуковые данные WAV-файла, должен быть обработан его заголовок, чтобы определить необходимую частоту выборок (sampling rate) и длину данных. Задача воспроизведения звука осуществляется использованием оцифрованных данных (содержащихся в подсекции data файла *.WAV) для обновления уровня на выходе DAC, в нашем примере данные закодированы 8 битами (принимают значения от 0 до 255).

DAC Channel1 запускается с регулярными интервалами от таймера TIM6, в соответствии с указанной частотой выборок (sample rate) в заголовке WAV-файла. Демонстрационный исходный код, который считывает данные и проигрывает их, написан на языке C, и находится в файлах waveplayer.c и waveplayer.h (см. архив [9]). Воспроизведение начинается с запуска функции WavePlayerMenu_Start() (см. алгоритм работы аудиоплеера на рис. 16).

AN3126 DAC audio player flowchart fig16

Рис. 16. Алгоритм работы примера аудиоплеера.

Примечание (*): когда DMA передает данные из буфера SRAM, CPU передает данные из памяти Flash карты microSD™ в другой буфер SRAM, и эти буферы периодически переключаются (это называется двойной буферизацией).

В этом приложении является важной совместная обработка чтения (из внешней памяти, здесь такой памятью служит карта microSD) и записи (в регистр данных DAC) цифровых данных сигнала (см. рис. 17).

AN3126 CPU and DMA activities during wave playing process fig17

Рис. 17. Диаграмма активности CPU и DMA во время воспроизведения звука.

Примечание: вместо считывания с карты данные звука могут быть сгенерированы с помощью вычислений CPU и записаны в буфер DMA, это называется прямым цифровым синтезом сигнала (DDS, Direct Digital Synthesis).

[Ссылки]

1. AN3126 Audio and waveform generation using the DAC in STM32 products site:st.com.
2. AN4566 Extending the DAC performance of STM32 microcontrollers site:st.com.
3. AN2668 Improving STM32F1 Series, STM32F3 Series and STM32Lx Series ADC resolution by oversampling site:st.com.
4. Синтез звуковых сигналов с помощью ШИМ.
5. Wave File Format - формат звукового файла WAV.
6. Начинаем работать в STM32CubeMX. Часть 2 site:habr.com.
7Руководство по использованию обычных таймеров STM32.
8. LFSR: генерация псевдослучайных чисел на регистре сдвига.
9. 210118AN3126-package.zip - документация и примеры исходного кода.

 

Добавить комментарий


Защитный код
Обновить

Top of Page