Что такое шим модуляция звука
В этой статье (перевод [1]) будет показано, как воспроизвести звук с помощью микроконтроллера STM32F103. В статье [2] рассматривалось немного теории о том, как генерируются аналоговые сигналы с помощью ШИМ, и теперь посмотрим, как это можно реализовать на практике.
В основном нужно выполнить следующие 3 шага:
• Настроить таймер для генерации сигнала ШИМ (PWM).
• Настроить контроллер DMA для копирования выборок звука.
• Сконфигурировать второй таймер, чтобы он периодически запускал DMA.
В этом примере для генерации сигнала PWM используется таймер 2. Он тактируется на максимально возможной частоте 72 МГц (главная частота). В статье [2] было показано, что существует компромисс между точностью (разрешающей способностью) ШИМ и частотой ШИМ. Обычно звук записывается с разрешающей способностью 16 бит (качество CD), однако максимальная частота ШИМ окажется слишком низкой: 72 МГц/(2^16) = 1098 Гц. Поэтому для синтеза звука автором была выбрана разрешающая способность 8 бит, которая дает частоту ШИМ 72 МГц/(2^8)=281250 Гц (в режиме обычного ШИМ, или Fast PWM). Это очень хороший выбор частоты ШИМ, потому частота помех оказывается намного выше максимальной слышимой человеком частоты звука. Другое достоинство выбранного метода ШИМ состоит в том, что 8-битные выборки звука занимают 1 байт, что упрощает программирование. Если бы наши выборки были бы 10-битные, то их приходилось бы хранить в 2 байтах, что в 2 раза увеличило бы затраты памяти.
После настройки таймера для генерации ШИМ конфигурируется контроллер DMA. Аббревиатура DMA обозначает direct memory access, т. е. прямой доступ к памяти (этому термину соответствует полузабытая русская аббревиатура ПДП). Контроллер DMA является периферийным устройством микроконтроллера STM32. Его основное назначение — копировать данные из одного места в адресном пространстве в другое место. Большое достоинство DMA состоит в том, что процесс копирования, будучи запущенным, уже не зависит от вычислительного ядра (CPU) микроконтроллера, освобождая его процессорное время для других задач. Контроллер DMA работает следующим образом: мы указываем ему, откуда брать данные (адрес источника, source), и куда их нужно копировать (адрес места назначения, destination). Затем мы должны сконфигурировать, что будет запускать передачу данных (момент, когда начнется процесс копирования), т. е. триггер DMA.
В нашем случае источником, откуда будут выбираться данные, служит массив, где хранятся 8-битные выборки звука. Местом назначения служит регистр таймера 2, который содержит значения сравнения для генерируемого ШИМ (PWM compare value). Это значение определяет скважность формируемых периодов ШИМ. Транзакция DMA должна запускаться с той же частотой, с которой был записан звук (sample rate). В этом примере используется стандартная частота 44.1 кГц. Таким образом, каждые 1/441000 секунды новая выборка выводится с помощью ШИМ, получается PWM DAC (ЦАП на основе ШИМ).
Исходный код проекта опубликован на GitHub (см. [3, 5], каталог PWM_DAC_SOUND). В нем не использовались библиотеки HAL, потому что автор ставил перед собой задачу научиться работать с ресурсами микроконтроллера STM32 напрямую, просто путем изучения документации на микроконтроллер. Приятная возможность — контроллер DMA и таймер сами проигрывают звук, и при этом CPU никак не используется! Это видно в исходном коде, главный бесконечный цикл функции main совершенно пустой.
/* MAIN LOOP */
while(1)< // do nothing >
Для проверки были созданы 2 звуковых файла. В одном была записана простая таблица (lookup-table) для синтеза синусоиды 5 кГц. Чтобы проверить, как будет воспроизводиться реальный голос, через микрофон была записана фраза «Hello test». Для преобразования звуковых данных использовался хорошо известный, бесплатный звуковой редактор Audacity, в нем звук был экспортирован в файл как сырые данные «8bit unsigned RAW». Это просто двоичный файл, где находятся 8-битные выборки оцифрованного звука. Чтобы запрограммировать этот файл в микроконтроллер, была создана простая программа на C++, которая преобразовывала двоичные данные файла в удобный для использования заголовочный файл языка C (см. [4, 5], каталог 8bit_raw_audio_2_c_header_converter). Остается только подключить этот заголовочный файл к проекту, и использовать эти данные в качестве источника данных звука.
Для фильтрации импульсов ШИМ на отладочной плате собрана простая схема двухкаскадного ФНЧ. Операционный усилитель MCP6002 удобен тем, что он поддерживает прохождение сигнала rail-to-rail со входа на выход даже при питании от низких напряжений (3.3V, используемые на плате микроконтроллера STM32). На выход были подключены обычные стереонаушники (правый и левый канал соединены последовательно для увеличения сопротивления нагрузки).
На картинке ниже показан скриншот синтезированного сигнала синуса 5 кГц (экран программы осциллографа PicoScope 2204A). Красная линия здесь показывает сигнал ШИМ, а синяя выходной сигнал после ФНЧ.
Результат очень хороший, даже если учесть, что использовалось всего 9 выборок на период синтезируемого сигнала. При исследовании спектра сигнала хорошо видны гармоники ШИМ:
Основной пик находится на частоте 5 кГц, это синусоидальный полезный сигнал. Следующий по уровню пик находится на частоте 280 кГц, это частота ШИМ. Следующий пик 560 кГц, удвоенная частота ШИМ. Эти гармоники не представляют никакой проблемы, потому что их частота находится далеко выше порога слышимости, или даже частоты, которую могут воспроизводить обычные акустические системы.
С воспроизведением голоса фразы «Hello test» все получилось лучше, чем можно было ожидать от качества 8 бит. Конечно же, звук не HiFi, однако чистый и разборчивый. Результат получился весьма обнадеживающий, однако огорчает малый объем памяти микроконтроллера, куда не получится записать звук длиной больше нескольких секунд, 64 килобайта FLASH-памяти программ STM32F103 быстро переполняются. По этой причине было решено попробовать подключить к микроконтроллеру внешнюю FLASH-память [6].
[Ссылки]
1. Create audio signals with PWM site:marcelmg.github.io.
2. Сравнение режимов ШИМ — обычного и центрированного.
3. MarcelMG / STM32F103C8T6 site:github.com.
4. MarcelMG / Miscellaneous site:github.com.
5. 200305Left-vs-Centered-PWM.zip — исходный код.
6. W25Q64JV SPI flash memory chip as external memory site:github.com.
Что такое ШИМ? Как широтно-импульсная модуляция используется в автоматизации?
Широтно-импульсная модуляция, или PWM (pulse-width modulation) — это тип цифрового сигнала, который модулируется для управления мощностью, скоростью и/или положением устройств в автоматизированной системе. PWM работает путем создания серии импульсов включения и выключения, которые подаются на устройство, при этом время включения или рабочий цикл импульса определяет количество подаваемой мощности.
Для чего используется?
Широтно-импульсная модуляция может быть использована для множества различных применений, включая управление двигателями, регулировку яркости освещения и даже управление источниками питания. Сигнал, промодулированный по ширине импульса, также может применяться для регулирования скорости двигателей или других устройств без изменения уровня напряжения. Таким образом, ШИМ становится идеальным вариантом для управления широким спектром устройств в системах автоматизации.
Принцип работы
Принцип работы ШИМ-сигнала заключается в посылке регулярных импульсов через определенные интервалы времени с изменяющимся рабочим циклом (процентное соотношение времени «включения»). В зависимости от рабочего цикла на управляемое устройство подается больше или меньше энергии, что влияет на его скорость или положение в автоматизированной системе. Путем увеличения или уменьшения определенных параметров, таких как частота, амплитуда и длительность импульсов, эти параметры могут быть настроены в соответствии с любыми требованиями приложения и обеспечивают точный контроль над выходом устройства без изменения уровня напряжения. Широтно-импульсная модуляция является важным и широко используемым методом управления выходной мощностью в различных приложениях. Она может быть реализована с помощью цифровых или аналоговых систем управления. В цифровом варианте сигналы генерируются с помощью программных алгоритмов, которые определяют ширину импульсов; в то время как в аналоговом PWM сигналы генерируются аппаратными компонентами, такими как транзисторы и конденсаторы, которые создают желаемую ширину импульсов без необходимости программирования. Оба метода имеют свои преимущества и недостатки, но при правильной реализации оба обеспечивают надежную работу с низким уровнем искажений.
Как работает ШИМ-контроллер в источнике питания?
ШИМ-контроллер работает путем переключения между различными уровнями электрического тока в зависимости от того, какой тип выхода требуется от системы, которую он питает — постоянный ток (DC) или переменный ток (AC). Контроллер регулирует это переключение с помощью широтно-импульсной модуляции, которая посылает регулярные импульсы через определенные промежутки времени с различными рабочими циклами (процентное время «включения»). Таким образом, различные уровни энергии могут подаваться к любому устройству, нуждающемуся в ней, сохраняя при этом стабильность системы в целом — т. е. без электрических скачков, которые могут повредить компоненты в дальнейшем.
Применение широтно-импульсной модуляции
Широтно-импульсная модуляция имеет множество вариаций по практическому использованию в различных отраслях промышленности, таких как авиация, автомобилестроение, робототехника и т. д. Некоторые возможности применения ШИМ-сигнала: управление скоростью и положением двигателя, регулирование яркости света, регулирование напряжения переменного и постоянного тока, обеспечение регулируемых профилей ускорения и замедления для двигателей, снижение электромагнитных помех, обеспечение точной передачи сигналов на большие расстояния и т. д.. Данный вид модуляции является бесценным инструментом, когда речь идет о системах автоматизации, требующих точного контроля над своими выходами без ущерба для стабильности в целом.
Применение широтно-импульсной модуляции в автоматизации
В системах автоматизации широтно-импульсная модуляция имеет множество преимуществ благодаря своей способности точно регулировать выходные параметры, не оказывая слишком сильного влияния на уровень напряжения. Управляющие ШИМ-сигналы широко используется во многих типах машин, включая роботизированные манипуляторы и роботизированные транспортные средства, а также бытовую технику, такую как стиральные машины, духовые шкафы и т. д.. Широтно-импульсная модуляция часто используется для получения синусоидальной формы волны. Она также может быть использована для регулирования работы инвертора. Помимо автоматической регулировки скорости и положения двигателя с помощью цифровых сигналов, они также обеспечивают регулируемые профили ускорения и замедления, что делает их идеальными при работе с хрупкими компонентами, где необходимо избегать резких изменений. Среди других преимуществ — снижение электромагнитных помех, повышение эффективности, усиление мер безопасности благодаря надежным методам обнаружения неисправностей, большая точность при передаче сигналов на большие расстояния и многое другое. В заключение следует отметить, что широтно-импульсная модуляция — это метод контроля и регулирования количества энергии, подаваемой на устройство, путем изменения ширины электрического импульса. Данный метод применяется в автоматизации и робототехнике, от управления двигателями до обеспечения точного контроля над системами освещения. PWM способен обеспечить точное регулирование при минимальных потерях энергии по сравнению с традиционными методами. В каталоге UnitMC вы найдете актуальные устройства и системы АСУ ТП. Подробную информацию и консультацию можно получить у наших сотрудников. Другие статьи Четыре устройства, использующие ШИМ для автоматизации
Что такое шим модуляция звука
Аббревиатурой PWM в английской документации обозначают ШИМ (широтно-импульсная модуляция). PWM (Pulse-Width Modulation) или PDM (Pulse-Duration Modulation) это метод уменьшения средней мощности электрического сигнала путем разделения его на дискретные части (отдельные порции). Среднее значение напряжения (и тока), поступающего в нагрузку, управляется открытием и закрытием электронного ключа на высокой частоте. Чем дольше время, когда ключ открыт в сравнении с временем, когда закрыт, тем больше мощность передается в нагрузку. Вместе с MPPT (maximum power point tracking), это один из основных методов уменьшения выхода энергии с солнечных панелей, чтобы не перегружать заряжаемые батареи [2]. PWM хорошо подходит для управления инерционными нагрузками, такими как моторы или нагреватели. Частота переключения PWM выбирается достаточно большой, чтобы не влиять на нагрузку, т. е. результирующая форма сигнала, воспринимаемая нагрузкой (и изменение мощности), должна получиться как можно более гладкой.
На рисунке ниже показан пример ШИМ на идеальной индуктивности, управляемый импульсами напряжения (синий сигнал), в результате чего получается похожий на синусоиду ток (показан красным). Форма синусоиды далека от идеальной, однако может быть значительно улучшена с повышением частоты импульсов. Обратите внимание, что форма тока это по сути интеграл от формы импульсов напряжения.
Скорость переключения (или частота) может значительно меняться в зависимости от нагрузки и от области применения. Например, в электрической печи можно включать и выключать нагревательный элемент несколько раз в минуту. Частота переключения 120 Гц можно использовать в диммере лампы. Для управления быстрым сервоприводом можно использовать частоты от нескольких килогерц (кГц) или десятков килогерц. В усилителях звука ит блоках питания компьютеров применяют частоты переключения от 44 кГц и выше. Основное достоинство регулирования по принципу PWM в том, что потери мощности на переключение в электронных ключах оказываются намного меньше, чем выходная мощность, передаваемая в нагрузку, и КПД системы регулирования получается очень высокой. PWM также хорошо работает в системах цифрового управления, потому соотношение включено/выключено (скважность периода импульсов) хорошо согласуется с числами, применяемые в цифровых системах. PWM также используется в некоторых системах коммуникаций, где скважность сигнала используется для переноса информации по каналу связи.
Многие современные микроконтроллеры (MCU) содержат в себе встроенные аппаратные PWM-контроллеры, выходы которых могут быть соединены с внешними выводами корпуса MCU. Это широко используется для управления моторами постоянного тока в системах управления роботами и других приложениях. Кроме того, PWM может быть реализована программно, путем прямого управления логическим уровнем ножки порта MCU.
Скважность (duty cycle). Термин скважность обозначает пропорцию времени включения и общим периодом времени включено/выключено. Малое значение скважности соответствует малая выходная мощность, потому что на интервале цикла PWM интервал состояния выключено занимает больше времени, чем включено. Скважность часто выражают в процентах, где 100% означает максимальную выходную мощность, когда ключ постоянно замкнут. Когда у цифрового сигнала половина времени периода лог. 1 (включено), и другая половина в лог. 0 (выключено), то его скважность 50% (прямоугольный сигнал). Когда цифровой сигнал больше времени находится в лог. 1, чем в лог. 0, скважность получается > 50%, и наоборот, когда меньше времени лог. 1, чем лог. 0, то скважнсть < 50%. Примеры сигналов разной скважности:
[Математические и физические основы ШИМ]
ШИМ использует импульсный сигнал прямоугольной формы, в котором ширина импульса модулируется, в результате чего среднее значение сигнала меняется. Если мы выразим функцию сигнала ШИМ как f(t), у которой период T, значение низкого уровня ymin, значение высокого уровня ymax и скважность D (см. рис. 1 ниже), то среднее значение сигнала может быть выражена интегралом:
Что такое шим модуляция звука
Широтно-импульсная модуляция (ШИМ, в английской терминологии это Pulse-Width-Modulation, PWM) может использоваться для реализации цифро-аналогового преобразования (ЦАП, в английской терминологии digital-to-analog converter, DAC), что в конечном итоге позволяет синтезировать аналоговые сигналы с помощью микроконтроллера. Существует 2 основных режима генерации PWM — так называемый асимметричный, с импульсами, выровненными в одну сторону (например влево, left aligned asymmetric mode), и центрированный, когда изменение длительности импульсов выровнено посередине (centered symmetric mode). Здесь приведен перевод статьи [1].
Обычный ШИМ. Первый вариант ШИМ также часто называют быстрым (Fast PWM), в нем таймер/счетчик считает от 0 до своего максимума (например 255 для 8-битного таймера), и затем сбрасывается в 0, когда этот максимум достигнут (так называемое переполнение). Если представить себе процесс изменения значения счетчика, то получится пилообразный сигнал.
Примечание: верхний предел счета и частоту тактирования счетчика во всех современных микроконтроллерах можно задавать программно, что позволяет в широких пределах изменять частоту импульсов ШИМ и диапазон регулирования.
Рис. 1. Обычный ШИМ (Left-Aligned PWM, или Fast PWM) и изменение значения его счетчика.
Центрированный ШИМ. В выровненном по середине режиме (его также называют корректным по фазе ШИМ, Phase correct PWM) таймер/счетчик тоже считает от 0 до своего максимума, но затем не сбрасывается в 0, а начинает считать в обратном направлении, вниз, до нуля. После этого цикл повторяется — снова счет до максимума и снова вниз до нуля. Таким образом, теперь значение счетчика выглядит как изменяющееся по закону треугольника, где правая и левая стороны получают скаты под одинаковым углом (см. рис. 2).
Рис. 2. Центрированный ШИМ (Center-Aligned PWM) и изменение значения его счетчика.
Чтобы получить аналоговый сигнал из цифрового сигнала ШИМ, используют фильтр низких частот — ФНЧ. Фильтр подавляет высокочастотную составляющую в сигнале ШИМ, пропуская низкочастотную составляющую. В нашем цифровом сигнале ШИМ есть мгновенные изменения уровня импульсов, которые имеют (теоретически) бесконечно высокую частоту. Таким образом, эти части сигнала будут подавлены, и низкочастотные составляющие, наподобие средней постоянной составляющей (DC, нулевая частота) и её медленных изменений, беспрепятственно пройдут через ФНЧ.
Давайте рассмотрим пример — нужно синтезировать звуковой сигнал в диапазоне от 0 до 16 кГц (верхняя частота близка пределу слышимости человеческим ухом). Это значит, что частота среза фильтра должна быть больше 16 кГц. Однако в реальном мире не существует идеальных фильтров, у которых прямоугольная характеристика с бесконечно крутым спадом на частоте среза. Например, если мы построим простой RC-фильтр на резисторе и конденсаторе, то это будет так называемый фильтр первого порядка. Такой фильтр создает подавление уровня 20dB на декаду (20dB = изменению уровня в 10 раз, а декада это десятикратное изменение частоты). Т. е. если выбрать значения R и C, чтобы частота видимого спада была около 16 кГц, то на этой частоте коэффициент подавления составит 1.41. Частота в 10 раз больше, т. е. 160 кГц, будет подавлена в 10 раз, частота 1600 кГц в 100 раз и так далее. Мы можем создать фильтры с более крутой характеристикой, например ФНЧ второго порядка, с подавлением 40dB (в 100 раз) на декаду, но в любом случае можно получить лучшие результаты, если частота сигнала ШИМ будет намного выше максимальной частоты, которую нужно синтезировать.
В этой статье рассматриваются различия между центрированным ШИМ и обычным ШИМ, в контексте синтеза аналогового сигнала. Для этой цели в среде моделирования MATLAB/Simulink было создано два ШИМ-генератора и аналоговый фильтр (см. [3, 4]). Вы можете поэкспериментировать со скриптом модели, загрузив его в MATLAB/Simulink.
Рис. 3. Модель MATLAB/Simulink, позволяющая сравнить оба режима ШИМ.
Синтезируемый сигнал имеет частоту 5 кГц, а частота ШИМ составляет 70 кГц. Применен фильтр 1-го порядка с частотой среза 16 кГц. Можно увидеть, как сигнал ШИм фильтруется в обоих режимах (L = left-aligned mode, C = centered mode).
Рис. 4. Сигналы ШИМ режимов L и C, когда частота ШИМ одинаковая.
Сигнал на выходе фильтра очень похож на синусоиду, но содержит «ошибки», которых нам не хотелось бы. Это гармоники сигнала ШИМ, потому что не очень качественный фильтр их все же пропускает. В домене времени (осциллограмма) мы не можем по-настоящему увидеть разницу между двумя режимами ШИМ, L и C. Давайте теперь посмотрим на выходной сигнал в домене частот (спектрограмма):
Рис. 5. Сравнение спектров синтезируемого синусообразного сигнала, когда у режимов Fast PWM и Center-Aligned PWM частота ШИМ одинаковая.
Этот график в основном показывает, какие частоты вносят свой вклад в выходной сигнал. Можно увидеть большой пик на частоте 5 кГц, это та частота, которая «полезная». Если бы этот синусоидальный сигнал был идеальный, то тут был бы виден только пик на 5 кГц с амплитудой 1, и ничего больше. Но как можно видеть, в спектре есть и другие, небольшие пики. Это гармоники, которые вносят ошибку в наш выходной сигнал. Самый большой пик находится на 70 кГц, это частота ШИМ.
В случае обычной ШИМ (left-aligned PWM) присутствуют дополнительные гармоники на частотах 70 кГц +- 5*N кГц, т. е. наша частота ШИМ и умноженная на коэффициент N синтезируемая частота. У центрированной ШИМ (center-aligned PWM) также есть гармоники, но их меньше: они находятся на частотах 70kHz +- 10*N кГц, т. е. на коэффициент N умножается удвоенная частота синтезируемого сигнала. Также видно, что на меньших частотах помех также меньше, например уровень помехи 50 кГц значительно меньше у ШИМ-режима C, чем у ШИМ-режима L.
Можно сделать вывод, что center-aligned PWM всегда лучше для такого применения, но. Мы уже видели, что чем выше частота по отношению к частоте синтезируемого сигнала, тем дальше гармоники находятся в спектре, что приводит к более чистому сигналу на выходе фильтра. Однако в реальном приложении частота ШИМ, которая может быть использована в микроконтроллере, ограничена. В случае left-adjusted PWM, частота ШИМ равна частоте тактирования таймера (например основная тактовая частота микроконтроллера), поделенной на максимальное значение счетчика (например, 256 для 8-битного счетчика). Но в случае centered PWM, максимальная частота ШИМ получается в 2 раза ниже, потому что счетчик считает сначала вверх, потом вниз вместо того, чтобы после счета вверх сбрасываться и начинать счет снова вверх. Таким образом, для анализа ситуации, которая может произойти в нормальном мире, мы должны сравнить результат L-режима ШИМ с частотой, в 2 раза выше, чем у C-режима ШИМ. Ниже показаны результаты моделирования центрированного ШИМ (center-aligned PWM) на 70 кГц и выровненного влево ШИМ (left-adjusted PWM) на 140 кГц. Фильтр в для обоих ШИМ применен одинаковый.
Рис. 6. Сигналы ШИМ режимов L и C, когда частота режима L (Fast PWM) в 2 раза выше, чем у режима C (Center-Aligned PWM).
На осциллограмме видно, что сигнал, синтезируемый left-adjusted PWM, выглядит более плавным. Спектрограмма подтверждает это:
Рис. 7. Сравнение спектров синтезируемого синусообразного сигнала, когда у Fast PWM частота в 2 раза выше, чем у Center-Aligned PWM.
Поскольку частота у left-adjusted PWM в 2 раза выше (140 кГц), гармоники сдвигаются на спектре в сторону более высоких частот. Так что если наше приложение заключается в синтезе звука, то применение left-adjusted PWM на повышенной частоте выгоднее, потому что будет меньше гармоник в слышимом диапазоне частот. Однако для некоторых других приложений, таких как управление силовым драйвером, это не будет преимуществом, потому что гармоники только смещаются вправо по спектру, но не уменьшаются.
Можно сделать 2 основных вывода:
• Существует обратная зависимость между разрядностью счетчика и максимально достижимой частотой ШИМ. Если мы используем меньшее максимальное значение счета (например 255 для 8-битного счетчика вместо 65535 для 16-битного), то получим меньшую разрешающую способность по амплитуде (т. е. будут меньше «шажки» уровня на периоде ШИМ), однако более высокую частоту ШИМ с меньшим количеством гармоник, и наоборот. Т. е. всегда нужен выбор компромисса между максимальным значением счета и частотой ШИМ.
• Какой режим ШИМ лучше использовать — left-aligned PWM или center-aligned PWM — зависит от конкретного приложения. У центрированного режима меньше гармоник, однако у него меньше максимальная частота ШИМ, т. е. гармоники будут находиться ближе к основному синтезируемому сигналу, и их будет сложнее отфильтровать.
Получается, что для синтеза звука left-aligned PWM лучше, потому что можно использовать более высокую частоту ШИМ, потому что более высокочастотные гармоники легче фильтровать. В электронных устройствах, регулирующих мощность, centered PWM режим выгоднее. Когда происходит управление силовыми транзисторами MOSFET, потери на нагрев увеличиваются с ростом частоты переключения. Поскольку у центрированного режима ШИМ меньше гармоник и на более низкой частоте переключения по сравнению с обычным ШИМ, и как следствие получается меньше потерь энергии в драйвере.
В следующей статье [2] рассматривается пример реализации ШИМ на микроконтроллере STM32F103 для проигрывания звука.
[Ссылки]
1. PWM centered vs. left-aligned mode site:marcelmg.github.io.
2. Синтез звуковых сигналов с помощью ШИМ.
3. MarcelMG MATLAB_PWM_analysis site:github.com.
4. 200305Left-vs-Centered-PWM.zip — исходный код.