/** * bldc_comm.h — 六步换相表接口 * * 定义换相表结构、步进状态枚举 */ #ifndef BLDC_COMM_H #define BLDC_COMM_H #include "bldc_hw.h" /* 六步换相步进枚举 (60° 电角度每步) */ typedef enum { COMM_STEP0_U_P_V_N = 0, /* 0-60°: U+ V- W浮 */ COMM_STEP1_U_P_W_N = 1, /* 60-120°: U+ W- V浮 */ COMM_STEP2_V_P_W_N = 2, /* 120-180°: V+ W- U浮 */ COMM_STEP3_V_P_U_N = 3, /* 180-240°: V+ U- W浮 */ COMM_STEP4_W_P_U_N = 4, /* 240-300°: W+ U- V浮 */ COMM_STEP5_W_P_V_N = 5, /* 300-360°: W+ V- U浮 */ COMM_STEP_COUNT = 6 } CommStep; /* 换相表条目 — 每次换相执行的操作 */ typedef struct { uint16_t ccer_bits_set; /* TIM1->CCER 需置位的位 (使能输出) */ uint16_t ccer_bits_clr; /* TIM1->CCER 需清零的位 */ uint16_t ch1_ccr; /* CH1 CCR 值 (U高/低) */ uint16_t ch2_ccr; /* CH2 CCR 值 (V高/低) */ uint16_t ch3_ccr; /* CH3 CCR 值 (W高/低) */ uint8_t bemf_phase; /* 悬空相索引 (0=U, 1=V, 2=W), 用于过零检测 */ } CommEntry; /* ==================== 函数声明 ==================== */ /* 初始化 TIM1 换相配置 */ void COMM_Init(void); /* 执行换相 — 切换到指定步 */ void COMM_SetStep(CommStep step, uint16_t duty); /* 直接写 TIM1_CCER 寄存器 (中断中调用, 不嵌套函数) */ __STATIC_INLINE void COMM_WriteCCER(uint16_t bits_set, uint16_t bits_clr) { TIM1->CCER = (TIM1->CCER & ~bits_clr) | bits_set; } /* 直接写 TIM1_CCR 寄存器 (中断中调用) */ __STATIC_INLINE void COMM_WriteCCR1(uint16_t ccr) { TIM1->CCR1 = ccr; } __STATIC_INLINE void COMM_WriteCCR2(uint16_t ccr) { TIM1->CCR2 = ccr; } __STATIC_INLINE void COMM_WriteCCR3(uint16_t ccr) { TIM1->CCR3 = ccr; } /* ==================== CCER 位掩码 (供其他模块使用) ==================== */ #define CC1E (1<<0) #define CC1NE (1<<1) #define CC2E (1<<4) #define CC2NE (1<<5) #define CC3E (1<<8) #define CC3NE (1<<9) #define CCER_POLARITY_MASK (CC1E|CC1NE|CC2E|CC2NE|CC3E|CC3NE) /* 换相表外部声明 (供 fsm.c 直接访问) */ extern const CommEntry g_comm_table[COMM_STEP_COUNT]; /* 获取当前步的悬空相索引 */ __STATIC_INLINE uint8_t COMM_GetFloatingPhase(uint32_t step) { static const uint8_t bemf_phases[6] = {2, 1, 0, 2, 1, 0}; /* 步0: W浮(2), 步1: V浮(1), 步2: U浮(0), 步3: W浮(2), 步4: V浮(1), 步5: U浮(0) */ return bemf_phases[step & 0x07]; } /* 紧急刹车 — 关所有 PWM 输出 */ __STATIC_INLINE void COMM_Brake(void) { TIM1->CCER = 0; TIM1->BDTR &= ~TIM_BDTR_MOE; /* 关闭主输出 */ } #endif /* BLDC_COMM_H */