Оглавление:

Управление серводвигателем с помощью MCU STM32F4 ARM: 4 шага
Управление серводвигателем с помощью MCU STM32F4 ARM: 4 шага

Видео: Управление серводвигателем с помощью MCU STM32F4 ARM: 4 шага

Видео: Управление серводвигателем с помощью MCU STM32F4 ARM: 4 шага
Видео: STM32: PWM шаг за шагом на STM32CubeIDE 2024, Июль
Anonim
Управление серводвигателем с помощью MCU STM32F4 ARM
Управление серводвигателем с помощью MCU STM32F4 ARM
Управление серводвигателем с помощью MCU STM32F4 ARM
Управление серводвигателем с помощью MCU STM32F4 ARM

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

Шаг 1. Требования к оборудованию и программному обеспечению

В аппаратном плане нам понадобятся:

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

Что касается программного обеспечения, нам потребуется:

  • STM32CubeMX
  • Keil uVision

Если все это у вас есть, переходите к следующему шагу:)

Шаг 2: Конфигурация STM32CubeMX

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

  • Период ШИМ должен быть 20 мс.
  • По времени должно быть от 0,5 до 2,5 мСм. Когда время составляет 0,5 мс, сервопривод повернется на 0 градусов, 1,5 мс на 90 градусов и 2,5 мс на 180 градусов.

Итак, нам нужно настроить PWM, и для этого мы будем использовать Timer1.

  • Сначала выберите TIM1 в разделе Таймеры. Этот шаг
  • Затем из раздела Mode

    1. Выберите внутренние часы на этом шаге
    2. PWM Generation CH1 Этот шаг
  • Затем из раздела "Конфигурация"

    1. Установите предделитель на 160 На этом шаге
    2. Установите Период счетчика на 2000 На этом шаге
    3. Установите Pulse на 50 На этом шаге
  • Кроме того, в разделе «Конфигурация часов» установите тактовую частоту таймера APB1 на 16 МГц. Этот шаг

Теперь поговорим немного об этом шаге:

Тактовая частота нашего таймера APB1 составляет 16 МГц. Значит, для получения 1 секунды требуется 16 000 000 тиков. Однако мы установили наш предварительный делитель на 160. Это означает, что мы делим нашу частоту на это число и уменьшаем количество тактов до 100 000. Итак, на 1 секунду нам нужно 100 000 тактов. Однако, как мы заявляли ранее, нам потребуется 20 мс периода ШИМ. Итак, исходя из простой математики, нам нужно 2000 тиков для 20 мс. Итак, установив Counter Period на 2000, мы определяем период сигнала PWM, который составляет 20 мс. Теперь нам нужно определить количество тиков для времени включения от 0,5 мс до 2,5 мс. Мы можем получить это уравнение с помощью простой математики:

On_Time = (Номер тика / 100). Имейте в виду, что это время включения, которое изменяет угол серводвигателя. Итак, на изображении ниже я резюмирую этот шаг. Если у вас есть вопросы, пишите в комментариях, и я отвечу как можно быстрее.

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

После выполнения всего этого сгенерируйте код:)

Шаг 3. Кодирование Keil UVision

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

int map (int st1, int fn1, int st2, int fn2, int value) {return (1.0 * (value-st1)) / ((fn1-st1) * 1.0) * (fn2-st2) + st2; }

Это наша функция отображения. Вам интересно, как это получается? Тогда прочтите это. Итак, мы берем наши диапазоны и значение, которое хотим отобразить.

Теперь давайте напишем функцию, которая принимает угол и сопоставляет его с диапазоном тиков:

void servo_write (int angle) {htim1. Instance-> CCR1 = map (0, 180, 50, 250, угол); }

Как видите, этот код принимает угол и сопоставляет его с диапазоном количества отметок. Затем количество тактов передается в регистр CCR1, который контролирует время включения и, следовательно, угол.

Однако, чтобы все это работало, мы сначала запускаем pwm, что можно сделать с помощью всего лишь строчки кода:

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

Итак, у нас есть функция, которая принимает угол и записывает его в сервопривод. Давайте протестируем это и напишем нашу функцию развертки, которая очень проста:

void servo_sweep (void) {для (int я = 0; я <= 180; я ++) {servo_write (я); HAL_Delay (10); } для (int я = 180; я> = 0; я--) {servo_write (я); HAL_Delay (10); }}

Итак, он просто считает до 180, а затем до 0 и записывает эти значения в сервопривод:) Итак, посмотрим на результат!

Шаг 4: Результат:)

Итак, это конец. Если у вас есть вопросы, спрашивайте. Буду рад ответить на них. Большое спасибо за чтение и надеюсь до встречи в следующем проекте:)

Рекомендуемые: