大厂成熟FOC直流电机控制方案,此方案可用于电动自行车,滑板车等电机驱动。 单片机基于Stm031或相应兆易GD32等单片机。 转把,高中低三速。 /刹车功能/助力功能/ 电子刹车功能/欠压检测/巡航功能/铁塔王通讯/一键通/隐形限速/防盗功能/霍尔修复

大厂那套FOC电机控制方案确实有点东西,特别是用在两轮车上贼稳。咱们就拿最常见的STM32F031来说,这货性价比高得离谱,ADC和定时器资源刚好够玩转电机控制。先看转把信号处理——其实就是个0.8V-4.2V的模拟量,但处理不好直接变死亡摇摆。

// 转把ADC采样,带软件滤波
#define THROTTLE_DEADZONE 50  // 死区阈值
uint16_t Get_Throttle_Value(void) {
    static uint16_t buffer[5];
    static uint8_t index = 0;
    
    buffer[index++] = ADC_Read(THROTTLE_CH);
    if(index >=5) index = 0;
    
    // 中位值平均滤波
    Bubble_Sort(buffer,5);
    uint16_t mid_val = (buffer[1]+buffer[2]+buffer[3])/3;
    
    // 死区处理
    if(mid_val < THROTTLE_MIN + THROTTLE_DEADZONE) 
        return 0;
    return mid_val;
}

这滤波套路比硬件RC实在,特别是电动车这种震动大的场景。注意那个冒泡排序别真用,生产环境得换更高效的排序,这里只是示意。

电子刹车才是精髓,大厂方案里的PID参数调得那叫一个刁钻。重点在电流环控制,直接怼反向电流:

void EBS_Control(float target_current) {
    static float i_error_sum = 0;
    float i_error = target_current - Get_PhaseCurrent();
    
    // 抗积分饱和
    if(fabs(i_error) < 2.0f) {
        i_error_sum += i_error * 0.001; // 1ms周期
    }
    
    float output = i_error * 0.8 + i_error_sum * 0.05;
    PWM_Update(output); // 更新PWM占空比
    
    // 能量回收逻辑
    if(Get_BusVoltage() < 52.0f) {
        Charge_Battery(output * 0.3); // 回收强度限制
    }
}

注意那个0.3的系数,这是防止电池过充的关键。有些小厂方案这里敢用0.5,结果半年电池就鼓包。

大厂成熟FOC直流电机控制方案,此方案可用于电动自行车,滑板车等电机驱动。 单片机基于Stm031或相应兆易GD32等单片机。 转把,高中低三速。 /刹车功能/助力功能/ 电子刹车功能/欠压检测/巡航功能/铁塔王通讯/一键通/隐形限速/防盗功能/霍尔修复

三速切换看着简单,实际得玩gpio中断嵌套:

// 外部中断处理速度档位
void EXTI9_5_IRQHandler(void) {
    if(EXTI_GetITStatus(EXTI_Line5) != RESET) {
        static uint32_t last_tick = 0;
        if(HAL_GetTick() - last_tick > 50) { // 防抖
            current_speed_mode = (current_speed_mode+1)%3;
            Update_Speed_Limit(); // 更新速度上限
            last_tick = HAL_GetTick();
        }
        EXTI_ClearITPendingBit(EXTI_Line5);
    }
}

这里50ms防抖时间是实战经验值,实验室测30ms够用,但下雨天金属触点可能产生10ms左右的抖动。

欠压检测必须上滞后比较,不然电池电压波动时系统会抽风:

#define UVP_THRESHOLD  42.0 // 欠压点
#define RELEASE_THRES  47.0 // 恢复电压

void Check_UnderVoltage(void) {
    float vbat = Get_BatteryVoltage();
    
    if(!uvp_flag && vbat < UVP_THRESHOLD) {
        Motor_Stop(); // 硬关机
        uvp_flag = 1;
    } 
    else if(uvp_flag && vbat > RELEASE_THRES) {
        uvp_flag = 0;
        // 需要手动上电恢复
    }
}

5V的回差电压是铅酸电池的特性决定的,三元锂电可以适当缩小这个差值。重点是不能自动恢复,必须物理断电,避免反复打嗝损坏MOS管。

最后说霍尔修复这个黑科技,其实就是软件FOC的降级模式:

void Hall_Fault_Handler(void) {
    if(Hall_Error_Count > 10) {
        Switch_to_SixStep(); // 切六步换相
        Enable_Hall_Compensation(); // 启动补偿算法
        
        // 记录故障到flash
        Write_Flash(ERROR_LOG_ADDR, HALL_ERROR_CODE);
    }
}

关键在补偿算法里的相位预测,用上次正常运转时的角度做卡尔曼滤波预测,比普通插值法靠谱三倍不止。不过GD32的硬件除法器这时候就体现出优势了,STM32F0跑这个有点喘。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