Съдържание:

Управление на серво мотора със STM32F4 ARM MCU: 4 стъпки
Управление на серво мотора със STM32F4 ARM MCU: 4 стъпки

Видео: Управление на серво мотора със STM32F4 ARM MCU: 4 стъпки

Видео: Управление на серво мотора със STM32F4 ARM MCU: 4 стъпки
Видео: STEPPER Motor and STM32 || Angle, RPM and Direction control || CubeIDE 2024, Ноември
Anonim
Управление на серво мотора със STM32F4 ARM MCU
Управление на серво мотора със STM32F4 ARM MCU
Управление на серво мотора със STM32F4 ARM MCU
Управление на серво мотора със STM32F4 ARM MCU

Здравейте отново приятели:) И така, в този проект ще управляваме серво мотор със STM32F4 ARM MCU. В моя случай ще използвам борда за откриване, но ако схванете същността на проблема, тогава можете да го приложите за всеки MCU. Така. Да започваме:)

Стъпка 1: Изисквания към хардуера и софтуера

По отношение на хардуера ще ни трябва:

  • MCU, което в моя случай е STM32f4 Discovery board
  • Обикновен серво мотор, като SG90 или всеки друг

По отношение на софтуера ще ни трябва:

  • STM32CubeMX
  • Keil uVision

Ако имате всичко това, преминете към следващата стъпка:)

Стъпка 2: Конфигурация на STM32CubeMX

Както знаете, за управление на серво мотор се нуждаем от ШИМ сигнал. Изискванията по отношение на ШИМ сигнала са такива:

  • PWM периодът трябва да бъде 20 mS
  • Навреме трябва да бъде между 0,5 mS до 2,5 mS. Когато времето за включване е 0,5 mS, тогава сервото ще се завърти на 0 градуса, 1,5 mS за 90 градуса и 2,5 mS за 180 градуса.

Така че, трябва да конфигурираме PWM и за тази цел ще използваме Timer1.

  • Първо изберете TIM1 от секцията Таймери. Тази стъпка
  • След това от раздела Режим

    1. Изберете Вътрешен часовник Тази стъпка
    2. ШИМ поколение CH1 Тази стъпка
  • След това от раздела Конфигурация

    1. Задайте Предсказващо устройство на 160 Тази стъпка
    2. Задайте Counter Period на 2000 Тази стъпка
    3. Задайте Pulse на 50 Тази стъпка
  • Освен това, от Конфигурацията на часовника, задайте APB1 Timer clocks на 16MHz. Тази стъпка

Сега, нека поговорим малко за тази стъпка:

Честотата на нашия APB1 таймер е 16MHz. Това означава, че са необходими 16 000 000 кърлежи, за да получите 1 секунда. Въпреки това, ние зададохме нашия предварително делител на 160. Това означава, че разделяме нашата честота на този брой и намалихме броя на кърлежите до 100 000. Така че, за 1 секунда се нуждаем от 100 000 кърлежи. Нуждаем се обаче от 20mS PWM период, както посочихме по -рано. Така че, въз основа на проста математика, имаме нужда от 2000 кърлежи за 20 mS. Така че, като зададем Counter Period на 2000, ние определяме периода на PWM сигнала, който е 20mS. Сега трябва да определим номера на отметката за време на включване от 0.5mS до 2.5mS. Можем да получим това уравнение от проста математика и то е:

On_Time = (Tick_Number / 100). Имайте предвид, че това е времето за включване, което променя ъгъла на серво мотора. Така че, под изображението обобщавам тази стъпка. Ако имате някакви въпроси, пишете в коментарите и аз ще отговоря възможно най -бързо.

Изображение на изчисленията

След като направите всичко това, генерирайте код:)

Стъпка 3: Кодиране на Keil UVision

И така, нека първо да определим какво искаме да направим? Искаме да напишем функция, която приема степен и да я запишем в серво. И така, как ще го направим? Както казахме по -рано, за да променим ъгъла, трябва да променим времето за включване. Нашите ъгли се променят между [0, 180] и броя на отметките, което определя промените във времето между [50, 250]. И така, имаме нужда от функция за картографиране, която картографира зададения ъгъл в обхвата на броя на отметките. Например, за 0 степен 50 кърлежи, за 180 градуса 250 кърлежи и така нататък … Така че нека напишем нашата функция за картографиране:

int карта (int st1, int fn1, int st2, int fn2, int стойност) {връщане (1.0*(стойност-st1))/((fn1-st1)*1.0)*(fn2-st2)+st2; }

Това е нашата функция за картографиране. Интересува ли ви как се получава? След това прочетете това. Така че, ние вземаме нашите диапазони и стойността, която искаме да картографираме.

Сега, нека напишем функция, която приема ъгъла и я картографира в диапазона от отметки:

void servo_write (int ъгъл) {htim1. Instance-> CCR1 = карта (0, 180, 50, 250, ъгъл); }

Както можете да видите, този код приема ъгъл и го съпоставя с обхвата на броя на отметките. След това броят на отметките се дава на регистъра CCR1, който контролира времето за включване и така ъгъл.

Въпреки това, за да работи всичко това, първо стартираме pwm, което може да се направи само с ред код:

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

И така, имаме функция, която приема ъгъла и го записва в серво. Нека да го тестваме и да напишем нашата функция за почистване, която е много лесна:

void servo_sweep (void) {for (int i = 0; i <= 180; i ++) {servo_write (i); HAL_Закъснение (10); } for (int i = 180; i> = 0; i--) {servo_write (i); HAL_Закъснение (10); }}

Така че, той просто брои до 180, а след това надолу до 0 и записва тези стойности в серво:) Така че, нека видим резултата!

Стъпка 4: Резултатът:)

И така, това е краят. Ако имате някакви въпроси, моля попитайте. Ще се радвам да им отговоря. Благодаря ви много за четенето и се надявам да се видим в следващия проект:)

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