SBus->PWM декодер своими руками.

Гена_Большой

“Сотворил” сие изделие, отличие от аналогов с Али в высокой скорости работы и большой точности PWM сигналов на выходах.
Данное изделие выдает семь пропорциональных каналов с периодом 7 мс и длительностью импульса с точностью до 1 мкс,
В перспективе прикручу остальные пять пропорциональных каналов и два дискретных DG1/DG2.
Изделие собирается на плате WeAct STM32F411CEU6

Плата для окончательного монтажа может выглядеть так

Реализовано раздельное питание контроллера, приемника и сервоприводов.
В проге достаточно просто назначить требуемые каналы в пакете SBus выходам модуля декодера.
Программа написана с CubeMX с HAL.

Проект открытый, так что все желающие могут его повторить безо всяких ограничений.

Гена_Большой

пока писал сообщение, пришла мысль, как реализовать вывод всех 16 каналов с точностью 1 мкс и периодом 7 мс. но время ушло и откорректировать уже не выйдет, так что …
Обновление версии девайса.

  • 14 пропорциональных каналов с точностью PWM 1 мкс и периодом 7 мс (соответствует HS режиму Futaba).
  • 2 дискретных канала, те которые DG1/DG2.

Устройство видит f/s и потерянные блоки, но как это использовать пока не придумал

И да, плата стала не актуальной

3 months later
Nosowandrey

Зравствуйте. Насколько знаю, у ардуин есть проблема с малым разрешением ШИМ - всего 256 положений из-за низкой частоты таймера. Как здесь решена эта проблема? Так-же, на вход подается ивертированный или неинвертированный сигнал?

Гена_Большой

Добрый день, используются аппаратные возможности F411, а именно 16 разрядные таймеры,
частота процессора 100 МГц, “картинку” смотрю на анализаторе HANTEC MSO5202D ),
в данном изделии погрешность генерирования ШИМ на всех каналах меньше 1 мкс.
т.е. если на выходе должно быть 1522 мкс, то будет именно столько.
все это реализуется на аппаратном уровне, никакие прерывания для генерации ШИМ не используются.

программная часть сведена только к декодированию SBus, “образец” обработки взят с Гитхаба,
требуемая длинна импульса для каждого канала, после декодирования пакета SBus, записывается в регистр прелоадер,
откуда таймеры сами эти значения забирают при следующем запуске,
период перезапуска таймера определен на этапе инициализации таймеров и составляет 7 мсек.
вероятно возможность приема инвертированного UART у STM32 есть, но я искать пока не стал,
на входе стоит инвертор на одном транзисторе.

Nosowandrey:

у ардуин есть проблема с малым разрешением ШИМ - всего 256 положений из-за низкой частоты таймера.

у АТМЕГА328 только один таймер 16 битный.