STM32 FOC 开源算法,包括观测器和 Foc method STM32F0 系列 FOC 源代码,有单电阻采样和三电阻采样两种代码。都是 ST 经典算法,代码学习,无感算法观测器是开源代码,Foc method 也是开源,不是库。
电流采样:单电阻方案
单电阻方案的核心在于电流重构,ST 的代码通过 PWM 周期内不同时刻的采样点拼凑电流波形。
void ADC_Handler(void) {
if(ADC_GetFlagStatus(ADC_FLAG_EOC)) {
switch(sampling_phase) {
case 0: currA = ADC_GetValue() * voltage_scale; break;
case 1: currB = (ADC_GetValue() - currA) * voltage_scale; break;
}
sampling_phase = (sampling_phase + 1) % 6;
}
}
重点在于基尔霍夫电流定律的硬件级实现(Ia + Ib + Ic = 0)。注意 voltage_scale 系数,实际调参时需校准。
三电阻采样
三电阻方案直接三相全采,但 ADC 时序需与 PWM 严格同步。
void TIM1_UP_IRQHandler(void) {
ADC_StartConversion();
while(!ADC_GetFlagStatus(ADC_FLAG_EOC));
currA_raw = ADC_GetValue(ADC_Channel_1);
currB_raw = ADC_GetValue(ADC_Channel_2);
currC_raw = ADC_GetValue(ADC_Channel_3);
Clarke_Transform(currA_raw, currB_raw, currC_raw, &Ialpha, &Ibeta);
}
实测该循环在低端芯片上耗时极短,刚好卡在 ADC 转换完成后的时间窗里。
观测器实现
开源观测器混合了滑模观测器和反电动势估算。
void Observer_Update(float Ialpha, float Ibeta, float speed_est) {
float Ealpha = -Lq * Ibeta * speed_est;
float Ebeta = Ld * Ialpha * speed_est;
float Zalpha = Kslide * sign(Ialpha_est - Ialpha);
float Zbeta = Kslide * sign(Ibeta_est - Ibeta);
theta_est = atan2f(Ebeta - Zbeta, Ealpha - Zalpha);
}


