Всем привет! Подскажите пожалуйста, в чем моя принципиальная ошибка? Задача у меня - плавно вращать мотор 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? Его вообще реально плавно вращать? В чем моя главная ошибка: такой подход не сработает? Или с подходом все ОК но у меня просто руки кривые и я реализовал его как-то не так? =)
Три транзистора - это шаг 120 градусов, от этого рывки. Сопротивление каждой обмотки - 1 Ом. Для транзистора это практически КЗ, поэтому дико грелся. Неправильно выбран транзистор. Рычал либо от неправильной последовательности включения, либо из-за очень крупного шага. Добиться столь медленных оборотов можно, но плавности добиться будет очень непросто, такие движки изначально высокоскоростные. Для мелкого шага нужно не просто дробить фазы, а добиться плавного ее нарастания, со смещением для каждой обмотки. Плюс желательно на вал надеть маховик, для инерционного сглаживания рывков. Ищи материалы как Arduino управлять BLDC.
Спасибо за ответ! - это если их просто по очереди перебирать, без ШИМ. А у меня была задумка, что это будет такая эмуляция синусоиды. На одной обмотке скважность плавно увеличивается, на другой плавно уменьшается. Так не получится плавно вращать? Сегодня на свежую голову свой код посмотрел, там получается у меня вообще пилообразный сигнал был, так что плюс ко всему код ещё кривой у меня. ) Но это исправлю, а вот с аппаратной частью пока не понятно. - я это и пытался с помощью трех ШИМ-сигналов сделать. - спасибо за наводку, по такому запросу материалов и правда больше, чем по моторам HDD, но часто используются уже готовые драйверы. - вы имеете ввиду, что неправильно выбран тип транзистора? Или в каком смысле? Если перед обмоткой поставить сопротивление - это не решит проблему?
Только ухудшит ситуацию, ведь ток уменьшится, уменьшится и подаваемая мощность. У тебя ток через транзистор (если он коммутирует только одну обмотку) получается 12А при допустимых 10-14А, т.е. на пределе (а надо минимум двукратный запас). И, возможно, он не открывается полностью (нужен с буквой L в названии). Отсюда перегревы. Ну или хотя бы на радиатор посадить на первое время. Вот про транзисторы простым языком, для погружения в тему: https://hubstub.ru/circuit-design/89-kak-vybrat-mosfet.html
Попробуй вот такой код для прямого управления: 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/
А мне что-то мешает по этой схеме не ступенчато управлять, а с помощью ШИМ? И я могу использовать купленные в амперке BC337-16? Вроде нет. В любом случае, большое спасибо за ответы, в целом понятно куда копать )
У них ток до 0.5А, а надо >10А. Вот по-русски про векторное управление бесколлекторниками, но это выше моего понимания: https://geektimes.ru/post/271136/