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

Привет Хабровчане!
Решил я рассказать «всему свету» о проблеме, с которой столкнулся при постройке своего проекта, и как мне удалось её решить.

А речь сегодня пойдет о бесколлекторных двигателях, о регуляторах хода и как ими управлять.
Что же такое бесколлекторный двигатель, я не буду долго расписывать (сами можете посмотреть Wiki), а скажу в 2х словах, это 3х фазный двигатель постоянного тока.

И приводится в движение сие чудо благодаря специальному регулятору, который последовательно переключает обмотки с определенной частотой.
Управляя частотой переключения обмоток мы управляем скоростью вращения ротора.
Ну что же, надеюсь тут все понято, идем дальше.

Первые проблемы
Были закуплены 2 комплекта двигатель + регулятор, ждал около месяца, пришли.
image

Мною овладел приступ безудержного веселья по этому поводу, но, к сожалению, это было ненадолго….
Рассмотрев эти чудеса техники я решил подключить их к источнику питания, и тут то первое разочарование, тихий хлопок (как от КЗ) и тишина, светодиоды не горят, писка нет (а он должен быть), только крутится кулер на регуле, беда…
Побежал в ближайший Хобби магазин, и добрый консультант вынес вердикт: сгорел!

Со вторым такая же история, в общем ребята, не повезло, оба бракованные…
Ну хоть кошечка порадовалась:

image

Пришлось раскошелиться и купить у них регулятор по цене обоих комплектов (поджимали сроки).
Купил, подключил, все пищит, горит, работает, прям аж душа радуется! (на фото он выделен):

image

Проблема номер два
Теперь настала пора покрутить двигателем.
А покрутить нужно не с сервотестера или аппы радиоуправления, а с микроконтроллера, а точнее вот с такой платки:
image

Перелопатив тонны сайтов, перечитав сотни форумов и ответов на мой вопрос, так как же управлять этим регулятором я слышать только одно: «…чувак да там простой ШИМ…», «… ШИМ тебе в помощь…».
Ну ШИМ, так ШИМ.
Написал простенькую программу:
#include <Servo.h> 

Servo motor;

int mot_pin = 7;    //Подключаем левый мотор к пину 7

int js_position = 800;
int max_position = 3000;

void setup() 
{
  motor_teft.attach(mot_pin, js_position, max_position);    //Инициальзация мотора
} 

void loop() 
{
  motor.write(1800);     //Записываем положение и отправляем на регулятор
}


Залил, ноль эмоций…

Бился 2 дня, пока не наткнулся на случайный пост, о том, что у регулятора есть защита, и он начинает функционировать только при подаче на его вход ШИМ сигнала 1,5 мс.
Окей, будет сделано.

Дальше я подцепил обыкновенный резистор через АЦП, и опытным путем подобрал крайние значения ШИМ регулятора.
Код получившийся в итоге:

#include <Servo.h> 

Servo motor_teft;
Servo motor_right;

int mot_pin_left = 7;    //Подключаем левый мотор к пину 7
int mot_pin_right = 8;   //Подключаем правый мотор к пину 8

int js_position = 1500;  //Начальная позиция, всегда 1.5 мс для регуляторов бесколлекторных двигателей
int max_position = 2300; //Максимальное значение ШИМ 2.3 мс
int min_position = 800;  //Минимальное значени ШИМ 0.8 мс

int start = 1;  //Флаг задержки запуска

void setup() 
{
  motor_teft.attach(mot_pin_left, js_position, max_position);    //Инициальзация левого мотора (порт, начальная позиция, максимальная позиция)       !!!
  motor_right.attach(mot_pin_right, js_position, max_position);  //Инициальзация правого мотора (порт, начальная позиция, максимальная позиция)      !!!
} 

void loop() 
{
  //Начальная установка регуляторов в нулевое положение
  if(start == 1) {
    motor_teft.write(js_position);
    motor_right.write(js_position);
    
    delay(700);
    start = 0;
  }
  
  js_position = analogRead(A0);  //Считывание положения потенциометра
  
  js_position = map(js_position, 0, 1023, 75, 140);  //Преобразование положения потенциометра в угол поворота
  motor_left.write(js_position);     //Записываем положение и отправляем на регулятор левого мотора
  motor_right.write(js_position);    //Записываем положение и отправляем на регулятор правого мотора
  
  delay(20);  //Задержка цикла 20 мс
}


