О двигателях и дилетантах.
Вентильный двигатель из жёсткого с четырьмя выводами. |
Давно пылился у меня такой вот небольшой двигатель, который я выкорчевал из какого-то жёсткого диска. Диск, кстати, от него тоже сохранился! Если соберусь - прикручу его на следующем этапе. А пока решил просто попробовать его реанимировать. Интересен этот двигатель тем, что по идее, (как понял я - человек ничего не знавший доселе о двигателях) он является вентильным. И как нам повествует Википедия: "вентильные двигатели призваны объединить в себе лучшие качества двигателей переменного тока и двигателей постоянного тока". А за счёт отсутствия скользящих электрических контактов (так как щёточный узел заменён там на бесконтактный полупроводниковый коммутатор) такие двигатели обладают высокой надёжностью и высоким сроком службы. Далее я не стану перечислять все прочие достоинства этих двигателей и тем самым пересказывать Википедию, а просто скажу, что применение таких штуковин довольно широкое, в том числе в робототехнике, а потому захотелось узнать побольше о принципах их работы.
Принцип работы двигателя HDD.
Для управления двигателем требуется 6 фаз на выводах МК, после чего рисунок повторяется |
В двигателе три обмотки, сооединённые по принципу "звезда". Общая точка обмоток выводится на плюс. +5V для работы подходит отлично. Управляется двигатель ШИМ-сигналом, который должен подаваться на его обмотки со сдвигом фазы 120°. Однако, не получается подать нужную частоту на двигатель сразу, предварительно его нужно разогнать. Простейший способ подключить три обмотки через транзисторы, подавая ШИМ сигнал им на базу от микроконтроллера. Сразу оговорюсь по транзисторам: лучше брать полевики, потому что ток через них, похоже, идёт приличный, и биполярные сильно греются. Сначала взял 2N2222a. Нагревались за секунды, временно решил проблему установкой рядом кулера, но потом решил, что надо что-то понадёжнее, то есть побольше ☺ В результате поставил наши КТ817Г. Третьего не оказалось, вместо него у меня КТ815Г. В данной схеме их можно заменять, но КТ815 рассчитаны на постоянный коллекторный ток 1,5 ампера, а КТ817 - 3A. Замечу, что 2N2222a вообще - до 0,8A.
Схема подключения двигателя |
Схему прилагаю, резисторы подбирались тоже экспериментально, на 1 килоом - вполне годно работают. Ставил ещё 4,7k - это много, двигатель глох.
У двигателя 4 вывода. В начале выясняем, какой из них общий. Для этого мультиметром измеряем сопротивление между всеми выводами. Сопротивление между концами обмоток в два раза больше, чем между концом одной обмотки и общей средней точкой. Условно 4 ома против 2. Какую обмотку куда подключать - не имеет значения, они всё равно идут друг за другом.
Текст программы:
// Программа запуска двигателя жёсткого дискаvoid setup()
#define P 9100 // Начальная задержка для разгона двигателя
#define x 9 // Номер пина к обмотке x
#define y 10 // Номер пина к обмотке y
#define z 11 // Номер пина к обмотке z
unsigned int p; // Переменная задержки для разгона
long time_pass; // Таймер
byte i = 0; // Счётчик цикла управления фазами двигателя
{
p = P;// Присваиваем начальное значение задержки для разгона
//Serial.begin(9600); // Открываем COM порт для дебага
pinMode(x, OUTPUT); // Установили пины, работающие с двигателем на вывод данных
pinMode(y, OUTPUT);
pinMode(z, OUTPUT);
digitalWrite(x, LOW); // Установили начальную фазу двигателя, можно начать с любой из 6 фаз
digitalWrite(y, HIGH);
digitalWrite(z, LOW);
time_pass = micros(); // Обнуление таймера
}
void loop()
{
if ((i < 7) && (micros() - time_pass >= p)) // Если счётчик имеет номер от 0 до 6, и время ожидания смены фазы прошло
{
time_pass = micros(); // Обнуляем таймер
if (i == 0) { digitalWrite(z, HIGH); } // Устанавливаем 0 или 1 в зависимости от номера фазы на нужном пине
if (i == 2) { digitalWrite(y, LOW); }
if (i == 3) { digitalWrite(x, HIGH); }
if (i == 4) { digitalWrite(z, LOW); }
if (i == 5) { digitalWrite(y, HIGH); }
if (i == 6) { digitalWrite(x, LOW); }
i++; // Плюсуем счётчик фазы
}
if (i >= 7) // Если счётчик переполнен
{
i = 0; // Обнуляем счётчик
if (p > 1350) {p = p - 50;} // Если двигатель ещё не вошёл в максимальную скорость - сокращаем время смены фазы
//Serial.println(p); Дебаг времени ожидания
}
}
Что в результате?
В результате имеем двигатель, который разгоняется за несколько секунд. Иногда разгон разбалансируется, и двигатель останавливается, но чаще всё работает. Как стабилизировать - пока не знаю. Если рукой остановить двигатель, снова он уже не запустится - нужен перезапуск программы. Измерение количества оборотов - задача для следующего проекта. Пока это максимум, который удалось из него выжать. При опускании p ниже 1350 двигатель вылетает из разгона. 9100 в начале тоже подбиралась экспериментально, можно попробовать поменять, посмотреть, что будет. Вероятно, для другого двигателя числа будут другими - мне пришлось подбирать для своего. С нагрузкой (оригинальный диск) двигатель перестаёт запускаться, так что установка на него чего-либо потребует калибровки прошивки заново. Крутится он сравнительно быстро, так что рекомендую при запуске надевать очки, особенно если на нём чего-то будет висеть в этот момент. Надеюсь продолжить с ним эксперименты. Пока это всё, всем удачи!
Почему то не заработало с этой программой.
ОтветитьУдалить