Программирование STM32: управление бесколлекторным двигателем. Таймеры.

Коллеги, сегодня мы управляем бесколлекторным двигателем.

Управление бесколлекторным двигателем осуществляется путем управления его ESC (Электронный регулятор хода), путем подачи ШИМ сигналов с определенной длиной импульса на управляющий провод самого регулятора скорости.
За более подробной информацией, как обычно, советуем посмотреть видео версию данного урока
Итак, полетели!

Для начала нам нужно включить таймер в программе конфигурирования STM32CubeMX
Настройка Таймера в STM32CubeMX
Мы будем использовать таймер TIM1 и его каналы 1 и 4 в режиме PWM Generation для левого и правого двигателей дрона соответственно. Заметим, что пины каналов 2 и 3 заняты USARTом. Пока мы его используем для дебага, но в планах купить программатор и отладку производить через Serial Wire Debug(SWD). Третий мотор(если потребуется, то и четвертый) мы будем подключать на оставшихся каналах таймера. Кстати, каждый сервопривод тоже потребует одного канала таймера в режиме PWM Generation.
Но пока мы тренируемся на двух бесколлекторниках — пока нам хватит двух каналов!)

Далее, программная инициализация таймера

Инициализировать таймер мы будем в терминах HAL. Инициализация происходит в функции

/* TIM1 init function */
void MX_TIM1_Init(void){
  ...
  //TIMx_PSC 8-1 для 8MHz итого счётный регистр TIMx_CNT 1М раз в секунду увеличивает значение
  htim1.Init.Prescaler = 8-1;  

  //TIMx_ARR 200 раз в секунду сбрасываем таймер в ноль 5000*200=1 000 000
  htim1.Init.Period = 5000;
  ...
}

Здесь мы задали длительность периода импульса в 5000 микросекунд. Весь остальной код опущен.
За более подробным объяснением инициализации прошу посетить видеоурок.

Итак, осталась самая малость!)

Инициализация бесколлекторных двигателей.

Вся инициализация заключается в посылке сигнала для ESC с длительностью импульса 800. Что соответствует положению стика «газ в ноль» в аппаратуре радиоуправления. Двигатели мы инициализируем в самом начале, перед инициализацией всех остальных модулей, это делается следующим кодом:

 MX_TIM1_Init();
  
  //Запускаем генерацию ШИМ на соответствующих каналах таймера htim1 
  if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1) != HAL_OK || HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4) != HAL_OK){
    /* PWM Generation Error */
    Error_Handler();
  }
    HAL_Delay(1000);
  // Устанавливаем длительность импульса для каждого канала в 800
  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 800);
  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, 800);

Тем самым наши моторы пропели инициализацию и готовы крутиться под нашу дудку.)

И в заключение урока:

Пример управления бесколлекторными двигателями согласно P-контроллеру.

Давайте реализуем примитивный контроллер для выравнивания позиции БПЛА по крену путем включения соответствующего двигателя с пропорциональной отклонению скоростью.

      int16_t roll = (int16_t)(floor(MPU6050_Data.aRoll));
      uint16_t speed = 800+20*abs(roll);
      if(roll > 2){
        
        if(speed > 2300)
          speed = 2300;
        if(speed < 800)
          speed = 800;
        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, speed);
      }
      if(roll < 2){
        
        if(speed > 2300)
          speed = 2300;
        if(speed < 800)
          speed = 800;
        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, speed);
      }

Теперь точно все!

Как обычно код можно скачать с нашего сайта и там же помочь проекту;)

Спасибо за внимание, остаемся на связи!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *