Как микроконтроллером выводить звук через ШИМ и таймеры?

Все никак не могу понять, каким образом генерировать музыку звук микроконтроллером. Разобрался с ШИМ и таймерами в msp430, но все никак не могу разобраться с выводом аудио, вместо музыки звука выводятся только какие-то писки. В Интернете есть готовые примеры на Си, но в большинстве случаев без использования таймеров, и на микроконтроллерах AVR, а у меня msp430. Чтобы портировать, нужно сперва разобраться как это должно работать. Расскажите, пожалуйста, вкратце, как рассчитывать правильно деление таймера, управлять громкостью, и выводить различные ноты. Скорость микроконтроллера у меня в пределах 1МГц — 16 МГц, имеется 2 16-ти битных таймера
  • Вопрос задан
  • 15320 просмотров
Решения вопроса 1
Ocelot
@Ocelot
Допустим, нужно сгенерировать какой-нибудь семпл — кусок звуковой волны. Неважно, что это будет: синус или что посложнее.

1) Делим этот семпл на отсчеты. Каждый отсчет представляет собой мгновенное значение уровня сигнала (напряжение на обмотке динамика). Частота следования отсчетов — частота дискретизации — должна быть как мининум вдвое выше максимальной частоты воспроизводимого звука. Нужен голос (диапазон от 300 до 3800 Гц) — берем частоту дискретизации 7,6 кГц. Нужна музыка — еще выше.
Значения отсчетов можно хранить в виде массивов или генерировать на лету.

2) Каждому отсчету соответствует своя скважность ШИМ. Соотв., при частоте дискретизации 7,6 кГц нужно 7600 раз в секунду задавать новую скважность.

3) Какая нужна частота ШИМ? Между соседними отсчетами должно укладываться несколько периодов несущей. Больше — лучше. Сколько именно — зависит от требуемого уровня шума, аналоговых фильтров на выходе и т.д. (там довольно суровый матан). Для простоты возьмем частоту ШИМ в 10 раз выше частоты дискретизации — 76 кГц.

4) Какая должна быть разрядность ШИМ? Зависит от требуемого динамического диапазона. 8-битный ШИМ даст отношение самого громкого и самого тихого сигнала 256:1 (~24 дБ). 16-битный — 65536:1 (~48 дБ).

5) Какая в итоге нужна тактовая частота? F = (частота ШИМ) * 2(разрядность ШИМ). Для нашего случая с 8-битным ШИМом — почти 20 МГц. Если нужен phase-correct PWM — еще в два раза выше.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
dlinyj
@dlinyj
Суть такова, что ШИМ — это эквивалент напряжения. Т.е. если сважность равна нулю то напряжение на выходе равно нулю, а если скважность равна 100%, то это 3,3 (или 5 вольт, в зависимости от логики контроллера). На выходе ШИМ обычно ставят ФВЧ (фильтр высоких частот), отсекая сам сигнал ШИМ, и в результате получают сглаженный сигнал. Чтобы получить некий звук, например синус, надо менять скважность по синусоиде (от нуля до 100% и потом обратно, можно использовать готовые таблицы). Частота звучания зависит от скорости изменения по синусу. Комбинируя звуки различных частот можно получить музыку.

image
Картинка с википедии (читать тут)

Как-то так.
Ответ написан
Есть в msp430 аппаратный ШИМ. чтоб им сгенерить синус, к примеру, надо менять скважность ШИМа с частотой выборок. т.е. добиваться нужного уровня в нужное время. уровень определяется скважностью ШИМ. соответственно, несущая частота ШИМ должна быть много больше максимальной частоты получаемого звука.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы