void FOC_SVPWM(float Uq, float Ud, float angle) {

int sector;

// 美妙的视频介绍了空间矢量调制(FOC_SVPWM)算法
// https://www.youtube.com/watch?v=QMSWUMEAejg

// 算法步骤如下:
// 1) Ualpha, Ubeta
// 2) Uout = sqrt(Ualpha^2 + Ubeta^2)
// 3) angle_el = atan2(Ubeta, Ualpha)
//
// 等价于2),因为幅值不变:
// Uout = sqrt(Ud^2 + Uq^2)
// 等价于3)是:
// angle_el = angle_el + atan2(Uq,Ud)

float Uout = _sqrt(Ud * Ud + Uq * Uq) / VOLTAGE_LIMIT; // 实际上,Uout是一个比率
angle = _normalizeAngle(angle + atan2(Uq, Ud));

// 找出当前所在的扇区
sector = floor(angle / _PI_3) + 1;
// 计算占空比
float T1 = _SQRT3 * _sin(sector * _PI_3 - angle) * Uout;
float T2 = _SQRT3 * _sin(angle - (sector - 1.0f) * _PI_3) * Uout;
// 有两种版本

// float T0 = 0; // 拉向0 - 更适用于低电源电压 float T0 = 1 - T1 - T2; // 调制中心在driver->voltage_limit/2

// 计算占空比(时间)
float Ta, Tb, Tc;
switch (sector) {
    case 1:
        Ta = T1 + T2 + T0 / 2;
        Tb = T2 + T0 / 2;
        Tc = T0 / 2;
        break;
    case 2:
        Ta = T1 + T0 / 2;
        Tb = T1 + T2 + T0 / 2;
        Tc = T0 / 2;
        break;
    case 3:
        Ta = T0 / 2;
        Tb = T1 + T2 + T0 / 2;
        Tc = T2 + T0 / 2;
        break;
    case 4:
        Ta = T0 / 2;
        Tb = T1 + T0 / 2;
        Tc = T1 + T2 + T0 / 2;
        break;
    case 5:
        Ta = T2 + T0 / 2;
        Tb = T0 / 2;
        Tc = T1 + T2 + T0 / 2;
        break;
    case 6:
        Ta = T1 + T2 + T0 / 2;
        Tb = T0 / 2;
        Tc = T1 + T0 / 2;
        break;
    default:
        // 可能的错误状态
        Ta = 0;
        Tb = 0;
        Tc = 0;
}

// Ta, Tb, Tc 范围 [0,1]

_writeDutyCycle3PWM(Ta, Tb, Tc);
给下面的C语言函数添加注释并将注释翻译成中文void FOC_SVPWMfloat Uq float Ud float angle int sector; Nice video explaining the SpaceVectorModulation FOC_SVPWM algorithm httpswwwyoutubecomwatchv=QMSWUMEAejg t

原文地址: https://www.cveoy.top/t/topic/fcIt 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录