大厂成熟FOC直流电机控制方案,此方案可用于电动自行车,滑板车等电机驱动。 单片机基于Stm0...
大厂成熟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跑这个有点喘。
更多推荐
所有评论(0)