Маломощный 3-х фазный двигатель
- Войдите на сайт для отправки комментариев
Пт, 12/04/2013 - 10:11

Всем привет, вот я добрался до транзисторов, ну и захотелось покрутить что-нибудь, покрутил большой двигатель от печки, маленький от кассового аппарата. А теперь хочется покрутить двигатель от винчестера, и не просто покрутить а хотя бы добраться до половины номинала - 3-4к об/мин. Помнится что там фаза должна быть сдвинута на 120 градусов, собственно вопрос, как задать математически то что на графике выше? Синус не обязательно, лишь бы крутился более менее нормально.
Руковожусь этим материалом, в наличии есть десяток n-p-n транзисторов КТ829Б.
Спасибо за помощь.
Смотрим сюда.
> как задать математически то что на графике выше
>Синус не обязательно
Ну так а почему-бы и не синус? U1=sin(x), U2=sin(x+PI*2/3), U3=sin(x-PI*2/3)
http://goo.gl/y9UcH
Чёт, я туплю, я же не частотника делать собрался, думаю будет достаточно и прямоугольных импульсов типо:
100
010
001
Или, как говорят, для плавности хода:
100
110
010
011
001
> как задать математически то что на графике выше
>Синус не обязательно
Ну так а почему-бы и не синус? 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).
Нет времени эксперементировать, хотя для себя интересно, может пригодиться, НО если речь идёт о таком маленьком электродвигателе, то, мне кажется, на выходе каскада можно просто добавить ёмкость, которая сгладит импульсы и приблизит к синусоиде. Истессно ёмкостное сопротивление, точнее его величина будет зависить от оборотов, от момента на валу, но это будет важно при запуске и начальном разгоне.
P.S. Разве не надо задавать частоту, в скетче не наблюдаю. Как раз от неё и только от неё будут зависить обороты. К примеру за какое время выполняется первый четверть периуд первой фазы?
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); // зададим частоту вращения // конец цикла } }Вот набросал немного, задал только верхнюю часть графика для экономии транзисторов, вот так:
Ещё код неидеален и не отработан, это так теоретически как бы.
Сейчас маленький, а потом можно и большой двиг, типа таких как на мотор колесах...
Хм, если только три полупериода подключить через транзисторы к этому синхронному электроприводу подключённому по схеме "звезда", (судя по фото), по идеи, он не сдвинется с места. Там будут только плюсы (на транзисторах), или минусы, смотря как цифру преобразовывать. Т.е. не будет цепи. Для эксперемента можно подать на конци обмоток соеденённых вместе противоположный потенциал и тогда 50% крутящего момента будет.
А можно переделать стандартную библиотеку Stepper под 3 пина?
Вот нашёл вполне себе рабочий код для начальной роботы с синхронным трех фазником, немного его доработал:
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 к оборотов, но остановить на полной скорости очень легко, на низкой ещё какой-то момент на валу чувствуется... ну и при старте немного греются транзисторы.
Каким параметром регулировать обороты? stepLength?
Вот тут посмотрите, написано не по нашенски, но суть понятна.