Маломощный 3-х фазный двигатель

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

 

Всем привет, вот я добрался до транзисторов, ну и захотелось покрутить что-нибудь, покрутил большой двигатель от печки, маленький от кассового аппарата. А теперь хочется покрутить двигатель от винчестера, и не просто покрутить а хотя бы добраться до половины номинала - 3-4к об/мин. Помнится что там фаза должна быть сдвинута на 120 градусов, собственно вопрос, как задать математически то что на графике выше? Синус не обязательно, лишь бы крутился более менее нормально. 

Руковожусь этим материалом, в наличии есть десяток n-p-n транзисторов КТ829Б.

Спасибо за помощь.

paf
Offline
Зарегистрирован: 25.01.2013
leshak
Offline
Зарегистрирован: 29.09.2011

> как задать математически то что на графике выше

>Синус не обязательно

Ну так а почему-бы и не синус? U1=sin(x), U2=sin(x+PI*2/3), U3=sin(x-PI*2/3)

http://goo.gl/y9UcH

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Чёт, я туплю, я же не частотника делать собрался, думаю будет достаточно и прямоугольных импульсов типо:

100

010

001

Или, как говорят, для плавности хода: 

100

110

010

011

001

 

leshak пишет:

> как задать математически то что на графике выше

>Синус не обязательно

Ну так а почему-бы и не синус? U1=sin(x), U2=sin(x+PI*2/3), U3=sin(x-PI*2/3)

http://goo.gl/y9UcH

Спасибо большое, а я думал как-то при помощи цикла это реализовать типо:






for(int deg = 0; deg < 360; deg++){ 
   if(deg < 89 ) {
      f1 = deg/2.83; }  // от 0 градусов до пика 1 фазы (90 градусов), преобразуем в 255 для ШИМа
         if(deg > 90 &&  deg < 180){ 
            f1 = ((90 - deg)/2.83); } // от 90 градусов, до спада фазы(180) преобразуем значение
   if(deg > 120 &&  deg < 210) 
      f2 = ((120 - deg)/2.83); }  // от 120 градусов до пика 2 фазы (210 градусов), преобразуем в 255 для ШИМа
         if(deg > 210 &&  deg < 300){ 
            f2 = ((210 - deg)/2.83); } // от 210 градусов, до спада фазы(300) преобразуем значение
   if(deg > 240 &&  deg < 330) 
      f3 = ((240 - deg)/2.83); }  // от 240 градусов до пика 3 фазы (330 градусов), преобразуем в 255 для ШИМа
         if(deg > 330 &&  deg < ***){ // тут я пока в тупике, спать больно охота ;)
            f3 = ((330 - deg)/2.83); } // от 330 градусов, до спада фазы(***) преобразуем значение
...
}
...

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


 

Уже совсем АЛУ, да и вся логика, не варят... пора бы sleep(часов так на 10-12).

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Нет времени эксперементировать, хотя для себя интересно, может пригодиться, НО если речь идёт о таком маленьком электродвигателе, то, мне кажется, на выходе каскада можно просто добавить ёмкость, которая сгладит импульсы и приблизит к синусоиде. Истессно ёмкостное сопротивление, точнее его величина будет зависить от оборотов, от момента на валу, но это будет важно при запуске и начальном разгоне.

P.S. Разве не надо задавать частоту, в скетче не наблюдаю. Как раз от неё и только от неё будут зависить обороты. К примеру за какое время выполняется первый четверть периуд первой фазы? 

 

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

int t = 0;
int deg = 0;
char f1 = 0;
char f2 = 0;
char f3 = 0;
void setup() {
  

}

void loop() {
// Цикл
for(deg = 0; deg < 360; deg++){
  if(deg < 89 ) { 
      f1 = map(deg, 0, 89, 0, 255); }  // от 0 градусов до пика 1 фазы (90 градусов), преобразуем в 255 для ШИМа
         if(deg > 90 &&  deg < 180){ 
            f1 = map(deg, 90, 180, 254, 0); } // от 90 градусов, до спада фазы(180) преобразуем значение
   if(deg > 120 &&  deg < 210){ 
      f2 = map(deg, 120, 210, 0, 255); }  // от 120 градусов до пика 2 фазы (210 градусов), преобразуем в 255 для ШИМа
         if(deg > 210 &&  deg < 300){ 
            f2 = map(deg, 210, 300, 254, 0); } // от 210 градусов, до спада фазы(300) преобразуем значение
   if(deg > 240 &&  deg < 330){ 
      f3 = map(deg, 240, 330, 0, 255); }  // от 240 градусов до пика 3 фазы (330 градусов), преобразуем в 255 для ШИМа
         if(deg > 330 &&  deg < 360){ // тут я пока в тупике, спать больно охота ;)
            f3 = map(deg, 330, 360, 254, 85); } // от 330 градусов...
    if(deg > 0 &&  deg < 60){ 
               f3 = map(deg, 0, 60, 84, 0); }
delayMicroseconds(t + 1000); // зададим частоту вращения
// конец цикла
   }
}

