/** * bldc_bemf.h — 反电动势过零检测接口 * * 端电压 ADC 采样 + 软件中点比较 + 3点滑动平均滤波 */ #ifndef BLDC_BEMF_H #define BLDC_BEMF_H #include "bldc_hw.h" /* ==================== 过零检测结果 ==================== */ typedef struct { uint8_t zc_flag; /* 过零标志, 1=本次检测到过零 */ uint8_t bemf_phase; /* 过零发生在哪一相 (0=U, 1=V, 2=W) */ uint32_t zc_pwm_cycle; /* 过零发生时的 PWM 周期计数值 */ } ZcResult; /* ==================== 函数声明 ==================== */ /* 初始化 BEMF 检测 (清零滤波器缓冲区) */ void BEMF_Init(void); /* ADC 采样完成后的处理: 滑动平均 + 更新滤波器 */ void BEMF_UpdateFilter(void); /* 过零检测 — 在 TIM1 中断中调用, 根据当前步数判断悬空相 */ /* 返回 1 表示检测到过零, 0 表示无过零 */ uint8_t BEMF_DetectZeroCross(uint32_t current_step); /* 计算虚拟中点电压 (三相平均值) */ __STATIC_INLINE uint16_t BEMF_CalcMidpoint(void) { return (uint16_t)(((uint32_t)g_adc_filtered[0] + (uint32_t)g_adc_filtered[1] + (uint32_t)g_adc_filtered[2]) / 3); } /* 获取最新的过零结果 */ __STATIC_INLINE ZcResult* BEMF_GetLastZc(void) { static ZcResult last_zc = {0}; return &last_zc; } /* 清零过零计数 (切闭环时调用) */ void BEMF_ClearZcCount(void); /* 获取连续有效过零次数 */ uint8_t BEMF_GetValidZcCount(void); #endif /* BLDC_BEMF_H */