Как микроконтроллером выводить звук через ШИМ и таймеры?
Все никак не могу понять, каким образом генерировать музыку звук микроконтроллером. Разобрался с ШИМ и таймерами в msp430, но все никак не могу разобраться с выводом аудио, вместо музыки звука выводятся только какие-то писки. В Интернете есть готовые примеры на Си, но в большинстве случаев без использования таймеров, и на микроконтроллерах AVR, а у меня msp430. Чтобы портировать, нужно сперва разобраться как это должно работать. Расскажите, пожалуйста, вкратце, как рассчитывать правильно деление таймера, управлять громкостью, и выводить различные ноты. Скорость микроконтроллера у меня в пределах 1МГц — 16 МГц, имеется 2 16-ти битных таймера
Шим нужен только для управления громкостью. Таймеры позволят генерировать меандр. Внешний синус-генератор сможет из меандра делать нормальную синусоиду, ну а ШИМом можно при помощи доп. транзистора менять амплитуду.
Только все равно это будет не «музыка». Для генерирования музыки нужен полноценный MIDI с кучей ОЗУ и мощным DSP.
Ну полноценную музыку мне не нужно конечно же, какую-нибудь базовую полифонию разве. А по поводу меандра и таймера, как они влияют на звук? Как это связано с частотой звука в герцах?
Можно что-то вроде wav-файлов играть. Но, как уже в ответе говорили, придется менять скважность ШИМ с частотой смены семплов в файле. Как минимум ~20кГц. Микширование — простым сложением уровня сигнала по каналам (возможно — весовым сложением).
А что конкретно нужно-то?
Я к тому, что можно так сильно не извращаться, если нужно монотонную синусоиду воспроизводить с медленно изменяющейся частотой и громкостью: громкость задаем ШИМ'ом, частоту — включением/выключением сигнала на выходе ШИМ'а (если МК позволяет — через DMA и таймеры).
Допустим, нужно сгенерировать какой-нибудь семпл — кусок звуковой волны. Неважно, что это будет: синус или что посложнее.
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 — еще в два раза выше.
Суть такова, что ШИМ — это эквивалент напряжения. Т.е. если сважность равна нулю то напряжение на выходе равно нулю, а если скважность равна 100%, то это 3,3 (или 5 вольт, в зависимости от логики контроллера). На выходе ШИМ обычно ставят ФВЧ (фильтр высоких частот), отсекая сам сигнал ШИМ, и в результате получают сглаженный сигнал. Чтобы получить некий звук, например синус, надо менять скважность по синусоиде (от нуля до 100% и потом обратно, можно использовать готовые таблицы). Частота звучания зависит от скорости изменения по синусу. Комбинируя звуки различных частот можно получить музыку.
Есть в msp430 аппаратный ШИМ. чтоб им сгенерить синус, к примеру, надо менять скважность ШИМа с частотой выборок. т.е. добиваться нужного уровня в нужное время. уровень определяется скважностью ШИМ. соответственно, несущая частота ШИМ должна быть много больше максимальной частоты получаемого звука.