¿Cuál es un buen conjunto de valores PWM para hacer ondas sinusoidales para un motor trifásico?

3

Estoy construyendo un espacio de chispa giratorio síncrono para una bobina de tesla. Tengo un mcu en funcionamiento (Kinetis K64F) que maneja una placa inversora de 230 voltios y hace girar un motor síncrono trifásico. El motor es un tipo síncrono en sí mismo, y la potencia que le doy también debe ser: sincronizada con la línea de CA. Es por eso que elegí construir mi propio hardware. Puedo comparar el rendimiento de mi unidad en funcionamiento con uno comercial y veo que el mío está careciendo de potencia en el motor.

El inversor trifásico que compró en la tienda hace que el motor se acelere hasta alcanzar una sincronización que se desplaza lentamente hacia un lado y no hay forma de controlarlo. Mientras que mi unidad de disco tarda más de un minuto para que el sonido se tambalee, se acelera con la frecuencia de la línea. Puedo moverlo a cualquier lado un grado a la vez. Eso es lo que necesito.

Así que creo que deben ser los datos que estoy enviando a los 6 canales pwm. Mi solución ingenua para esto ha sido llenar una matriz con valores sinusoidales al inicio. Hago 2 semiciclos positivos como este:

int angulo;    doble param    doble retención externa [370];

 for (angle=0; angle<=179; angle++) {
   param  = 255 * sin (angle*PI/180);
   hold[angle] = param;      // fill first half of the array
   hold[angle+180] = param;  // fill second half with duplicate data
 }

Luego, en una interrupción periódica, leí en voz alta esa matriz de valores sinusoidales como este:

    if (angle1 < 180) { PWM1_SetRatio8(hold[angle1]); }
    else if (angle1 == 180) { PWM1_SetRatio8(0); }
    else if (angle1 > 180) { PWM2_SetRatio8(hold[angle1]); }
    if (angle1 >= 360) { angle1 = 0; PWM2_SetRatio8(0); }

    if (angle2 < 180) { PWM3_SetRatio8(hold[angle2]); }
    else if (angle2 == 180) { PWM3_SetRatio8(0); }
    else if (angle2 > 180) { PWM4_SetRatio8(hold[angle2]); }
    if (angle2 >= 360) { angle2 = 0; PWM4_SetRatio8(0); }

y así sucesivamente para angle3, todos los cuales están separados 120 grados entre sí. Ahora veo que 180 por medio ciclo son demasiados, así que los dividí hasta 20, pero sin cambios en la salida del motor.

Bloqueo mi matriz interna de 360 valores con un pulso de precisión de cruce por cero desde el exterior para mantenerlos sincronizados.

Así que leí sobre Magic Sine Waves y eso suena bien. Pero tendría que volver a escribir un montón de código para usarlo, y debo cubrir velocidades de 58 a 62Hz, que es lo que me presentan las compañías de energía. Si llenara una serie de valores de Magic Sine, creo que obtendría una distorsión cruzada cuando cambiara a las diferentes frecuencias de línea.

Luego leí sobre la onda triangular que modula los valores del seno y agrega un tercer armónico adicional para obtener más potencia. Eso suena como el camino a seguir. Puedo leer un montón de valores pre calculados en el tiempo de ejecución y me voy. ¿Alguien tiene experiencia en la construcción de un conjunto de datos como este? ¿O me puede dar algunos consejos sobre cómo hacerlo?

    
pregunta DonGarb

2 respuestas

1

No sé si esto ayuda, pero hice un poco de trabajo en este problema. Eliminación de armónicos PWM Suena exactamente igual que las ondas sinusoidales mágicas . Pensando en lo alto de mi cabeza, precalculo una tabla combinada de los tiempos de conmutación para las 3 fases de la forma de onda y uso una sola interrupción. A medida que ocurren las interrupciones, cambie el canal en particular y luego cambie el tiempo hasta la siguiente interrupción. Para cambiar la escala de frecuencia los datos de la tabla. Esto no debería causar ningún problema con la distorsión en el rango de frecuencia que especifique. Debería ser bastante preciso ya que tienes una CPU de 120 MHz. Tuve una versión básica de esto trabajando en un transductor ultrasónico a 40 kHz en un AVR de 4 MHz.

    
respondido por el Grant Trebbin
0

Probé la solución de Grant y el motor tenía aún menos potencia. Así que volví a mis valores sinusoidales ingenuos e hice este pequeño cambio:

 for (angle=0; angle<=179; angle++) {
   param  = 265 * sin (angle*PI/180);
   if (param > 255) param = 255;
   hold[angle] = param;
   hold[angle+180] = param;
 }

Como se puede ver, multipliqué el valor del seno por 265 en lugar de 255, y recorté los valores a 255 cuando se desbordaron. Esto tiene el efecto de amplificar y limitar la onda sinusoidal. Cuando se conectan al motor, estos valores se sincronizan en aproximadamente 3 o 4 segundos. Mi medidor mide un extraño 120.0 voltios entre cada una de las 3 fases.

Todavía creo que esta es una solución ingenua, ¡pero lo hará por ahora!

    
respondido por el DonGarb

Lea otras preguntas en las etiquetas