Плавное вращение мотора HDD (или как я сделал хрень)

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем SEsin, 5 янв 2018.

  1. SEsin

    SEsin Нерд

    Всем привет! Подскажите пожалуйста, в чем моя принципиальная ошибка? Задача у меня - плавно вращать мотор HDD с помощью Arduino UNO. Я руководствовался вот этой статьей: http://we.easyelectronics.ru/robots/feericheskaya-rasstanovka-tochek-nad-hdd-motors-chast-1.html
    Там подробно описан принцип работы этих моторчиков. Для своего домашнего проекта мне нужно вращать его медленно и плавно. Примерно 1/2 оборота в секунду. По смыслу - примерно так, как вращается виниловая пластинка.
    Если данный моторчик нужно вращать быстро - тут, я так понимаю, проблем нет. Перебираем обмотки, и особо не паримся насчет формы сигнала. В статье про HDD я прочитал ключевую мысль автора: "Забегая далеко вперёд скажу — идеальным случаем для нашей машины является подача на её фазы 3х синусоид сдвинутых на 120 градусов (как в обычных электрических сетях). Однако в некоторых случаях такая «идеальность» попросту не нужна."
    Далее в статье в том числе рассматривается ШИМ.
    Итак, мне нужно вращать медленно и плавно. У меня Arduino UNO и как я понял, аналоговую синусоиду подать на какие-либо выходы получится, но с доп. сложностями (как например, тут http://robocraft.ru/blog/2911.html).
    Я же хотел просто и быстро =) Поэтому купил три полевых транзистора IRF530, и решил использовать ШИМ. Для простоты я даже не утруждался в использовании функции Sin, а попытался сэмулировать с ШИМ, имитирующий по смыслу треугольный сигнал, сдвинутый по фазе. Хотел просто проверить принципиально работает или нет.
    Три обмотки моторчика подключил через транзисторы и написал такой незамысловатый код:
    Код (C++):
    #define MOTOR_PIN_1  9
    #define MOTOR_PIN_2  10
    #define MOTOR_PIN_3  11

    int angle_1 = 0;
    int angle_2 = 85;
    int angle_3 = 170;

    void setup() {
      // put your setup code here, to run once:
      pinMode(MOTOR_PIN_1, OUTPUT);
      pinMode(MOTOR_PIN_2, OUTPUT);
      pinMode(MOTOR_PIN_3, OUTPUT);
    }

    void loop() {
      // put your main code here, to run repeatedly:
      angle_1 = (angle_1 + 1) % 256;
      angle_2 = (angle_2 + 1) % 256;
      angle_3 = (angle_3 + 1) % 256;

      analogWrite(MOTOR_PIN_1, angle_1);
      analogWrite(MOTOR_PIN_2, angle_2);
      analogWrite(MOTOR_PIN_3, angle_3);

      delay(10);

    }

    Результат был, но совсем не тот, что я ожидал ) Во-первых, моторчик начал неестественно жужжать, во-вторых все равно крутился рывками (как при тупом переборе обмоток), а не плавно, в третьих - транзисторы и провода очень нагрелись и я срочно все отключил.
    Я конечно, понял, что наверняка сделал какую-то грубую ошибку, но не понял какую. Прошу подсказать, почему не сработал такой "тупой" подход к вопросу плавного вращения HDD? Его вообще реально плавно вращать? В чем моя главная ошибка: такой подход не сработает? Или с подходом все ОК но у меня просто руки кривые и я реализовал его как-то не так? =)
     
    Tomasina нравится это.
  2. Tomasina

    Tomasina Иномирянин

    Три транзистора - это шаг 120 градусов, от этого рывки.
    Сопротивление каждой обмотки - 1 Ом. Для транзистора это практически КЗ, поэтому дико грелся. Неправильно выбран транзистор.
    Рычал либо от неправильной последовательности включения, либо из-за очень крупного шага.
    Добиться столь медленных оборотов можно, но плавности добиться будет очень непросто, такие движки изначально высокоскоростные. Для мелкого шага нужно не просто дробить фазы, а добиться плавного ее нарастания, со смещением для каждой обмотки. Плюс желательно на вал надеть маховик, для инерционного сглаживания рывков.
    Ищи материалы как Arduino управлять BLDC.
     
    SEsin нравится это.
  3. SEsin

    SEsin Нерд

    Спасибо за ответ!
    - это если их просто по очереди перебирать, без ШИМ. А у меня была задумка, что это будет такая эмуляция синусоиды. На одной обмотке скважность плавно увеличивается, на другой плавно уменьшается. Так не получится плавно вращать?
    Сегодня на свежую голову свой код посмотрел, там получается у меня вообще пилообразный сигнал был, так что плюс ко всему код ещё кривой у меня. ) Но это исправлю, а вот с аппаратной частью пока не понятно.
    - я это и пытался с помощью трех ШИМ-сигналов сделать.
    - спасибо за наводку, по такому запросу материалов и правда больше, чем по моторам HDD, но часто используются уже готовые драйверы.
    - вы имеете ввиду, что неправильно выбран тип транзистора? Или в каком смысле? Если перед обмоткой поставить сопротивление - это не решит проблему?
     
  4. Tomasina

    Tomasina Иномирянин

    Только ухудшит ситуацию, ведь ток уменьшится, уменьшится и подаваемая мощность.

    У тебя ток через транзистор (если он коммутирует только одну обмотку) получается 12А при допустимых 10-14А, т.е. на пределе (а надо минимум двукратный запас). И, возможно, он не открывается полностью (нужен с буквой L в названии). Отсюда перегревы. Ну или хотя бы на радиатор посадить на первое время.

    Вот про транзисторы простым языком, для погружения в тему: https://hubstub.ru/circuit-design/89-kak-vybrat-mosfet.html
     
    Последнее редактирование: 5 янв 2018
  5. Tomasina

    Tomasina Иномирянин

    Попробуй вот такой код для прямого управления: http://bionic-lab.ru/project/upravlenie-dvigatelem-ot-zhestkogo-diska-hdd-s-pomoshchyu-arduino
    Он хоть и ступенчатый но вроде именно под трёхфазный движок. Чисто для проверки работоспособности.

    К слову, даже тут видно, что на малой скорости есть подёргивания. А тебе ещё медленнее надо.


    В описании к видео есть ссылка, хорошая теория с картинками и скетч для медленного вращения.

    Чем не нравится управление через BLDC-драйвер от квадрокоптеров? Подаешь на него нужный ШИМ как для сервы (но это будет не угол, а задание скорости), а взаимодействие с мотором и отслеживание текущей скорости - его проблемы.
    http://www.pilotage-rc.ru/products/tsifrovoy_BEC_Impact_3A_RC12404/
     
    Последнее редактирование: 5 янв 2018
    SEsin нравится это.
  6. SEsin

    SEsin Нерд

    А мне что-то мешает по этой схеме не ступенчато управлять, а с помощью ШИМ? И я могу использовать купленные в амперке BC337-16?
    Вроде нет. В любом случае, большое спасибо за ответы, в целом понятно куда копать )
     
  7. Tomasina

    Tomasina Иномирянин

    У них ток до 0.5А, а надо >10А.

    Вот по-русски про векторное управление бесколлекторниками, но это выше моего понимания: https://geektimes.ru/post/271136/
     
    issaom нравится это.
  8. SEsin

    SEsin Нерд

    Блин, ясно, спасибо!