Translate

понедельник, 9 апреля 2018 г.

Двигатель жёсткого диска и Ардуино. Подключение.

О двигателях и дилетантах.

Вентильный двигатель из жёсткого с четырьмя выводами.
Давно пылился у меня такой вот небольшой двигатель, который я выкорчевал из какого-то жёсткого диска. Диск, кстати, от него тоже сохранился! Если соберусь - прикручу его на следующем этапе. А пока решил просто попробовать его реанимировать. Интересен этот двигатель тем, что по идее, (как понял я - человек ничего не знавший доселе о двигателях) он является вентильным. И как нам повествует Википедия: "вентильные двигатели призваны объединить в себе лучшие качества двигателей переменного тока и двигателей постоянного тока". А за счёт отсутствия скользящих электрических контактов (так как щёточный узел заменён там на бесконтактный полупроводниковый коммутатор) такие двигатели обладают высокой надёжностью и высоким сроком службы. Далее я не стану перечислять все прочие достоинства этих двигателей и тем самым пересказывать Википедию, а просто скажу, что применение таких штуковин довольно широкое, в том числе в робототехнике, а потому захотелось узнать побольше о принципах их работы.

Принцип работы двигателя HDD.

Для управления двигателем требуется 6 фаз
на выводах МК, после чего рисунок повторяется

В двигателе три обмотки, сооединённые по принципу "звезда". Общая точка обмоток выводится на плюс. +5V для работы подходит отлично. Управляется двигатель ШИМ-сигналом, который должен подаваться на его обмотки со сдвигом фазы 120°. Однако, не получается подать нужную частоту на двигатель сразу, предварительно его нужно разогнать. Простейший способ подключить три обмотки через транзисторы, подавая ШИМ сигнал им на базу от микроконтроллера. Сразу оговорюсь по транзисторам: лучше брать полевики, потому что ток через них, похоже, идёт приличный, и биполярные сильно греются. Сначала взял 2N2222a. Нагревались за секунды, временно решил проблему установкой рядом кулера, но потом решил, что надо что-то понадёжнее, то есть побольше ☺ В результате поставил наши КТ817Г. Третьего не оказалось, вместо него у меня КТ815Г. В данной схеме их можно заменять, но КТ815 рассчитаны на постоянный коллекторный ток 1,5 ампера, а КТ817 - 3A. Замечу, что 2N2222a вообще - до 0,8A.
Схема подключения двигателя
Буква КТ81... тоже не играет роли, так как у нас всего 5 вольт. В теории, частота смены сигнала не быстрее 1 миллисекунды, реально ещё медленнее, так что высокочастотность транзисторов тоже роли не играет. В общем, подозреваю, что в данной схеме поэкспериментировать можно почти с любыми транзисторами n-p-n типа, с током коллектора хотя бы 1 ампер.
Схему прилагаю, резисторы подбирались тоже экспериментально, на 1 килоом - вполне годно работают. Ставил ещё 4,7k - это много, двигатель глох.

У двигателя 4 вывода. В начале выясняем, какой из них общий. Для этого мультиметром измеряем сопротивление между всеми выводами. Сопротивление между концами обмоток в два раза больше, чем между концом одной обмотки и общей средней точкой. Условно 4 ома против 2. Какую обмотку куда подключать - не имеет значения, они всё равно идут друг за другом.

Текст программы:

// Программа запуска двигателя жёсткого диска
#define P 9100 // Начальная задержка для разгона двигателя
#define x 9    // Номер пина к обмотке x
#define y 10   // Номер пина к обмотке y
#define z 11   // Номер пина к обмотке z
unsigned int p;  // Переменная задержки для разгона
long time_pass;  // Таймер
byte i = 0;      // Счётчик цикла управления фазами двигателя
          void setup() 
{
  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 в начале тоже подбиралась экспериментально, можно попробовать поменять, посмотреть, что будет. Вероятно, для другого двигателя числа будут другими - мне пришлось подбирать для своего. С нагрузкой (оригинальный диск) двигатель перестаёт запускаться, так что установка на него чего-либо потребует калибровки прошивки заново. Крутится он сравнительно быстро, так что рекомендую при запуске надевать очки, особенно если на нём чего-то будет висеть в этот момент. Надеюсь продолжить с ним эксперименты. Пока это всё, всем удачи!

1 комментарий: