Генерация тона с помощью ШИМ-сигнала на динамик на микроконтроллере PIC32

В настоящее время я работаю над генерацией тона на устройстве PIC32. Информации, которую я нашел, было недостаточно, чтобы дать мне полное понимание того, как этого добиться. Насколько я понимаю, сигнал ШИМ отправляет 1 и 0 с заданным рабочим циклом и частотой, так что можно, например, вращать что-то с определенной скоростью. Но для того, чтобы создать тон, этого недостаточно. Я в первую очередь сосредотачиваюсь на следующих двух ссылках для создания кода:

http://umassamherstm5.org/tech-tutorials/pic32-tutorials/pic32mx220-tutorials/pwm http://www.mikroe.com/chapters/view/54/chapter-6-output-compare-module/

А также соответствующие части в справочном руководстве.

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

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

2 ответа

Решение

Если вы используете ШИМ для имитации ЦАП и вывода произвольного звука (для простого и грязного тона заданной частоты эта сложность вам не нужна), вы хотите взять аудиосэмплы (PCM) и преобразовать их каждый в соответствующий рабочий цикл.

Разумный звук начинается с частоты дискретизации 8 кГц (POTS). Таким образом, для каждой (каждой 1/8000-й секунды) выборки вам необходимо изменить рабочий цикл. И вы хотите, чтобы эти изменения были регулярными, так как нарушения будут способствовать слышимым искажениям. Таким образом, вы можете запрограммировать таймер на генерацию прерываний с частотой 8 кГц и в ISR изменить рабочий цикл в соответствии с новым значением аудиосэмпла (этот ISR должен считывать сэмплы из памяти, если они не образуют простой шаблон и могут быть вычислены на летать).

Когда вы меняете рабочий цикл с частотой 8 кГц, вы генерируете периодическую волну с частотой 4 кГц. Это очень хорошо слышно. Хорошая фильтрация в аналоговых схемах без влияния на звук, который вы хотите услышать, может быть не очень легкой задачей (острые фильтры LPF сложны / дороги, дешевые фильтры плохие). Вместо этого вы можете увеличить частоту дискретизации до уровня, в два раза превышающего то, что может воспроизводить динамик (или слышит человеческое ухо), или, по крайней мере, значительно выше максимальной частоты, которую вы хотите произвести (в этом последнем случае дешевый аналоговый фильтр может помочь избавиться от нежелательная периодическая волна без особого влияния на то, что вы хотите услышать, вам не нужна такая большая резкость).

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

[Я делал это раньше на динамике моего ПК, но теперь он разрушен благодаря SMM/SMI, которые используются BIOS и чипсетом.]

Для воспроизведения простых тональных сигналов через PWM сначала требуется схема драйвера, поскольку PIC не может управлять динамиком напрямую. Как правило, двухтактный режим используется, поскольку активная передача высоких и низких частот приводит к лучшему отклику динамика. Это также позволяет использовать последовательный конденсатор, выступающий в качестве простого фильтра верхних частот для защиты динамика от длительных периодов постоянного тока.

Это, например, должно работать: http://3.bp.blogspot.com/-FFBftqQ0o8c/Tb3x2ouLV1I/AAAAAAAABIA/FFmW9Xdwzec/s400/sound.png

(источник: http://electro-mcu-stuff.blogspot.be/)

PIC32 имеет аппаратный ШИМ, который вы можете запрограммировать на генерацию ШИМ с определенной частотой и рабочим циклом. Частота ШИМ управляет тоном, таким образом, изменяя частоту ШИМ с интервалами, вы можете воспроизводить простую музыку. Рабочий цикл влияет на объем, но не линейно. Высокие рабочие циклы очень близки к чистому постоянному току и будут отключены конденсатором, низкие рабочие циклы могут быть не слышны. Некоторые эксперименты в порядке.

В ссылке упоминаются прерывания по таймеру, потому что речь идет не о воспроизведении простых нот, а об использовании ШИМ + фильтра низких частот в качестве простого ЦАП для воспроизведения реального звука. В этом случае прерывания по таймеру будут использоваться для обновления рабочего цикла следующей выборкой ИКМ, которая будет воспроизводиться через регулярные интервалы (частота выборки).

Другие вопросы по тегам