Запуск двигателя от CD ROM на Arduino
- sinitsinmike
- 16 дек. 2017 г.
- 2 мин. чтения
Запуск двигателя от CD ROM на Arduino с использованием трех транзисторов и трех резисторов.
Это пожалуй самый бюджетный и самый простой способ запуска бесколлекторного BLDC двигателя от жесткого диска или CD-rom.
Я использовал Arduino Uno но подойдет и другая модель.
Вот схема:

Как видно питание 5в.
Базы транзисторов через резисторы номиналом 1ком подключены к цифровым выходам Arduino D2, D3 и D4.
Arduino подключено к компьютеру USB шнуром. Питать схему можно прямо с соответствующих терминалов Arduino, там все подписано, +5V и Ground (-).


Вот распиновка транзистора:

Транзисторы можно применить любый n-p-n с подходящими параметрами подобрав номинал резисторов.
Так же можно использовать схему с N канальными полевыми транзисторами, я применил IRF740. Тут уже можно будет применить внешний блок питания на 9-12 вольт. Транзисторы рекомендую установить на теплоотвод, так как они будут греться.


Я использовал полевые транзисторы IRF740 но они по параметрам не очень подходят, просто они валялись под рукой. Советую лучше использовать полевые транзисторы типа: IRFZ44, IRF510, NTE2382, SLA5068 или 30N06. И обязательно ставьте их на теплоотвод.
Arduino sketch:
int phase1 = 2; int phase2 = 3; int phase3 = 4; int led = 12;
unsigned long stepLength = 32000; int minStepLength = 600; int steps =5 ;
void setup() { pinMode(led, OUTPUT); pinMode(phase1, OUTPUT); pinMode(phase2, OUTPUT); pinMode(phase3, OUTPUT); digitalWrite(led, LOW); }
void loop() { switchStep(1); switchStep(2); switchStep(3); if(stepLength > minStepLength) { stepLength = stepLength - steps; } else { // set the minimum pulse length stepLength=minStepLength; } if (stepLength < 39950) { digitalWrite(led, HIGH); // second gear steps = 500; } if (stepLength < 20000) { digitalWrite(led, LOW); // third gear steps = 50; }
if (stepLength < 2000) { digitalWrite(led, HIGH); // fourth gear steps = 1; } }
void switchStep(int stage) { switch(stage) { case 1: digitalWrite(phase1, HIGH); digitalWrite(phase2, LOW); digitalWrite(phase3, LOW); myDelay(stepLength); break; case 2: digitalWrite(phase1, LOW); digitalWrite(phase2, HIGH); digitalWrite(phase3, LOW); myDelay(stepLength); break; default: digitalWrite(phase1, LOW); digitalWrite(phase2, LOW); digitalWrite(phase3, HIGH); myDelay(stepLength); break; }
}
void myDelay(unsigned long p) { if (p > 16380) { delay (p/1000); } else { delayMicroseconds(p); } }
Comments