Продолжение разработки сервоконтроллера MC50. В предыдущем проекте управления DС мотором специалисты в комментариях высказали сомнения относительно способа изменять состояние линий ШИМ путём переназначения функций портов в реальном времени. Этот способ был применён в связи с оригинальной архитектурой формирователей мёртвого времени в  таймерах чипов семейства Renesas Synergy.   Схема и плата контроллера Первые шаги по программированию контроллера Развёртывание промежуточного программного обеспечения Отладка взаимодействия с интернетом 6-шаговая коммутация BLDC моторов Разработка сервопривода с BLDC мотором Разработка робастного управления сервоприводом Безопасное управление двигателем постоянного тока  Во многих популярных микроконтроллерах мёртвое формируется отдельным узлом вносящим задержку в нарастающие и спадающие фронты исходного сигнала формируемого компараторами.  В простейшем варианте для верхнего и нижнего ключей транзисторного полумоста получаем два сигнала, один с задержкой от нарастающего фронта, а другой инвертированный с задержкой от спадающего фронта исходного сигнала таймера.     В чипах Renesas Synergy подобного узла задержки нет. Вместо этого в их таймер встроен механизм автоматической корректировки значения компаратора-формирователя ШИМ нижнего ключа на основе значения компаратора-формирователя ШИМ верхнего ключа. Это позволяет более строго выдерживать симметричность импульсов ШИМ  при изменении скважности.  Реализация была дана здесь. В контексте конкретной схемы MC50 ничем.  Но в общем случае переход на функции портов ввода-вывода отключает возможность автоматического аварийного сброса всех 6 сигналов ШИМ в ноль. В MC50 за сброс в ноль напряжений на затворах ответственность несёт микросхема драйвера,  там реализованы все защиты по перенапряжению, недонапряжению, перегрузкам по току и температуре.  Конечно, микроконтроллер по прежнему готов реагировать на аварии, но реакция может затянуться на долгие сотни наносекунд. Хотя по правде говоря в инверторах и так существуют сквозные токи до сотни наносекунд из-за медленного рассасывания носителей в диодах мощных MOSFET.  Собственно проблеме не в самом ШИМ, а в том как к нему привязана выборка АЦП. В импульсных схемах измерение тока делают строго по середине импульсов, чтобы точно знать средний ток. В таймерах есть специальные средства для синхронизации выборки АЦП с генератором ШИМ. Если мёртвое время постоянно, то  с синхронизацией в обычных таймерах проблем нет. Но если мёртвое время регулируется в реальном времени, то и точку выборки АЦП надо регулировать вместе с ним. В Renesas Synergy этого делать не надо, поскольку точка выборки всегда останется на своём месте. Это экономит ресурсы времени, поскольку часто на процедуру обслуживания прерываний остаются считанные микросекунды.      Новая реализация не трогает функции портов ввода-вывода. Она полагается только на функциональность самих таймеров. Однако есть существенный нюанс. Метод работает с задержкой на один или два цикла ШИМ. Но в моторах это некритично.  Как всегда все упирается в неполноту документации на микроконтроллеры. Средний мануал уже переваливает за 2 тыс. страниц, но информации становится все меньше. В регистрах таймера Renesas Synergy можно найти General PWM Timer Count Direction and Duty Setting Register. Название само за себя говорит. Это то что должно легко давать возможность менять ШИМ с 0% до  100% и обратно. Функция управления ШИМ выглядит так: Но осциллограмма переключения сигналов на выходе выглядит печально: Этот регистр правильно устанавливает 0% и 100% ШИМ, но совершенно не учитывает мёртвое время, несмотря на то, что оно было задано в соответствующих регистрах.   Правильный способ должен обязательно проверять на какой фазе счётчика мы находимся в момент прерывания: нарастания или спада и какое было состояние ШИМ до этого.  Диаграмма с разными сценариями загрузки компараторов счётчика дана ниже.  Алгоритм действий с таймером при инициализации следующий: Конфигурирование таймера для генерации симметричного ШИМ сигнала с назначением мёртвого времени одинакового для переднего и заднего фронтов При симметричном ШИМ таймер сначала нарастает потом спадает. Сигнал на верхнем ключе в 1 когда таймер превышает значение компаратора. Компараторы загружаются в режиме буферизации. Загруженное сейчас значение вступает в силу только со старта следующего цикла Загружаем только компаратор канала A (верхнего ключа). Компаратор B (нижнего ключа) вычисляется автоматически формирователем мёртвого времени. Отдельно программируем компаратор генерации триггера начала выборки АЦП. Срабатывание компаратор происходит на пару микросекунд раньше начала очередного цикла таймера. Таким образом сам момент выборки приходится точно на центр импульса ШИМ.  По окончании преобразований АЦП вызывается прерывание. В этом прерывании производятся все основные действия по расчёту и записи новых значений в компараторы таймеров для следующего цикла ШИМ.  Инициализация таймера выглядит так: Полная инициализация всех 3 каналов выглядит так: Модуль с тестом разных сценариев переключения состояния ШИМ выглядит так: И наконец сама функция переключения состояния ШИМ для одного канала выглядит так: Исследования данного метода предполагает наличие 2-канального осциллографа от 200 Мгц с входом внешней синхронизации или 4-х канального осциллографа. Сигнал синхронизации отмечающий место смены состояний ШИМ выводится на светодиод LED2. Для простоты кода переменная с номером теста меняется прямо из окна Live Watch отладчика IAR Workbench. Тест не планируется вводить в основную ветку проекта MC50.   Новый способ оказался более коротким чем предыдущий с перепрограммирование портов. Он требует всего одну запись в периферийный регистр. Однако за это пришлось пожертвовать временем реакции на команду изменения состояния ШИМ. Состояние изменится через один или два цикла ШИМ после регистрации запроса из основной задачи.