//

Мысли (Автор: dez)

Широтно-импульсная модуляция вездесуща. Импульсные блоки питания, управление двигателями, освещение - ШИМ везде, где надо плавно регулировать, дергая транзистором. Хотим помигать светодиодом? 8-битный таймер с ШИМ-ом есть даже в тиньке. Нужно изменять среднее значение на выходе маленькими шагами? Берем 16-битный таймер и радуемся. Приспичило устоить музыку через динамик? Как вариант, вместо ЦАП берем RC-цепь, двухтактный каскад и ШИМ с максимальной частотой. Но что, если нужна одновременно и высокая частота, и высокая разрядность? А вот тут появляются нюансы.

Частота и разрядность - вещи, требующие компромисса. Чем больше разрядность таймера, тем дольше придется считать до переполнения, следовательно, тем меньше будет частота. Если мы возьмем какую-нибудь ардуинку с тактовой частотой 16 МГц, то максимальная частота 16-разрядного ШИМ-сигнала, которую мы сможем получить, будет равна 244 Гц. Скромно, не правда ли? Ну и даже если мы возьмем модный ARM и раскочегарим его до 60 или 72 Мгц, мы кое-как перелезем через килогерц.

Выходом из ситуации могут стать разные извращенные алгоритмы, на один из которых я сегодня намекну. Речь идет о дизеринге. Суть этого алгоритма в том, что мы будем изменять (или не изменять) коэффициент заполнения ШИМ в каждом периоде, и за счет такого "шатания" вырастет разрядность. Например, если нужно добавить к разрядности ШИМ 3 бита, то мы будем изменять коэффициент заполения в течение 23=8 периодов. Если, к примеру, эти самые 3 бита содержат число 410 (1002), то где-то в 4-х периодах из 8 нужно прибавить единицу к установленному коэффициенту заполнения.

Dithered PWM example / Пример дизеринга ШИМ

Для того, чтобы такое "шатание" было не слишком заметно в практическом применении, желательно, чтобы единицы и нули в последовательности из 8 периодов были распределены равномерно. Прикидывать такие последовательности на лету тяжко, поэтому обычно применяют таблицы. Просто и со вкусом. Но логично, что чем больше бит мы хотим накинуть, тем жирнее будет таблица, и жирнеть она будет в геометрической прогрессии, так что знайте меру.

Таблица для 3-битного дизеринга / 3-bit dithering patterns

Пример таблицы выше взят из аппноута AN4507 от STMicroelectronics. Кроме того, можно найти на данную тему аппноуты от NXP. Вся эта тема в них достаточно подробно расписана. Так что если у вас нарисовалась подходящая задача, вы теперь знаете, куда копать :)

Статья опубликована 2017-08-19 15:19:33, её прочитали 1584 раз(а).

Добавить комментарий