Спектроанализатор звука своими руками stm32

Добавил пользователь Алексей Ф.
Обновлено: 03.10.2024

В этой статье (перевод апноута 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], может быть сгенерирована последовательность 2 n-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).

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

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

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

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

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

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

Таким образом, если выходная частота триггера 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 до внешних излучателей звука.

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

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

• Звук закодирован как PCM. Это данные без компрессии, где каждое значение данных представляет выборку сигнала в моменты дискретизации.
• Частота дискретизации (sample rate): может быть 8000, 11025, 22050 или 44100 Гц.
• Разрядность одной выборки (bits per sample): 8 (диапазон данных уровня звука 226).
• Количество каналов: 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).

Фото 2/2 Spectrum Analyzer - Большой Фурье, Светодиодный анализатор спектра. 18 столбцов x 14 разрядов. SK6812mini, STM32F302CB

Устройство работает под управлением микроконтроллера STM32F302CB установленного на модуле RDC2-0060. В нем происходит обработка звукового сигнала поступающего на АЦП. Звуковой диапазон разделен на 18 полос. С помощью быстрого преобразования Фурье (БПФ) вычисляется и формируется уровень в каждой полосе. Одновременно этот уровень отображается на светодиодных столбиках для каждой полосы на дисплее D 18x14.

Технические характеристики:

Источник питания: +5В, 3А
Размер платы RDC2-0060: 98 х 32 мм
Размер дисплея:124 x 90 мм
Количество светодиодов: 252 (18 столбцов x 14 разрядов)
Количество отображаемых частотных полос – 18
Диапазон отображаемых частот 39Гц – 20кГц
Шаг настройки: 39Гц

Интерфейс ПО


Схема RDC2-0060

Схема

Схема дисплея D 18x14

Схема

Разъемы и управление

Подключение и управление

Подключение и управление

В качестве дисплея можно использовать линейки из 14-ти светодиодов Neopixel с разъемами. Из девяти наборов можно собрать ещё более яркий дисплей 18 x 14 с RGB светодиодами WS2812b

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

Купить на Aliexpress

Схема электрическая принципиальная

В общем-то она не поменялась с того времени, ток чутка подправил.

Печатная плата

Немного переработана с учетом возможности использования компонентов сквозного монтажа.


Была выписана из Китая, подробнее в статье о заказе плат в китайских конторах.


А вот так это должно выглядеть:


Компоненты


Новая крутая плата. Известная синяя пилюля ( Blue Pill ), но теперь с разъемом USB Type-C, как вы это любите (очевидно вдохновением была MiniF4 STM32F411CE6).


Стоит она дороже, но это того стоит.


Гнездо BNC (bayonet Neill-Concelman) самое простое (говённое кстати ).


Миниатюрные диоды поверхностного монтажа можно найти платах люминесцентных ламп.


Получившаяся приставка


Подключение прошло успешно

Раньше это выглядело не очень, а теперь просто класс :


Подключать и отключать удобно:


Прошивка

С помощью программатора-отладчика ST-LINK V2

Его можно сделать, но проще приобрести. Используется программы STM32CubeProgrammer:


Далее распаковать архив в любую папку.

2) Подключить STLINK к синей пилюле и его через USB к ПК или телефону:


Если была ранее произведена прошивка, то перед подключением зажать кнопку сброса ( NRST) и после подключения отпустить. Нажать Connect, подключение должно пройти успешно (в случае необходимости обновить прошивку стлинка)


3) Нажать Open File и выбрать нужную прошивку.


4) Всё завершено:


С помощью USB-TTL преобразователя

Многим будет проще прошить МК использую обычный USB-COM преобразователь и телефон.

1) Подключить преобразователь так:

RX PA9
TX PA10
5V 5V
GND GND


2) Перед подачей питания на плате установить перемычки так, а если кнопка, то зажать BOOT перед подключением питания.



Ещё фото


Подключение к телефону и калибровка

Теперь благодаря использованию разъема USB Type-C


можно подключать осциллограф к телефону напрямую с помощью кабеля USB-C—USB-C без всяких переходников!


Необходимо приложение HScope, урезанная демонстрационная версия бесплатна, для каждого осциллографа своя лицензия, например, HS101 стояло 7$.


Теперь можно удобно подключать щупы:


но для используемого гнезда BNC не все подошли (средний не втыкается):


Сначала желательно провести калибровку нуля. Просто замыкаем контакты щупов и в разделе Calibration жмём Calib Zero Lvl -> Continue:


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


Использование щупов с делителем


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


Теперь с делителем можно подавать до 200 В:


Проверка работы

