пятница, 20 сентября 2013 г.

Вторая жизнь старого жесткого диска: крутим мотор с помощью MTD6501C

Привет!


Сегодня я хочу рассказать (и показать) вам о первом шаге на пути к летающим аппаратам. Речь пойдет о двигателях, которые вращают пропеллеры самолёта.

Почитав немножко форумы авиамоделистов, я понял, что из электрических двигателей наиболее в ходу бесколлекторные движки. Но их использование сопряжено с одной трудностью: ввиду своей конструкции их нужно кормить не постоянным током, а тремя синусоидальными токами. Нужно это для того, чтобы по очереди включать катушки двигателя, заставляя магнитный сердечник совершать еще одну часть оборота. Подробнее про такие движки можно почитать здесь.

После некоторых поисков и экспериментов (пытался в качестве драйвера использовать Arduino, безуспешно) я нашел одно компактное и простое решение: MTD6501C от Microchip.

Характеристики микросхемки внушительные: способность работать с питанием от 2 до 14 вольт, встроенная защита от короткого замыкания, перегрева и блокировки мотора, управление посредством ШИМ и/или питающего напряжения. Ну просто сказка! В даташите к этой железячке есть схема подключения с необходимой обвязкой, которую я распаял на макетной плате (и ведь не поленился же, доехал до Чип-и-Дипа:).



Здесь красный, зеленый и синий проводки идут к катушкам мотора, оранжевый нужно соединить с землей на контроллере, белый подключить к питанию (в своем эксперименте я использовал +5В на Arduino), еще один красный (тот, что уходит вниз) — управляющий контакт, на него подаём ШИМ. Как видите, всё просто.

Собственно, вот как это всё ведет себя будучи включенным:



Здесь я распаял еще пару кнопок для изменения скорости, делал вот по этому руководству.
Ниже скетч, который рулит контроллером в этом видео:


int motorPin = 9;
int motorSpeed = 200;
int speedStep = 5;

const int upButtonPin = 2;
const int downButtonPin = 3;
int buttonState = 0;

void setup()  { 
  // initialize the pushbutton pin as an input:
  pinMode(upButtonPin, INPUT);  
  pinMode(downButtonPin, INPUT);  
} 

void loop()  { 
  //process Up button
  buttonState = digitalRead(upButtonPin);
  if (buttonState == HIGH) {   
    if(motorSpeed < 255)
      motorSpeed += speedStep;    
    Serial.println(motorSpeed);
  } 
  
  //process down button  
  buttonState = digitalRead(downButtonPin);
  if (buttonState == HIGH) {     
    if(motorSpeed > 200)
      motorSpeed -= speedStep;
    Serial.println(motorSpeed);
  } 
  
  analogWrite(motorPin, motorSpeed);
  delay(100);
}


Здесь тоже всё просто: десять раз в секунду считываем состояние кнопок и обновляем скорость при необходимости. Такой узкий диапазон (200..255) я выбрал потому, что между 100 и 200 двигатель ведет себя несколько нестабильно: видимо, нужно дополнительно пошаманить с обвязкой.

На этом всё. Оставляйте свои комментарии, и спасибо за внимание!