无叶风扇驱动器方案,主控芯片hc32f030,无感foc驱动,电流环,速度环控制,顺逆风启动控制。 是资料,提供图纸,源程序。

无叶风扇的驱动方案里藏着不少有意思的技术细节,咱们今天就扒一扒基于HC32F030主控的无感FOC驱动实现。先说说这主控芯片,HC32F030的PWM模块支持中心对齐模式,这对三相电机的对称控制特别友好。重点来了——它的ADC采样窗口和PWM中断的配合简直是为电流环量身定制的。

看这段ADC初始化的骚操作:

ADC_InitStruct.Resolution = ADC_RESOLUTION_12BIT;
ADC_InitStruct.DataAlign = ADC_DATA_ALIGN_RIGHT;
ADC_InitStruct.ScanMode = ADC_SCAN_DIRECTION_FORWARD;
ADC_InitStruct.AutoOff = DISABLE;
ADC_InitStruct.LowPowerMode = DISABLE;
ADC_InitStruct.TrigEdge = ADC_TRIG_RISING_EDGE;
ADC_InitStruct.TrigSrc = ADC_TRIG_SRC_PWMTRG;

关键在TrigSrc设置为PWMTRG,这就实现了PWM中点触发ADC采样。实际调试中发现,如果采样点没卡准PWM的波谷位置,电流波形会有明显毛刺,这个坑可是让不少新手栽过跟头。

无感FOC的核心算法在滑模观测器这里。看这段代码里的转子位置估算:

void SMO_Update(void)
{
    // 反电动势计算
    emf_alpha = V_alpha - Rs*I_alpha - Ls*dI_alpha;
    emf_beta  = V_beta  - Rs*I_beta  - Ls*dI_beta;
    
    // 滑模控制量
    z_alpha = emf_alpha - Z_alpha;
    z_beta  = emf_beta  - Z_beta;
    
    // 符号函数处理
    if(z_alpha > 0) S_alpha = 1;
    else S_alpha = -1;
    
    // 观测器更新
    Z_alpha += (S_alpha * Kslide - Z_alpha) * Ts;
    // 同样处理beta轴...
}

这里有个骚操作——用符号函数代替传统饱和函数,实测发现对低速抖动的抑制效果提升明显。但要注意Kslide参数的整定,参数过大会导致估算震荡,过小则响应迟钝。

无叶风扇驱动器方案,主控芯片hc32f030,无感foc驱动,电流环,速度环控制,顺逆风启动控制。 是资料,提供图纸,源程序。

说到顺逆风启动,这功能真是救场神器。有一次测试时突然断电,风扇叶片还在转,重启时电机居然能自动识别旋转方向。秘密藏在这个启动序列里:

void Startup_Sequence(void)
{
    // 预定位阶段
    SetPWM_Duty(PhaseA, 70%);
    delay_ms(200);
    
    // 脉冲注入检测
    for(uint8_t i=0; i<3; i++){
        InjectHighFreqPulse();
        if(DetectCurrentRipple() > threshold){
            RotorDirection = i;
            break;
        }
    }
    
    // 强制加速阶段
    while(Speed < 20%){
        FOC_Update(ForceAngle);
        ForceAngle += Direction*0.1rad;
    }
}

脉冲注入检测那部分特别有意思,通过不同相位的高频电压注入,观察电流纹波幅度来判断转子初始位置。有个冷知识:注入频率最好避开PWM开关频率的整数倍,否则容易被噪声淹没。

速度环的PID实现有个小技巧:

typedef struct {
    float Kp;
    float Ki;
    float Kd;
    float integral;
    float prev_error;
} SpeedPID;

float Speed_PID_Update(SpeedPID* pid, float target, float actual)
{
    float error = target - actual;
    pid->integral += error * Ts;
    
    // 抗积分饱和处理
    if(pid->integral > 500) pid->integral = 500;
    else if(pid->integral < -500) pid->integral = -500;
    
    float output = pid->Kp * error 
                 + pid->Ki * pid->integral 
                 + pid->Kd * (error - pid->prev_error)/Ts;
    
    pid->prev_error = error;
    return output;
}

注意积分限幅值不是随便设的,要根据最大允许电流反推。比如当最大电流限制在5A时,积分项上限就得对应换算成电压值。调试时可以先关掉积分项,单用比例调响应速度。

最后提个硬件上的坑点:电流采样电路的RC滤波参数。原理图上标的是1kΩ+100nF,但实际布局时如果走线过长,等效电容会变大,导致相移严重。有个补救办法是在代码里做相位补偿:

// ADC采样值补偿
real_current = raw_current * cos(2*PI*f_sw*T_delay);

这招让原本跑飞了的电流波形瞬间老实了。所以说啊,搞电机控制就得软硬结合,代码和电路得穿一条裤子才行。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