И все заработало.
Теперь все крутиться, шумит, пищит и просто радует.
P.S. Это код для управления сразу 2мя двигателями.

И последняя проблема, питание…
Здесь расскажу немного, а именно, от регулятора идет 3 провода:
image

Центральная колодка, по порядку Черный — минус, Красный — плюс и Белый — провод управления.

И загвоздка в том, что в отличие от сервоприводов, это не входы под питание, а выходы, т.е. питаемся от них.
К чему я это, да к тому, что подключив регулятор как серву, я чуть не спалил порты на ноутбуке, ибо плата в это время была запитана от USB.
Но к счастью у моего старичка сработала защита и все обошлось перезагрузкой…

Видео работы:


Спасибо большое за внимание.
Надеюсь мой опыт будет полезен для вас.
До скорых встреч.
Share post

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 14

    +11
    А Господь не против, что вы его двигателями управляете? :)
      +2
      ;-)
        +1
        FastFix: подставить запятую выделяющую обращение.
      +7
      Эти регуляторы управляются таким же сигналом, как сервоприводы, то есть импульсами с длительностью от 0,8 до 2,1мс с частотой следования около 50Гц. Любой сервотестер справился бы с этой задачей.
      Ваш пост не про управление бесколлекторным двигателем, а про управление регулятором.
        –5
        Конструктивное замечание, но составьте причинно-следственную часть…
        Управляем регуляторами — управляем и двигателями, все просто.

        Насчет сервотестера, не спорю, справляется без проблем, но я делюсь опытом для тех, кому нужно управлять не при помощи сервотестера или приемника р\у, а с помощью контроллера.
        И я постарался раскрыть подводные камни управления регуляторами (если Вам угодно).
          +11
          >Управляем регуляторами — управляем и двигателями, все просто.

          Если бы все было так просто…
          Согласен с предыдущим комментатором, заходил сюда в ожидании схемотехнических и программных решений по управлению BLDC, или хотя бы обзор интегральных драйверов этих двигателей (как у TI), а тут очередное «воткнем проводок в ардуину».
            0
            Действительно, автор мог бы и из ардуины запилить драйвер двигателя без походов по магазинам.
            +2
            Так как регуль явно автомобильный, с реверсом, «он начинает функционировать только при подаче на его вход ШИМ сигнала 1,5 мс» — эт всего лишь сигнал «нейтраль» подавать надо. При нулевом сигнале, само собой, работать не будет, иначе бы полный газ назад сразу бы попёр при включении. А вот самолётные ESC, без реверса, там управление практически полностью аналогично серве.

            А про «от регулятора идет 3 провода» — обычно в регули встроен BEC, который формирует напряжение для питания бортовой логики и сервомашинок, обычно 5 или 6 Вольт. Вот это питание у вас с регуля и идёт.
              +3
              А у самолётных почти всегда есть защита, после включения надо газ в ноль вывести. Защита от непреднамеренного удара винтом по пальцам при подаче питания.
          0
          Почему под левый мотор инициализируется объект motor_teft, и вместе с тем есть обращение к motor_left?
          Что такое вообще левый и правый мотор в вашем сервотестере?
            +1
            Ардуиновская библиотека Servo хороша тем, что может управлять десятком сервомоторов на разных выходах, при этом ШИМ-меандры формируются программно, с использованием прерываний. Если параллельно исполняется другой код, то возникает некоторая нестабильность и мотор, даже после регулятора, будет вращаться слегка неравномерно.

            Если нужно точно выдерживать скорость, лучше брать библиотеку PWMServo, которая формирует ШИМ аппаратно. При этом в зависимость от модели ардуино можно управлять двумя-тремя сервами.
              0
              PWMServo, которая формирует ШИМ аппаратно. При этом в зависимость от модели ардуино можно управлять двумя-тремя сервами.
              А почему только двумя-тремя? У ATMega328 есть суммарно 6 внешних каналов у таймеров.
              +7
              Ребят, ну нельзя так. Не это как опубликовать статью «Методика архивирования интернета», начинающуюся со слов «для работы нам понадобится архиватор ZIP...»
                –1
                Кот готовится занять коробку. Коты как газ, стремятся занять весь предоставленный им объём.

                Only users with full accounts can post comments. Log in, please.