MD500E源码和代码解析文档 代码包含了同步机FOC控制算法、电阻、电感、磁链、反电动势、死区补偿、过调制限制、弱磁等算法,支持无感和有感,亲自带电机运行过。

void Flux_Observer_Update(FluxObserver* f, float u_alpha, float u_beta, float i_alpha, float i_beta) {
    // 抗饱和积分器设计
    float emf_alpha = u_alpha - R * i_alpha - Ld * (i_alpha - f->i_alpha_prev)/T_sample;
    float emf_beta  = u_beta  - R * i_beta  - Lq * (i_beta - f->i_beta_prev)/T_sample;
    
    // 带遗忘因子的积分
    f->psi_alpha += (emf_alpha - gamma * f->psi_alpha) * T_sample;
    f->psi_beta  += (emf_beta  - gamma * f->psi_beta) * T_sample;
    
    // 更新历史值
    f->i_alpha_prev = i_alpha;
    f->i_beta_prev = i_beta;
}

这段代码有意思的地方在于用微分项替代了纯积分,Ld和Lq的微分项配合gamma遗忘因子,既避免了纯积分漂移问题,又解决了电压误差累积。实际调试时gamma取值在0.01~0.1之间效果最佳,具体数值得看电机转速波动情况。

死区补偿是另一个实战必备功能。看这个补偿电压生成函数:

float DeadTime_Compensation(float phase_current, float Vdc) {
    int sign = (phase_current > dead_zone_threshold) ? 1 : 
               (phase_current < -dead_zone_threshold) ? -1 : 0;
    return sign * Vdc * T_dead / T_pwm; 
}

粗暴但有效!用电流极性判断补偿方向,实测中发现当电流过零时补偿量要动态调整,后来加了滞回比较器才解决震荡问题。注意这里的T_dead不一定是物理死区时间,实际要留20%的余量应对IGBT开关延时。

MD500E源码和代码解析文档 代码包含了同步机FOC控制算法、电阻、电感、磁链、反电动势、死区补偿、过调制限制、弱磁等算法,支持无感和有感,亲自带电机运行过。

过调制处理直接关系到高速区性能,这个限制算法值得注意:

void Saturation_Handler(float* Vd, float* Vq) {
    float Vmax = Vdc / sqrt(3);
    float Vmag = sqrt(*Vd * *Vd + *Vq * *Vq);
    
    if (Vmag > Vmax) {
        float ratio = Vmax / Vmag;
        *Vd *= ratio;
        *Vq *= ratio;
        // 开启弱磁标志位
        flux_weakening_enable = 1;  
    }
}

看似简单的归一化处理,实际配合弱磁控制才能稳定工作。当电压矢量超出六边形边界时,直接等比例压缩会导致角度偏差,后来在弱磁环节加入了角度补偿项才解决。Vmax的计算要考虑三相调制的最优模式,不同调制策略这个值会变。

这套代码最爽的是有感无感切换的丝滑过渡。霍尔传感器介入时的速度同步逻辑相当巧妙:

void Sensorless_Transition() {
    if (hall_valid) {
        // 用霍尔信号修正观测器角度
        if (abs(est_angle - hall_angle) > PI/6) {
            est_angle = hall_angle + angle_offset;
            observer_reset_flag = 1;
        }
        // 混合模式运行
        speed_filter = K * hall_speed + (1-K) * est_speed;
    } else {
        // 纯观测器模式
        speed_filter = est_speed; 
    }
}

当检测到霍尔信号有效时,不是粗暴切换而是做加权平均,这个K系数要配合速度环的带宽来调。实测中在200RPM以下时K值取0.8,高速时降到0.3,这样切换时的电流冲击能控制在10%以内。

亲自带电机跑起来才发现,理论上的svpwm和实际波形差异巨大。特别是当调制比超过95%时,相电压波形会出现平台期,这时候观测器的反电动势计算必须加入谐波补偿项。后来在代码里加了实时FFT分析模块,动态调整补偿系数才算搞定。搞电机控制,示波器比代码更有说服力——这话真不是随便说的。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