Оглавление:
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-13 06:58
В настоящее время я создаю RC-передатчик / приемник на основе радиочастотного чипа SX1280. Одна из целей проекта состоит в том, чтобы я хотел получить 12-битное разрешение сервоприводов от стиков до сервоприводов. Отчасти потому, что современные цифровые сервоприводы имеют разрешение 12 бит, во-вторых, передатчик высокого класса в любом случае использует 12 бит. Я изучал, как я могу генерировать ШИМ-сигналы высокого разрешения на устройствах STM32. Я использую черную таблетку (STM32F103C8T8) на данный момент для прототипа.
Шаг 1: Список деталей
Аппаратное обеспечение
- Любая отладочная плата STM32F103 (синяя таблетка, черная таблетка и т. Д.)
- Блок питания USB в качестве источника питания
- Программатор STM32 (Segger j-links, ST-LINK / V2 или просто клон st-link)
Программное обеспечение
- STM32CubeMX
- Atollic TrueSTUDIO для STM32
- Источник проекта с github
Шаг 2: очевидное решение
Вероятно, самое простое решение - использовать один из таймеров, который может генерировать сигналы ШИМ, например TIM1-3 на STM32F103. Для современного цифрового сервопривода частота кадров может снизиться до 5 мс или около того, но для старого аналогового сервопривода она должна составлять 20 мс или 50 Гц. Итак, в худшем случае давайте сгенерируем это. При тактовой частоте 72 МГц и разрешении счетчика таймера 16 бит нам необходимо установить предварительный делитель таймера на минимум 23, чтобы покрыть частоту кадров 20 мс. Я выбрал 24, потому что тогда на 20 мс мне нужно установить счетчик точно на 60000. Вы можете увидеть настройку CubeMX и сгенерированные сигналы PWM 1 и 1,5 мс на скриншотах. К сожалению, для 1 мс счетчик таймера должен быть установлен на 3000, что даст нам только 11-битное разрешение. Неплохо, но цель была 12 бит, так что попробуем что-нибудь другое.
Конечно, если бы я выбрал микроконтроллер с 32-битным таймером, например STM32L476, это разрешение может быть намного выше, и проблема будет решена.
Но здесь я хотел бы предложить альтернативное решение, которое еще больше увеличит разрешение даже на STM32F103.
Шаг 3: каскадные таймеры для более высокого разрешения
Основная проблема с предыдущим решением заключается в том, что частота кадров (20 мс) относительно высока по сравнению с фактически сгенерированным ШИМ-сигналом (от 1 до 2 мс), поэтому мы тратим некоторые оцененные биты на оставшиеся 18 мс, когда мы ждем следующий кадр. Это может быть решено с помощью каскадных таймеров с использованием функции привязки таймера для синхронизации.
Идея состоит в том, что я буду использовать TIM1 в качестве ведущего для генерации частоты кадров (20 мс) и TIM2, TIM3 для обработки сигналов ШИМ в качестве ведомых устройств. Когда мастер запускает подчиненные, они генерируют только сигнал ШИМ в одном импульсном режиме. Поэтому мне нужно покрыть только 2 мс в этих таймерах. К счастью, вы можете каскадировать эти таймеры на аппаратном уровне, чтобы эта синхронизация не требовала вмешательства процессора и была очень точной, так как джиттер находится в области ps. Вы можете увидеть настройку CubeMX на скриншотах.
Как вы можете видеть, я выбрал 3 как прескаляр, поэтому для 2 мс мне нужно установить 48000 в счетчике таймера. Это дает нам 24000 на 1 мс, что на самом деле больше, что нам нужно для 14-битного разрешения. Тадаааа…
Пожалуйста, взгляните на скриншоты осциллографа во вступлении, чтобы увидеть окончательный результат. Канал 3 (фиолетовый) - это прерывание главного таймера, которое запускает мазь для генерации одного импульса. Каналы 1 и 4 (желтый и зеленый луч) представляют собой фактические сигналы ШИМ, генерируемые разными таймерами. Обратите внимание, что они синхронизированы, но они синхронизируются по задним фронтам, то есть из-за режима ШИМ 2. Это не проблема, потому что скорость ШИМ для конкретного сервопривода все еще правильная.
Другое преимущество этого решения состоит в том, что изменение частоты кадров означало бы изменить только период в TIM1. Для современных цифровых сервоприводов вы можете снизить частоту даже до 200-300 Гц, но, пожалуйста, обратитесь к руководству сервоприводов, если вы хотите выполнить точную настройку.