/** * bldc_comm.c — 六步换相表实现 * * TIM1 使用中心对齐模式 + 互补输出: * CH1=U高, CH1N=U低 * CH2=V高, CH2N=V低 * CH3=W高, CH3N=W低 * * PWM-ON 调制: 高侧始终导通 (CCR=ARR, 100%), 低侧 PWM 斩波 */ #include "bldc_comm.h" /* ==================== 换相表 (非 static, 供 fsm.c 使用) ==================== */ const CommEntry g_comm_table[COMM_STEP_COUNT] = { /* 步0 (0-60°): U+ (CH1_ON) V- (CH2N_PWM) W悬空 */ { CC1E | CC2NE, CC1NE | CC2E | CC3E | CC3NE, PWM_ARR_VALUE, 0, 0, 2 }, /* 步1 (60-120°): U+ (CH1_ON) W- (CH3N_PWM) V悬空 */ { CC1E | CC3NE, CC1NE | CC2E | CC2NE | CC3E, PWM_ARR_VALUE, 0, 0, 1 }, /* 步2 (120-180°): V+ (CH2_ON) W- (CH3N_PWM) U悬空 */ { CC2E | CC3NE, CC1E | CC1NE | CC2NE | CC3E, 0, PWM_ARR_VALUE, 0, 0 }, /* 步3 (180-240°): V+ (CH2_ON) U- (CH1N_PWM) W悬空 */ { CC2E | CC1NE, CC1E | CC2NE | CC3E | CC3NE, 0, PWM_ARR_VALUE, 0, 2 }, /* 步4 (240-300°): W+ (CH3_ON) U- (CH1N_PWM) V悬空 */ { CC3E | CC1NE, CC1E | CC2E | CC2NE | CC3NE, 0, 0, PWM_ARR_VALUE, 1 }, /* 步5 (300-360°): W+ (CH3_ON) V- (CH2N_PWM) U悬空 */ { CC3E | CC2NE, CC1E | CC1NE | CC2E | CC3NE, 0, 0, PWM_ARR_VALUE, 0 } }; /* ==================== TIM1 CCER 初始化 ==================== */ void COMM_Init(void) { TIM1->CCER = 0; TIM1->BDTR |= TIM_BDTR_MOE; } /* ==================== 执行换相 ==================== */ void COMM_SetStep(CommStep step, uint16_t duty) { if (step >= COMM_STEP_COUNT) return; const CommEntry *e = &g_comm_table[step]; TIM1->CCER &= ~CCER_POLARITY_MASK; TIM1->CCR1 = e->ch1_ccr; TIM1->CCR2 = e->ch2_ccr; TIM1->CCR3 = e->ch3_ccr; TIM1->CCER |= e->ccer_bits_set; TIM1->BDTR |= TIM_BDTR_MOE; }