Girar el motor BLDC con la transformación de Clark y Park

0

Estoy tratando de rotar el motor BLDC utilizando el método FOC sin detectar nada del motor. Acabo de aumentar lentamente el ángulo de 0 a 2PI y luego uso la transformada de Park-Clarke con Vq y Vd igual a 1.0 para obtener la fase 3, que luego uso para la modulación del vector espacial. El problema es que el motor no gira a la perfección, aquí hay un video de Y aquí está mi código para la plataforma arduino:

#include "CDFraction.h"
#include <Arduino.h>
#include <SPI.h>
#include <limits.h>



#define CLAMP(x, a, b) ((x) < (a) ? (a) : ((x) > (b) ? (b) : (x)))



float angleIncrement = 3.141592653589793 * 0.001f;
float angle = 0;

float Vsq = 1.0; 
float Vsd = 1.0;

float Va = 0;
float Vb = 0;
float Vc = 0;

int16_t Ta = 0;
int16_t Tb = 0;
int16_t Tc = 0;




SPISettings drv8305SPISettings(1000000, MSBFIRST, SPI_MODE1);
uint8_t drvSelectPin = 5;
uint8_t drvEnablePin = 4;

void setup() 
{
  pinMode(3, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(drvSelectPin, OUTPUT);
  digitalWrite (drvSelectPin, HIGH);
  pinMode(drvEnablePin, OUTPUT);
  digitalWrite (drvEnablePin, LOW);

  TCCR1B &= B11111000;
  TCCR1B |= B00000001;
  TCCR2B &= B11111000;
  TCCR2B |= B00000001;

  //initialize Serial
  Serial.begin(115200);
  // initialize SPI:
  SPI.begin();

  uint16_t drvCmd = (0 << 15) | (0x7 << 11) | 0x0296;
  uint16_t drvRes = 0;


  SPI.beginTransaction(drv8305SPISettings);
  digitalWrite (drvSelectPin, LOW);
  // reading only, so data sent does not matter
  drvRes = SPI.transfer16(drvCmd);
  digitalWrite (drvSelectPin, HIGH);
  SPI.endTransaction();
  Serial.println(drvRes, BIN);

  digitalWrite (drvEnablePin, HIGH);

}


void loop() 
{

  float VsqSinA = Vsq * sinf(angle);
  float VsdCosA = Vsd * cosf(angle);

  float Valpha = VsdCosA - VsqSinA;
  float Vbeta = VsdCosA + VsqSinA;

  float Valpha_temp = -0.5f * Valpha;
  float Vbeta_temp = 0.866025403784439 * Vbeta;

  Va = Valpha;
  Vb = Valpha_temp + Vbeta_temp; //-05f * alpha + sqrt(3)/2 * beta
  Vc = Valpha_temp - Vbeta_temp; //-05f * alpha - sqrt(3)/2 * beta

  float Vmax = 0;
  float Vmin = 0;

  if(Va > Vb)
  {
    Vmax = Va;
    Vmin = Vb;
  }
  else
  {
    Vmax = Vb;
    Vmin = Va;
  }


  if(Vc > Vmax)
  {
    Vmax = Vc;
  }
  else if (Vc < Vmin)
  {
    Vmin = Vc;
  }

  float Vcom = (Vmax + Vmin) * 0.5f;

  Ta = floor((Va - Vcom + 1.2246778011322)/2.4493556022644 * 12 + 0.5f);
  Tb = floor((Vb - Vcom + 1.2246778011322)/2.4493556022644 * 12 + 0.5f);
  Tc = floor((Vc - Vcom + 1.2246778011322)/2.4493556022644 * 12 + 0.5f);

  analogWrite( 3, CLAMP (Ta,  0, 255));
  analogWrite( 9, CLAMP (Tb,  0, 255));
  analogWrite(10, CLAMP (Tc,  0, 255));

//  Serial.print(Va);
//  Serial.print(" ");
//  Serial.print(Vb);
//  Serial.print(" ");
//  Serial.println(Vc);
//
//  delay(10);

  angle += angleIncrement;
  if(angle > 6.283185307179586)angle = 0;

}

¿Qué estoy haciendo mal?

    
pregunta Harry

1 respuesta

0

Su motor tiene un núcleo de estator de acero de silicio que aumenta la fuerza magnética de las bobinas. Desafortunadamente, los imanes del rotor son atraídos por las superficies polares del estator, lo que crea un "par de giro" que hace que el movimiento sea desigual. Aquí hay un ejemplo de torsión de agarre en un motor sin escobillas de 14 polos: -

Para cancelar el par de engranajes, debe modificar las formas de onda de la corriente de excitación. La forma de onda exacta requerida depende de la geometría particular de su motor (forma de poliface, tamaño y posición del imán, espacio de aire, etc.). En un motor con imanes de neodimio fuertes, hay un fino equilibrio de fuerzas, por lo que cualquier desalineación leve puede afectar en gran medida la forma de onda del par de tracción. Por lo tanto, para obtener los mejores resultados, tendrá que personalizar las formas de onda del variador para que coincidan con su motor en particular.

Sin embargo, sin retroalimentación, no es posible medir el par de tracción real, por lo que todo lo que puede hacer es probar diferentes formas de onda hasta obtener el movimiento más suave. Comenzaría mezclando amplitudes y fases variables de los armónicos tercero y quinto.

    
respondido por el Bruce Abbott

Lea otras preguntas en las etiquetas