PWM, ADC и другие функции выводов Olimexino-STM32

Первый же вопрос, возникающий у пользователя при освоении платы Olimexino-STM32 (см. страницу Осваиваем Olimexino-STM32), формулируется следующим образом: электронному музыканту Ванямбе нужны 2 ШИМ-вывода, для того, чтобы послушать, как звучит 11-битный PWM с частотой 35156 Гц. Параметры не ахти, конечно, скорее всего это будет напоминать по звучанию легендарный Gravis Ultrasound, но тот выдавал звук с частотой сэмплирования 44.1 кГц, а это 10-битный ШИМ примерно для предделителя /1 с частотой тактирования 72 МГц.

Так что 35.2 кГц и 11 бит -- это вполне неплохо по мнению Ванямбы, если не заморачиваться с подключением ЦАПа по интерфейсу I2S к микроконтроллеру STM32F103RB. Ведь подобная задача отберёт большую часть процессорного времени на передачу данных в ЦАП, в то время как правильно запрограммированный таймер будет просто вызывать функцию прерывания с заданной частотой, а программа в это время будет ждать себе, когда таймер флаг выставит, что пора очередные 11 бит в регистр загрузить.

"Неужели всё настолько грустно, неужели нельзя 16-битное значение туда записать," -- такой вопрос может возникнуть.

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

"Почему не 44.1 кГц?" -- тоже резонный вопрос, резонным ответом на который является разрядность, равная 10 битам.

Дело в том, что от разрядности напрямую зависят так называемые шумы квантования. Это будет как бы CD-качество, но с эффектом lo-fi, а вот 35.2 кГц -- это уже частота ШИМ в области ультразвука, и при этом 11 бит тоже совсем неплохо, ведь речь идёт о том, чтобы получить синтезатор, в котором отсутствует ЦАП. То есть эдакий курьёз, электронная игрушка, генератор сигналов.

Смысл данного эксперимента состоит в том, чтобы освоить возможности Olimexino-STM32, а генерация сигналов методом широтно-импульсной модуляции и управление например четырьмя цифровыми потенциометрами (это чтобы 16 бит стерео на выходе было) -- это две разные задачи. Вот поэтому ШИМ.

"Но где же находятся эти выводы ШИМ?" -- спрашивает себя электронный музыкант Ванямба.

Ответ находится в файле maple.cpp в директории libmaple/wirish/boards/. В этом файле на языке C++ описаны дополнительные функции выводов платы и распиновка выводов [D0..D43] в целом.

Распиновка Olimexino-STM32

Широтно-импульсная модуляция (PWM) соответственно может генерироваться на тех выводах (pin), которые связаны с одним из каналов таймеров. Также в таблице приведены номера каналов аналого-цифрового преобразователя (ADC).

Автор: Андрей Шаройко <vanyamboe@gmail.com>