В качестве двигателя для механического телевизора можно применить бесщеточный трехфазный двигатель от
жесткого диска. В зависимости от модели жесткого диска, обмотки в двигателе подключены либо «звездой»,
либо «треугольником». Для работы подобных двигателей применяются специальные драйверы бесщеточных
(BLDC) двигателей, которые в случае двигателя из жесткого диска расположены на плате самого винчестера.
Эти драйверы управляются программно по специальным алгоритмам, и нет возможности извлечь их и использовать
для плавной регулировки скорости вращения двигателя или задания произвольной скорости. Тем не менее,
двигатель можно запустить без обратной связи с помощью обычного драйвера для моторов, например, L293D
или MX1508. Схема подключения:
Драйвер состоит из четырех одинаковых полумостов, для подключения трехфазного двигателя понадобились три
из них. Драйвером управляет Arduino Uno:
//Инициализация переменных, определяющих период вращения, пины драйвера и пр.
int wait = 18000;
const int target = 3000;
int p1 = 7;
int p2 = 6;
int p3 = 5;
char inChar;
unsigned long timer = 0;
bool b = 1;
void setup() {
//Назначаем пины p1, p2, p3 как выходы, устанавливаем связь по Serial с ПК
pinMode(p1, OUTPUT);
pinMode(p2, OUTPUT);
pinMode(p3, OUTPUT);
Serial.begin(9600);
}
void loop() {
//Часть кода, отвечающая за обработку сообщений, переданных с ПК, для точной регулировки скорости двигателя
if (Serial.available()) {
inChar = (char)Serial.read();
if (inChar == '-') {
wait -=1;
}
if (inChar == '+') {
wait +=1;
}
//Отправляем в Serial текущее значение периода переключения обмоток
Serial.println(wait);
}
//Часть кода, отвечающая за управление драйвером
//Условие для постепенного ускорения двигателя до заданного периода переключения обмоток.
if (millis() - timer > 300 and wait >= 3400 and b) {
if (wait >= 3400) wait -= 100;
else wait -= 20;
timer = millis();
}
if (b and wait <= target) b = 0;
//Переключение обмоток через каждые wait микросекунд
digitalWrite(p1, 1);
digitalWrite(p2, 1);
digitalWrite(p3, 0);
delayMicroseconds(wait);
digitalWrite(p1, 1);
digitalWrite(p2, 0);
digitalWrite(p3, 0);
delayMicroseconds(wait);
digitalWrite(p1, 1);
digitalWrite(p2, 0);
digitalWrite(p3, 1);
delayMicroseconds(wait);
digitalWrite(p1, 0);
digitalWrite(p2, 0);
digitalWrite(p3, 1);
delayMicroseconds(wait);
digitalWrite(p1, 0);
digitalWrite(p2, 1);
digitalWrite(p3, 1);
delayMicroseconds(wait);
digitalWrite(p1, 0);
digitalWrite(p2, 1);
digitalWrite(p3, 0);
delayMicroseconds(wait);
}
В драйвере отсутствует обратная связь, и, хотя можно было подключить обмотки двигателя к входам АЦП
микроконтроллера и тем самым контролировать положение ротора, это достаточно трудозатратное и требующее
отладки введение в схему. Двигатель запускается от толчка руки на низких оборотах, и постепенно ускоряется
согласно программе микроконтроллера до нужной частоты вращения (12.5 об/сек), затем скорость поддерживается
стабильно и существует возможность подстройки периода вращения с точностью до 6 мкс через UART.
Код работает по следующему принципу. Существует последовательность переключения уровней на обмотках для
типа "треугольник", оптимальная для стабильного вращения. Эта последовательность реализована в коде с
переключениями через определенное количество микросекунд. Задержку между переключениями можно подстраивать
с точностью до 1 мкс, но слишком маленькие значения не имеют смысла, поскольку функция digitalWrite() имеет
свою задержку, а также существует блок кода, отвечающий за общение по Serial. Кроме того, уже при значениях
от 700 и ниже вращение мотора крайне нестабильно, удалось достичь относительной стабильности при частоте
вращения в 50 гц. (50 об/сек).
Даже на текстах, картинка остается достаточно стабильной:
В коде предусмотрено ускорение двигателя при старте, необходимое ввиду отсутствия обратной связи. До тех пор,
пока период переключения больше либо равен 3400 микросекундам, ускорение происходит быстро (период
переключения уменьшается на 100 мкс каждые 300 миллисекунд). Согласно тестам, ниже данного значения
ускорение нужно производить постепенно, поэтому каждые 300 миллисекунд оно уменьшается лишь на 20 мкс.
Таким образом достигается требуемая частота вращения.
Посылая в последовательный порт символы "-" или "+" можно управлять этой скоростью, изменяя период
переключения с точностью до 1 мкс (уменьшать или увеличивать его соответственно).