He empezado a trabajar en la estabilización de un cardán de un solo eje con un Arduino y un motor sin sensor BLDC.
He leído muchos ejemplos sobre este tema, pero tengo una pregunta sobre el uso del PWM sinusoidal aplicado al puente del inversor que impulsa el motor BLDC.
Por ejemplo, considere la generación de PWM sinusoidal de la siguiente manera
sineSize = 1024;
sineScale = 32767;
int sinTable[1024];
for (int i = 0; i < sineSize ; i++)
{
float x = i * (2*pi)/1024;
sinTable[i] = round(sin(x) * 32767);
}
Estoy usando un controlador P simple (y ficticio) que obtiene la orientación del eje (ángulo de balanceo) del motor desde una IMU de la siguiente manera
setpoint = 0; // degrees
float error = setpoint + rollAngle;
Pout = Kp * error;
Y estoy calculando los valores que deberían aplicarse a las entradas PWM de mi puente inversor (L6234 desde ST) para estabilizar el motor al punto de ajuste cuando el eje se mueve
// 180 : Maximum value which the IMU returns (+/- 180 angles)
// 1024 : Dimension of the sin(.) array
// 255 : Maximum value accepted from Arduino analogWrite(.,.)
int offset= round(Pout / 180 * 1024);
int pwm[3];
// Forcing offset into array range
offset = offset % 1024;
if (offset < 0)
offset = 1024 + offset;
uint16_t pwr= 5 * power;
index = offset % 1024;
// Evaluating PWM value based on the sin(.) look up table values
pwm[0] = (sinTable[index]*pwr + (32767/2))/32767 + (255/2);
index = (offset + (1024/3)) % 1024;
// Evaluating PWM value based on the sin(.) look up table values
pwm[1] = (sinTable[index]*pwr + (32767/2))/32767 + (255/2);
index = (offset + ((2 * 1024) / 3)) % 1024;
// Evaluating PWM value based on the sin(.) look up table values
pwm[2] = (sinTable[index]*pwr + (32767/2))/32767 + (255/2);
Todos los PWM se aplican a los pines de entrada de mi puente inversor para girarlo.
Hay un punto que realmente no entiendo, cuando pwr es alto, el motor BLDC toma corrientes como 0.8 A a 12 V. El motor BLDC utilizado se puede encontrar aquí (http: // www.dys.hk/ProductShow.asp?ID=109), pero no hay una hoja de datos detallada.
(sinTable[index]*pwr + (32767/2))/32767 + (255/2)
- ¿Qué significa sinTable [index] * pwr en términos de poder?
- ¿Podría explicar la relación entre la salida del controlador y el índice utilizado en la matriz sin (.)? (Me refiero a cuál es la relación lógica entre el Pout y el índice usado para elegir el valor discreto de la PWM en el vector sintable).
El código se basa en un proyecto que se puede encontrar en GitHub, a saber, EvvGC