全开源,无感FOC控制风机代码 全开源代码,代码基于国产MCU芯片,大厂成熟风机量产程序,龙博格电机观测器观测角度,SVPWM,支持顺逆风启动,五段式与七段式调制等源码。 国产大部分芯片通用,不是一般代码可比的。 是资料,不是实物!!!包含原理图和程序源代码,程序部分有注释和说明,全开源代码,支持移植到其它的MCU平台。

typedef struct {
    float Rs;       // 定子电阻
    float Ld;       // D轴电感
    float Lq;       // Q轴电感
    float flux;     // 永磁体磁链
    float Ts;       // 控制周期
} MotorParams;

观测器核心算法在speed_estimator.c里藏着,这个梯度下降法玩得贼溜。注意看这个角度修正的骚操作,直接拿反电势和估算电流的叉积做误差补偿:

float cross_prod = es_alpha * i_beta_est - es_beta * i_alpha_est;
angle_error += cross_prod * K_observer * control_period;

顺逆风启动策略绝对是实战派,启动时先做三次电压脉冲检测转子初始位置。看这个状态机切换,遇到逆风情况直接切反向SVPWM序列:

if(restart_counter > RESTART_THRESHOLD){
    svpwm_mode = REVERSE_SEQUENCE;  // 逆风启动标志
    current_phase += PI;            // 相位翻转180度
    restart_flag = 0;
}

五段式与七段式SVPWM动态切换不是盖的,在pwm_generate()函数里有个模式选择开关。实测七段式在低速时波形更干净,但五段式在中高速效率能提升3%左右:

void select_svpwm_mode(float speed){
    if(fabs(speed) < SWITCH_SPEED){
        pwm_mode = SEVEN_SEGMENT;
        clarke_park_sw = 0.8;       // 调整坐标变换系数
    }else{
        pwm_mode = FIVE_SEGMENT;
        clarke_park_sw = 1.0;
    }
}

移植到GD32时踩过坑的肯定懂,ADC采样触发时机要和PWM中心对齐,这套代码在adc_sync.c里用了个巧妙的时间戳校验机制。看这个补偿算法,直接拿上次的PWM占空比预测当前采样点:

compensation = (last_duty_A + last_duty_B) * DEAD_TIME / PWM_PERIOD;
adc_trigger_delay = ADC_SAMPLE_OFFSET - compensation;

这套代码最狠的是参数自整定模块,上电自动识别电机参数。在motor_identify()里用白噪声注入法测电感,比传统阶跃响应法快两倍不止。看这个随机序列生成器,直接玩硬件熵源:

for(int i=0; i<256; i++){
    rand_val ^= (TIM2->CNT & 0xFF);  // 用定时器计数器做随机种子
    noise_sequence[i] = (rand_val % 100) * 0.01f;
}

实测这套算法在突卸负载时的表现,速度恢复时间比某国外方案缩短40%。关键在current_controller.c里的抗饱和处理,这个误差积分动态限幅机制属实高明:

if(fabs(current_error) > ERROR_THRESHOLD){
    integral_term *= 0.5f;  // 大误差时抑制积分
}else{
    integral_term += Ki * current_error * Ts;
}

移植到其它平台时注意看clock_config.h里的时基设定,PWM频率和ADC采样率必须严格锁相。有次在APM32上栽跟头,就是没改这个宏定义:

#define PWM_FREQUENCY    16000  // 必须与ADC_SAMPLE_RATE同步
#define ADC_SAMPLE_RATE  (PWM_FREQUENCY * 2)

这套代码藏着不少实战优化技巧,比如在park_transform()里用q15格式定点数加速运算,实测比浮点版快1.8倍。看这个汇编级的优化,直接内联了SIMD指令:

__asm volatile (
    "SMULWB %0, %1, %2\n\t"
    : "=r" (result)
    : "r" (a), "r" (b)
);

最后吐槽下原理图里的驱动电路设计,居然用分立元件搭自举电路。好在PCB布局留了兼容位置,换IR2101S也能直接贴。不过话说回来,这套代码配合国产MCU的成本控制确实到位,批量价比ST方案低30%不是梦。

Logo

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

更多推荐