Сначала опыт с LC-контуром:


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


Также подал прямоугольный сигнал 1 кГц, ну что на него просто смотреть, цепляю фильтр низких частот:


При увеличении сопротивления частота среза уменьшается, то де самое можно сделать программно, там есть настройки ФНЧ и ФВЧ.


Но что еще интересней, нажав на кубик можно провести Быстрое Преобразование Фурье:


Проверка на прямоугольном сигнале, это уже было:




Здесь же включается ФНЧ с разным порядком:


Ещё здесь есть возможность длительной регистрации значений напряжения ( МИН, МАКС, СРЕДНЕКВАДРАТИЧЕСКОЕ ), что также очень полезно.


Видосик

Итого

По итогу этим осликом буду пользоваться часто из-за красивого внешнего вида, относительно удобного управления и простого сохранения осциллограмм, что хорошо для демонстрации и публикации.

Да, опять блютуз версия проверена не будет (хотя HC-06 этом уже имеется), т.к. здесь как-то криво организовано подключение, да и с самими модулями могут быть проблемы.

10 полосный анализатор спектра. 400 LED.

Всем привет! Хочу поделиться своей версией реализации 10 полосного анализатора спектра. За основу взял информацию и схемы тут и тут .
Итак, структура - предусилитель, 10 активных полосовых фильтров, 10 линеек индикаторов по 40 Led каждая.

Принципиальная схема блока фильтров и предусилителя ниже на рисунке. Фильтры настроены на следующие частоты: 32Гц, 63Гц, 125Гц, 250Гц, 500Гц, 1кГц, 2кГц, 4кГц, 8кГц, 16кГц.

10 полосный анализатор спектра. 400 LED.

10 полосный анализатор спектра. 400 LED.


Рекомендации по подбору емкостей- номиналы емкостей лучше подбирать с помощью LCR метра ( я пользовался E7-22) нестандартные номиналы получал параллельно или последовательно собирая из стандартного ряда.

10 полосный анализатор спектра. 400 LED.

Печатная плата в DIP и SMD вариантах все есть в архиве .Платы заказывал на производстве так как дома такие размеры было проблематично сделать (размер в DIP 320х50).
В качестве диода можно использовать любой быстродействующий диод Шоттки. Сопротивление резисторов на светодиоды зависит от типа используемых светодиодов, ( надо рассчитать по току), можно использовать любые другие светодиоды с пересчетом или переделкой схемы. ДА есть еще одно замечание- это потребление одной линейки, при задействовании все 40 светодиодов линейка потребляет 40*0,02А=0,8А а все 10 линеек будут кушать при полном задействовании светодиодов 8А!! не забудьте подобрать соответствующий блок питания. Если будете использовать покупной импульсный БП с несколькими входами как правило это +/-12В, +5В, то есть один нюанс с которым я столкнулся, если одноканальные Импульсные БП в большинстве не требуют нагрузку для запуска, то многоканальные требуют, т.е. необходимо нагрузить все каналы чтобы БП запустился.
Настройка.
Настройка заключается в установке равенства чувствительности всех каналов. Нужен генератор НЧ и низкочастотный милливольтметр. На генераторе устанавливают последовательно частоты 32 Гц, 63 Гц, 125 Гц, 250 Гц. 500 Гц, 1 кГц, 2 кГц, 4 кГц, 8 кГц и 16 кГц. Частоты поочередно подают на вход прибора. При этом параллельно выходу генератора НЧ должен быть подключен милливольтметр, по его показаниям нужно следить за тем, чтобы величины напряжения ЗЧ, подаваемые с ГНЧ на всех частотах были одинаковыми (при необходимости регулировать регулятором уровня выхода ГНЧ). Выставляем R42 предварительного усилителя в среднее положение и начиная с частоты 32 Гц на ГНЧ устанавливают такой уровень выходного напряжения при котором в среднем положении R2( блока фильтра 32Гц) горит средний светодиод индикаторной шкалы. Запоминаете этот уровень выходного напряжения ГНЧ. Затем повышаете частоту до 64 Гц. Устанавливаете такой же уровень НЧ с выхода ГНЧ (смотря по милливольтметру), и регулируете R*в фильтре 63Гц так чтобы горел средний светодиод шкалы 63 Гц.
Аналогичные операции проделать на всех других частотах. Предварительно можно точнее установить средние частоты полос, определив среднюю частоту каждого фильтра перестройкой частоты ГНЧ в некоторых пределах относительно указанной частоты на схеме. Затем, если есть существенное отличие, отрегулировать частоту соответствующим изменением емкостей конденсаторов.

Читайте также: