Chastotnik escalar para un motor asíncrono monofásico

Para empezar, cada programador debe tener un torno. Bueno ... O, al menos, tengo que tenerlo. E incluso sin CNC. Este es mi sueño

Y el sueño se hizo realidad. La máquina fue comprada, traída, puesta en el lugar de estacionamiento y ... Sería necesario encenderla. Y encenderlo no es tan simple. Y si no busca formas simples, entonces necesita un "chastotnik", pero de una manera científica: un convertidor de frecuencia. Y déjame ser un laico en esto, pero lo hice.



Y con la conexión del motor, comienza la diversión. Yo mismo estoy en tal ignorancia, hay algunos conocimientos generales, pero cómo funciona realmente no tenía idea. Y cuando, en lugar de las 3 conclusiones esperadas de los 3 fásers, vi 4, y ni siquiera 3 vueltas con un punto común, sino 2 separadas, e incluso con una resistencia diferente ... Bueno, yo, ejem, digamos esto: "sorprendido".

Entonces, los motores. Son trifásicos, trifásicos, conectados por un triángulo a través de condensadores y ... condensadores monofásicos.

Trifásico - "completo" asíncrono. 3 devanados, en el buen sentido incluidos por una estrella y colgados en 3 fases completas. Bueno, o un chastotnik trifásico, del cual un eje en Ali.

Trifásico + triángulo + condensadores. Aquí ya estamos perdiendo eficiencia, potencia y par, bueno, si no hay 3 fases, entonces tenemos una solución para nosotros. Barato, simple, confiable, alegre.

Condensador monofásico

Aquí hablaremos de ellos. En general, tales motores son muy comunes. Estos son ventiladores de los motores de los proyectores y las unidades de algunos relojes, y motores para pequeñas esmeril y otras aplicaciones donde no se necesita alta potencia, pero se necesitan ventajas asincrónicas: gran confiabilidad + velocidad, dependiendo solo de la frecuencia de la tensión de alimentación.

El esquema básico de inclusión (la imagen no es mía, sinceramente se encuentra en Internet):



En general, más o menos, el principio es este: hay un devanado de arranque, induce un EMF en un rotor de jaula de ardilla. Con un cambio de fase, se activa el devanado de trabajo. Ella "empuja" el ancla magnetizada, comienza la rotación. Cuando giras a cierto ángulo, todo se repite. El motor comienza a girar.

Total: necesita 2 fases, desplazadas a un ángulo determinado. Por lo general, es de 90 grados. Esto lo proporciona el condensador de arranque. Bueno, después de un conjunto de revoluciones: el ancla comienza a funcionar desde el devanado muy funcional y el devanado de arranque incluso se puede apagar por completo. Bueno, o alimentado por un condensador en funcionamiento, una capacidad mucho menor.

Pero todo esto es una teoría. Pero en la práctica, ¿qué quieres? Quiero un chastotnik ¿Qué aceleraría, reduciría la velocidad, giraría en ambas direcciones, bueno, con diferentes velocidades, por supuesto! Y aquí se pone un poco más complicado. El hecho es que hay muchas veces menos chastotniks en venta. Y cuestan muchas veces más. En general, exótico.

Pero si lo piensa de esta manera, la diferencia con la fase 3 no es tan grande. E incluso puedes usar el mismo circuito. Al mismo tiempo, hay los mismos 3 grifos: común, devanado de arranque, devanado de trabajo. Y todo se trata del firmware. Entonces, esto se puede hacer. Y que no sea un control vectorial con un montón de matemáticas, sino un simple escalar, pero ... como puedo.

Entonces, lo que se requiere. Primero, veamos las gráficas del seno y el coseno (tenemos un desplazamiento de 90 grados) CONVENCIÓN se verá así:



Es decir la tarea es elemental: "llevamos" al general al suelo, alimentamos un paquete de pulsos positivos al devanado de arranque, alimentamos un paquete de pulsos al trabajador. Luego llevamos el general al más y alimentamos un paquete de impulsos negativos al arrancador, y luego al devanado de trabajo. T.O. aproximadamente, recibimos una imitación de un cambio en la polaridad y un cambio de fase. De la frecuencia con la que haremos esto, dependerá la "frecuencia".

En general, la teoría es simple. Como un controlador ATMega 328 con un gestor de arranque, las arduins (sí, de hecho, la arduina en sí, simplemente sin demasiadas correas), el controlador IR2132 (antiguo, pero no funcionaba con IR2136) y las teclas de salida IRG4BC30. Para mi motor de 1.1 kW esto es más que suficiente.

(Si repite el diagrama, solo se termina el tablero, se vierte un boceto en el Arduino Duemilanove, luego se saca el Mega328 y se suelda en el tablero. Hecho).

Y de aquí en adelante ... Además, me sumergí en el maravilloso mundo de inductancias y electrónica de potencia. Y todo resultó no ser tan simple como se pensaba al principio:

1. La velocidad de apertura y cierre de las teclas es importante. El tiempo muerto es MUY importante.
2. Encendido del balasto: obligatorio con un diodo, frente al plus del condensador de filtrado de potencia. De lo contrario, las descargas durante la descarga de la inductancia a veces desactivan los IGBT de potencia.
3. Enfriamiento. Los radiadores pequeños en el tablero son malos. O se sobrecalienta, o necesitas soplarlo. Pero si lo soplas, entonces toda la suspensión de metal de la máquina, tarde o temprano, provocará un cortocircuito en algo y habrá una explosión.
3+.La mica, o más bien la mica MUY DELGADA, es mala. Se abre camino y resulta que en el título del artículo. Al mismo tiempo, las almohadillas térmicas de silicona son peores en conductividad térmica. Pero la cerámica ... no la tengo.
4. Frenado por el método de una larga ráfaga de pulsos de la misma polaridad en un devanado, los transistores se sobrecalientan rápidamente y se queman. Y también, el motor salta con mucha diversión, girando hasta 3 mil revoluciones y se detiene durante 0.3 segundos a 0.
5. Cuando todo funcione y te relajes, enciende el circuito sin lastre y presiona inicio - habrá un golpe. Esto también conduce a un reemplazo del controlador.

Bosquejo:Ahora se implementa la rotación en ambas direcciones con un ajuste suave de la frecuencia de 25-75 Hz con un paso de 0.25. Había una idea con un freno. Ahora está comentado y será necesario cambiar el esquema. A saber, la idea es la siguiente: apliqué correctamente impulsos de la misma polaridad, PERO. Esto debe hacerse a través del balasto con una llave separada.

Parte de potencia: el circuito aún estará finalizado, pero en este momento la máquina está en una habitación sin calefacción y es extremadamente difícil trabajar con ella debido a la congelación de aceite.

Bosquejo
#define Hi_ST 10    //
#define Hi_WK 11    //
#define Hi_M 12    //
#define Lo_ST 7
#define Lo_WK 8
#define Lo_M 9
#define SoftStart 6 //   
#define RelBrake 1

#define LedFwd 4  // ""
#define LedRew 5  // ""
#define LedStp 13 // 
#define CmdFwd 2 // ""
#define CmdRew 3 // ""   - .

#define ValFwd 4 // "" 720
#define ValRew 5 // "" 450

#define RemoteVal 0 //720 + 450 .   . 1.2         750,  1.5

int nn = 0;  //  (    " ")
byte WkState = 0;
byte OldRemVal = 0; //   

int SoftStartMotor = 0; //     .

void setup() 
{   

  pinMode(CmdFwd, INPUT);
  pinMode(CmdRew, INPUT);
  
  pinMode(Hi_ST, OUTPUT);
  pinMode(Hi_WK, OUTPUT);
  pinMode(Hi_M, OUTPUT);
  pinMode(Lo_ST, OUTPUT);
  pinMode(Lo_WK, OUTPUT);
  pinMode(Lo_M, OUTPUT);
  pinMode(SoftStart, OUTPUT);
  pinMode(RelBrake, OUTPUT);
  
  pinMode(LedFwd, OUTPUT);
  pinMode(LedRew, OUTPUT);
  pinMode(LedStp, OUTPUT);

  digitalWrite(RelBrake, LOW);
  AllOff();

  delay(1500);
  digitalWrite(SoftStart, HIGH);
  Indicate();
}


void loop() 
{

  byte CurRemVal = 0;
  int RemVal = analogRead(RemoteVal);
  if (RemVal > 380 && RemVal < 520)
    { CurRemVal = 2; }

  if (RemVal > 600 && RemVal < 800)
    { CurRemVal = 1; }

  //
  bool cmdF = digitalRead(CmdFwd);
  bool cmdR = digitalRead(CmdRew);

  
  if (CurRemVal != OldRemVal)
  {
    OldRemVal = CurRemVal;
    if (CurRemVal == 0) {cmdF = true; cmdR = true;}
    if (CurRemVal == 1) {cmdF = true; cmdR = false;}
    if (CurRemVal == 2) {cmdF = false; cmdR = true;}
  }

  if (cmdF && !cmdR) 
  {
    if(WkState != 1 && nn > 0)
    {
      WkState = 1; //  .     ,     .
      Indicate();
      Brake(); //
    }
    WkState = 1; //       .   .
    Indicate();
  }
  if (!cmdF && cmdR)
  {
    if(WkState != 2 && nn > 0)
    {
      WkState = 2;
      Indicate();
      Brake(); //
    }
    WkState = 2;
    Indicate();
    
  }
  if (cmdF && cmdR)
  {
    if(WkState != 0)
    {
      WkState = 0;
      Indicate();
      Brake(); //
    }
    Indicate();
    WkState = 0;
  }
  
  //
  if (WkState == 0) //
  {
    SoftStartMotor = 0;
    nn = 0;
    delay(50);
    return;
  }

  nn ++; //  (    " ")
  SoftStartMotor += 15; //  ,   .
  
  if (nn > 30000) nn = 30000; 
  if (SoftStartMotor > 1200) SoftStartMotor = 1200;

  if (WkState == 1) //
  {
    int delays = GetDelayByVal(min(1024-analogRead(ValFwd),SoftStartMotor)); //   . , ... 
    RotateFwd(delays-400);
  }
  else //
  {
    int delays = GetDelayByVal(min(analogRead(ValRew),SoftStartMotor));
    RotateRew(delays-400 );
  }
}

// .  
void RotateFwd(int delays)
{
  digitalWrite(Lo_M, !HIGH); //  
  SendPosST(delays);
  delayMicroseconds(100);
  SendPosWK(delays);
  digitalWrite(Lo_M, !LOW); //  . 
  
  delayMicroseconds(100); // 
  
  digitalWrite(Hi_M, !HIGH);
  SendNegST(delays);
  delayMicroseconds(100);
  SendNegWK(delays);
  digitalWrite(Hi_M, !LOW);

  delayMicroseconds(60);
}

// .  
void RotateRew(int delays)
{
  digitalWrite(Lo_M, !HIGH); //  
  SendPosST(delays);
  digitalWrite(Lo_M, !LOW); //  . 

  delayMicroseconds(100);
  digitalWrite(Hi_M, !HIGH);
  SendNegWK(delays);  
  delayMicroseconds(100);
  SendNegST(delays);
  digitalWrite(Hi_M, !LOW);

  delayMicroseconds(100);
  digitalWrite(Lo_M, !HIGH); //  
  SendPosWK(delays);
  digitalWrite(Lo_M, !LOW); //  .

  delayMicroseconds(60);
}

//  
void SendPulse(int pin, int delays) 
{

/*
digitalWrite(pin, !HIGH);
MyDelay(delays);
digitalWrite(pin, !LOW);
*/

byte pwrCycle = 0;
  while(delays > 0) //  ,      
  {
    pwrCycle ++;
    if (delays < 0)
      return;
    if (delays < 300) //   300,   .
    {
      delayMicroseconds(delays);
      return;
    }
    
    if (pwrCycle < 5){  digitalWrite(pin, !HIGH);}
    delayMicroseconds(min(1200,delays));  // . 1200
    digitalWrite(pin, !LOW);
    
    if (delays < 300)//   300,   .
    {
      delayMicroseconds(delays);
      return;
    }

    delayMicroseconds(200); 
    delays -= 1400; //  
  }
}

void SendPosWK(int delays)
{
  SendPulse(Hi_WK,delays);
}
void SendNegWK(int delays)
{
  SendPulse(Lo_WK,delays);
}
void SendPosST(int delays)
{
  if (nn < 100) // 
  { SendPulse(Hi_ST,delays); } 
  else
  { 
    if (delays > 2000) //   -    25% 
    {
      SendPulse(Hi_ST,2000);
      delayMicroseconds(delays - 2000);
    }
    else
    {
      SendPulse(Hi_ST,delays);
      //delayMicroseconds(delays); //  ,   100%   -     1-2  
    }
  }
}
void SendNegST(int delays)
{
  if (nn < 100) // 
  { SendPulse(Lo_ST,delays); } 
  else
  {
    if (delays > 2000)
    {
      SendPulse(Lo_ST,2000);
      delayMicroseconds(delays - 2000);
    }
    else
    {
      SendPulse(Hi_ST,delays);
    }
  }
}

//    .       ,      .
void Brake()
{
  digitalWrite(LedStp, 1);
  AllOff();
  digitalWrite(RelBrake, HIGH);
  delay(1600);
  digitalWrite(RelBrake, LOW);
  delay(300);
  return;

  //Serial.println("Brake");
}

void AllOff()
{
  digitalWrite(Hi_ST, !LOW);
  digitalWrite(Hi_WK, !LOW);
  digitalWrite(Hi_M, !LOW);
  digitalWrite(Lo_ST, !LOW);
  digitalWrite(Lo_WK, !LOW);
  digitalWrite(Lo_M, !LOW);
  delayMicroseconds(300);
}

void Indicate()
{
  digitalWrite(LedStp, (WkState == 0 ? 1:0));
  digitalWrite(LedFwd, (WkState == 1 ? 1:0));
  digitalWrite(LedRew, (WkState == 2 ? 1:0));
}

// 25  75   0.25  511 ( ) = 50
int GetDelayByVal(int val)
{
  if (val < 5) return 10000;
  if (val < 10) return 9900;
  if (val < 15) return 9803;
  if (val < 20) return 9708;
  if (val < 25) return 9615;
  if (val < 30) return 9523;
  if (val < 35) return 9433;
  if (val < 40) return 9345;
  if (val < 45) return 9259;
  if (val < 50) return 9174;
  if (val < 55) return 9090;
  if (val < 60) return 9009;
  if (val < 65) return 8928;
  if (val < 70) return 8849;
  if (val < 76) return 8771;
  if (val < 81) return 8695;
  if (val < 86) return 8620;
  if (val < 91) return 8547;
  if (val < 96) return 8474;
  if (val < 101) return 8403;
  if (val < 106) return 8333;
  if (val < 111) return 8264;
  if (val < 116) return 8196;
  if (val < 121) return 8130;
  if (val < 126) return 8064;
  if (val < 131) return 8000;
  if (val < 136) return 7936;
  if (val < 141) return 7874;
  if (val < 147) return 7812;
  if (val < 152) return 7751;
  if (val < 157) return 7692;
  if (val < 162) return 7633;
  if (val < 167) return 7575;
  if (val < 172) return 7518;
  if (val < 177) return 7462;
  if (val < 182) return 7407;
  if (val < 187) return 7352;
  if (val < 192) return 7299;
  if (val < 197) return 7246;
  if (val < 202) return 7194;
  if (val < 207) return 7142;
  if (val < 212) return 7092;
  if (val < 217) return 7042;
  if (val < 223) return 6993;
  if (val < 228) return 6944;
  if (val < 233) return 6896;
  if (val < 238) return 6849;
  if (val < 243) return 6802;
  if (val < 248) return 6756;
  if (val < 253) return 6711;
  if (val < 258) return 6666;
  if (val < 263) return 6622;
  if (val < 268) return 6578;
  if (val < 273) return 6535;
  if (val < 278) return 6493;
  if (val < 283) return 6451;
  if (val < 288) return 6410;
  if (val < 294) return 6369;
  if (val < 299) return 6329;
  if (val < 304) return 6289;
  if (val < 309) return 6250;
  if (val < 314) return 6211;
  if (val < 319) return 6172;
  if (val < 324) return 6134;
  if (val < 329) return 6097;
  if (val < 334) return 6060;
  if (val < 339) return 6024;
  if (val < 344) return 5988;
  if (val < 349) return 5952;
  if (val < 354) return 5917;
  if (val < 359) return 5882;
  if (val < 364) return 5847;
  if (val < 370) return 5813;
  if (val < 375) return 5780;
  if (val < 380) return 5747;
  if (val < 385) return 5714;
  if (val < 390) return 5681;
  if (val < 395) return 5649;
  if (val < 400) return 5617;
  if (val < 405) return 5586;
  if (val < 410) return 5555;
  if (val < 415) return 5524;
  if (val < 420) return 5494;
  if (val < 425) return 5464;
  if (val < 430) return 5434;
  if (val < 435) return 5405;
  if (val < 441) return 5376;
  if (val < 446) return 5347;
  if (val < 451) return 5319;
  if (val < 456) return 5291;
  if (val < 461) return 5263;
  if (val < 466) return 5235;
  if (val < 471) return 5208;
  if (val < 476) return 5181;
  if (val < 481) return 5154;
  if (val < 486) return 5128;
  if (val < 491) return 5102;
  if (val < 496) return 5076;
  if (val < 501) return 5050;
  if (val < 506) return 5025;
  if (val < 512) return 5000;
  if (val < 517) return 4975;
  if (val < 522) return 4950;
  if (val < 527) return 4926;
  if (val < 532) return 4901;
  if (val < 537) return 4878;
  if (val < 542) return 4854;
  if (val < 547) return 4830;
  if (val < 552) return 4807;
  if (val < 558) return 4784;
  if (val < 563) return 4761;
  if (val < 568) return 4739;
  if (val < 573) return 4716;
  if (val < 578) return 4694;
  if (val < 583) return 4672;
  if (val < 588) return 4651;
  if (val < 593) return 4629;
  if (val < 599) return 4608;
  if (val < 604) return 4587;
  if (val < 609) return 4566;
  if (val < 614) return 4545;
  if (val < 619) return 4524;
  if (val < 624) return 4504;
  if (val < 629) return 4484;
  if (val < 634) return 4464;
  if (val < 640) return 4444;
  if (val < 645) return 4424;
  if (val < 650) return 4405;
  if (val < 655) return 4385;
  if (val < 660) return 4366;
  if (val < 665) return 4347;
  if (val < 670) return 4329;
  if (val < 675) return 4310;
  if (val < 680) return 4291;
  if (val < 686) return 4273;
  if (val < 691) return 4255;
  if (val < 696) return 4237;
  if (val < 701) return 4219;
  if (val < 706) return 4201;
  if (val < 711) return 4184;
  if (val < 716) return 4166;
  if (val < 721) return 4149;
  if (val < 727) return 4132;
  if (val < 732) return 4115;
  if (val < 737) return 4098;
  if (val < 742) return 4081;
  if (val < 747) return 4065;
  if (val < 752) return 4048;
  if (val < 757) return 4032;
  if (val < 762) return 4016;
  if (val < 768) return 4000;
  if (val < 773) return 3984;
  if (val < 778) return 3968;
  if (val < 783) return 3952;
  if (val < 788) return 3937;
  if (val < 793) return 3921;
  if (val < 798) return 3906;
  if (val < 803) return 3891;
  if (val < 808) return 3875;
  if (val < 814) return 3861;
  if (val < 819) return 3846;
  if (val < 824) return 3831;
  if (val < 829) return 3816;
  if (val < 834) return 3802;
  if (val < 839) return 3787;
  if (val < 844) return 3773;
  if (val < 849) return 3759;
  if (val < 855) return 3745;
  if (val < 860) return 3731;
  if (val < 865) return 3717;
  if (val < 870) return 3703;
  if (val < 875) return 3690;
  if (val < 880) return 3676;
  if (val < 885) return 3663;
  if (val < 890) return 3649;
  if (val < 896) return 3636;
  if (val < 901) return 3623;
  if (val < 906) return 3610;
  if (val < 911) return 3597;
  if (val < 916) return 3584;
  if (val < 921) return 3571;
  if (val < 926) return 3558;
  if (val < 931) return 3546;
  if (val < 936) return 3533;
  if (val < 942) return 3521;
  if (val < 947) return 3508;
  if (val < 952) return 3496;
  if (val < 957) return 3484;
  if (val < 962) return 3472;
  if (val < 967) return 3460;
  if (val < 972) return 3448;
  if (val < 977) return 3436;
  if (val < 983) return 3424;
  if (val < 988) return 3412;
  if (val < 993) return 3401;
  if (val < 998) return 3389;
  if (val < 1003) return 3378;
  if (val < 1008) return 3367;
  if (val < 1013) return 3355;
  if (val < 1018) return 3344;
  if (val < 1024) return 3333;
}


Esquema:
imagen
en general, casi un clásico, pero ensamblado a partir de 5 esquemas diferentes. Los diodos en los hombros "altos", en general, cuando se usan transistores IGBT, no son necesarios, pero lo hice primero, y luego solo pensé

como resultado: funciona. Aún queda mucho por completar, por ejemplo, un "control remoto" externo, un freno. Puede valer la pena experimentar con la duración del pulso o hacer un PWM completo simulando un seno, en lugar de un ciclo de trabajo constante. Pero por ahora esto es así. Tal vez alguien sea útil.

Y al final, me gustaría preguntar: en lugar de lastre, puse un estrangulador, "sujetado" por diodos. ¿Qué tan equivocado estoy en tal decisión? Ahogador, ni siquiera sé qué inductancia. Tomado de la fuente de alimentación ATX, donde se encontraba en la unidad de compensación de potencia reactiva.

Bueno, la experiencia ... La experiencia es muy interesante. Nunca hubiera pensado que podría ser tan difícil. Y que 30V y 300V es una gran diferencia. Realmente respeto a las personas que diseñan tales cosas.
Y este es el precio de mis errores:



puede ver el video de todo el proceso aquí: 1 2 3

Preguntas para conocer más, me gustaría ver los comentarios:

1. El acelerador que se encuentra en el circuito +310. ¿Debo deshacerme de él? Lo configuré con la esperanza de que el aumento de la corriente, en el caso de la corriente continua, sea más lento y el conductor tenga tiempo de entrar en la protección actual.

2. Recibo pulsos del mismo ciclo de trabajo. ¿Es esto crítico? ¿Dejar o hacer algo "dependiente de los senos" en el ciclo de trabajo?

Source: https://habr.com/ru/post/es399357/


All Articles