Вот набросал немного, задал только верхнюю часть графика для экономии транзисторов, вот так:

Ещё код неидеален и не отработан, это так теоретически как бы.

Сейчас маленький, а потом можно и большой двиг, типа таких как на мотор колесах...

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Хм, если только три полупериода подключить через транзисторы к этому синхронному электроприводу подключённому по схеме "звезда", (судя по фото), по идеи, он не сдвинется с места. Там будут только плюсы (на транзисторах), или минусы, смотря как цифру преобразовывать. Т.е. не будет цепи. Для эксперемента можно подать на конци обмоток соеденённых вместе противоположный потенциал и тогда 50% крутящего момента будет. 

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

А можно переделать стандартную библиотеку Stepper под 3 пина? 

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Вот нашёл вполне себе рабочий код для начальной роботы с синхронным трех фазником, немного его доработал:

int phase1 = 2;
int phase2 = 3;
int phase3 = 4;
int led = 13;

unsigned long stepLength = 40000; 
int minStepLength = 1400;
int steps = 5; 

void setup() {
  pinMode(led, OUTPUT);  
  pinMode(phase1, OUTPUT);
  pinMode(phase2, OUTPUT);
  pinMode(phase3, OUTPUT);
  digitalWrite(led, LOW);
  
  // выход двига из мёртвой точки
  digitalWrite(phase1, HIGH); 
  digitalWrite(phase2, HIGH); 
  digitalWrite(phase3, HIGH);
  delay(500);
}

void loop() {
  
  switchStep(1);
  switchStep(2); 
  switchStep(3);
  switchStep(4);
  switchStep(5); 
  switchStep(6);

  if(stepLength > minStepLength)
  {
    stepLength = stepLength - steps;
  } 
  else {
    // set the minimum pulse length
    stepLength=minStepLength;
  }

  if (stepLength < 39950) {
    digitalWrite(led, HIGH);   // second gear
    steps = 300;
  }

  if (stepLength < 20000) {
    digitalWrite(led, LOW);      // third gear
    steps = 50; 
  }

  if (stepLength < 3000) { // 3000
    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, HIGH);
    digitalWrite(phase2, HIGH);
    digitalWrite(phase3, LOW);
    myDelay(stepLength);
    break;

  case 3:
    digitalWrite(phase1, LOW);
    digitalWrite(phase2, HIGH);
    digitalWrite(phase3, LOW);
    myDelay(stepLength);
    break;

  case 4:
    digitalWrite(phase1, LOW);
    digitalWrite(phase2, HIGH);
    digitalWrite(phase3, HIGH);
    myDelay(stepLength);
    break;

  case 5:
    digitalWrite(phase1, LOW);
    digitalWrite(phase2, LOW);
    digitalWrite(phase3, HIGH);
    myDelay(stepLength);
    break;

  case 6:
    digitalWrite(phase1, HIGH);
    digitalWrite(phase2, LOW);
    digitalWrite(phase3, HIGH);
    myDelay(stepLength);
    break;
  }  

}

void myDelay(unsigned long p) {
  if (p > 16380) { // 16380
    delay (p/1000);
  } 
  else {
    delayMicroseconds(p);
  }
}

Схема подключения аналогична этой:

(схема для шаговика)

Только вместо 4-х фаз у меня три.

Моё видео роботы:

https://www.youtube.com/watch?v=5vPbrwvYTSc

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

Aleksahek
Offline
Зарегистрирован: 22.12.2015

Каким параметром регулировать обороты? stepLength?

nibiluk
Offline
Зарегистрирован: 10.01.2016

Вот тут посмотрите, написано не по нашенски, но суть понятна.