Съдържание:

Генериране на PWM сигнал с висока разделителна способност за RC серво с STM32 устройства: 3 стъпки
Генериране на PWM сигнал с висока разделителна способност за RC серво с STM32 устройства: 3 стъпки

Видео: Генериране на PWM сигнал с висока разделителна способност за RC серво с STM32 устройства: 3 стъпки

Видео: Генериране на PWM сигнал с висока разделителна способност за RC серво с STM32 устройства: 3 стъпки
Видео: ✨Sony X90J X80H A80J Samsung QN900A 8K QN95A 4K QN90A Hisense 50B7100UW 100L9G-CINE100A 50A7500FTUK🔹 2024, Юли
Anonim
Генериране на PWM сигнали с висока резолюция за RC серво с STM32 устройства
Генериране на PWM сигнали с висока резолюция за RC серво с STM32 устройства
Генериране на PWM сигнал с висока резолюция за RC серво с STM32 устройства
Генериране на PWM сигнал с висока резолюция за RC серво с STM32 устройства
Генериране на PWM сигнал с висока резолюция за RC серво с STM32 устройства
Генериране на PWM сигнал с висока резолюция за RC серво с STM32 устройства

В момента изграждам RC предавател/приемник на базата на SX1280 RF чип. Една от целите на проекта е, че искам 12 -битова серво резолюция от пръчките надолу до сервомоторите. Отчасти защото съвременните цифрови сервоустройства имат 12-битова резолюция, второ предавател от висок клас така или иначе използва 12 бита. Проучвах как мога да генерирам PWM сигнали с висока разделителна способност на STM32 устройства. Използвам черни хапчета (STM32F103C8T8) в момента за прототипа.

Стъпка 1: Списък на частите

Хардуер

  • Всяка дъска за разработка на STM32F103 (синьо хапче, черно хапче и т.н.)
  • USB захранваща банка като захранване
  • STM32 програмист (Segger j-links, ST-LINK/V2 или просто st-link клонинг)

Софтуер

  • STM32CubeMX
  • Atollic TrueSTUDIO за STM32
  • Източник на проекта от github

Стъпка 2: Очевидното решение

Очевидното решение
Очевидното решение
Очевидното решение
Очевидното решение
Очевидното решение
Очевидното решение

Вероятно най-лесното решение е да използвате един от таймера, който може да генерира PWM сигнали, като TIM1-3 на STM32F103. За модерно цифрово серво честотата на кадрите може да спадне до 5 ms или повече, но за стар аналогов серво трябва да бъде 20 ms или 50 Hz. Така че, като най -лошия сценарий, нека го генерираме. Със 72 MHz часовник и 16 -битова разделителна способност на таймера трябва да настроим предварителния дебитор на таймера на минимум 23, за да покрием честотата на кадрите от 20 ms. Избрах 24, защото след това за 20 ms трябва да настроя брояча точно на 60000. Можете да видите настройката на CubeMX и генерираните 1 и 1,5 ms PWM сигнали на екранните снимки. За съжаление, за 1 ms броячът на таймера трябва да бъде настроен на 3000, което би ни дало само 11 битова резолюция. Не е лошо, но целта беше 12 битова, така че нека опитаме нещо друго.

Разбира се, ако избера микроконтролер с 32 -битов таймер, като STM32L476, тази резолюция може да бъде много по -висока и проблемът ще бъде решен.

Но тук бих искал да предложа алтернативно решение, което допълнително ще увеличи разделителната способност дори на STM32F103.

Стъпка 3: Каскадни таймери за по -висока разделителна способност

Каскадни таймери за по -висока разделителна способност
Каскадни таймери за по -висока разделителна способност
Каскадни таймери за по -висока разделителна способност
Каскадни таймери за по -висока разделителна способност
Каскадни таймери за по -висока разделителна способност
Каскадни таймери за по -висока разделителна способност

Основният проблем с предишното решение е, че честотата на кадрите (20 ms) е относително висока в сравнение с действително генерирания PWM сигнал (между 1 и 2 ms), така че губим някои стойностни битове за останалите 18 ms, когато чакаме следващия кадър. Това може да се реши чрез каскадни таймери, използващи функцията за таймер за синхронизация.

Идеята е, че ще използвам TIM1 като главен за генериране на честотата на кадрите (20 ms) и TIM2, TIM3, за да се справя с PWM сигналите като подчинени. Когато главният задейства подчинените устройства, те генерират само ШИМ сигнал в един импулсен режим. Следователно трябва да покрия само 2 ms в тези таймери. За щастие можете да каскадирате тези таймери в хардуера, така че тази синхронизация не се нуждае от намеса от процесора и също е много прецизна, трептенето е в региона ps. Можете да видите настройката на CubeMX на екранните снимки.

Както можете да видите, аз избрах 3 като прескалар, така че за 2 ms трябва да задам 48000 в брояча на таймера. Това ни дава 24000 за 1 ms, което всъщност е повече от това, от което се нуждаем за 14 -битова резолюция. Тадаааа…

Моля, разгледайте екранните снимки на осцилоскопа във въведението за крайния резултат. Каналът 3 (лилав) е прекъсването на главния таймер, което ще задейства салвите да генерират един импулс. Канал 1 и 4 (жълт и зелен лъч) са действителните ШИМ сигнали, генерирани от различни таймери. Обърнете внимание, че те са синхронизирани, но са синхронизирани в задната част, тоест поради PWM режим 2. Това не е проблем, тъй като PWM скоростта за конкретното серво все още е правилна.

Друго предимство на това решение е, че промяната на кадровата честота би означавала да промените периода само в TIM1. За съвременните цифрови сервомотори можете да намалите дори до 200-300 Hz, но моля, консултирайте се с ръководството на серво, ако искате да настроите фино.

Препоръчано: