
平台keil V5.31主函数int main(void) { LL_PERIPH_WE(LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_GPIO | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM); BSP_CLK_Init(); SysTick_Config(SystemCoreClock / 1000U); // 1ms 周期 /* HALL_U initialize */ HALL_U_Global_Init(); HALL_V_Global_Init(); HALL_W_Global_Init(); BSP_TMR6_Init(); g_Motor_Start_flag0; delay_ms(1000); BSP_TMR6_Start();// 启动定时器 delay_ms(2000); g_Motor_Start_flag1; BLDC_Startup_PrePosition(); BLDC_PhaseChangeByHall(g_bldc_start_hall,500);//占空比50% LL_PERIPH_WP(LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_GPIO | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM); while(1) { } }时钟#define BSP_XTAL_PORT (GPIO_PORT_H) #define BSP_XTAL_PIN (GPIO_PIN_00 | GPIO_PIN_01) void BSP_CLK_Init(void) { stc_clock_xtal_init_t stcXtalInit; stc_clock_pll_init_t stcMpllInit; // GPIO_AnalogCmd(BSP_XTAL_PORT, BSP_XTAL_PIN, ENABLE); (void)CLK_XtalStructInit(stcXtalInit); (void)CLK_PLLStructInit(stcMpllInit); /* Set bus clk div. */ CLK_SetClockDiv(CLK_BUS_CLK_ALL, (CLK_HCLK_DIV1 | CLK_EXCLK_DIV2 | CLK_PCLK0_DIV1 | CLK_PCLK1_DIV2 | \ CLK_PCLK2_DIV4 | CLK_PCLK3_DIV4 | CLK_PCLK4_DIV2)); /* Config Xtal and enable Xtal */ stcXtalInit.u8Mode CLK_XTAL_MD_OSC; stcXtalInit.u8Drv CLK_XTAL_DRV_ULOW; stcXtalInit.u8State CLK_XTAL_ON; stcXtalInit.u8StableTime CLK_XTAL_STB_2MS; (void)CLK_XtalInit(stcXtalInit); /* MPLL config (XTAL / pllmDiv * plln / PllpDiv 200M). */ stcMpllInit.PLLCFGR 0UL; stcMpllInit.PLLCFGR_f.PLLM 1UL - 1UL; stcMpllInit.PLLCFGR_f.PLLN 50UL - 1UL; stcMpllInit.PLLCFGR_f.PLLP 2UL - 1UL; stcMpllInit.PLLCFGR_f.PLLQ 2UL - 1UL; stcMpllInit.PLLCFGR_f.PLLR 2UL - 1UL; stcMpllInit.u8PLLState CLK_PLL_ON; stcMpllInit.PLLCFGR_f.PLLSRC CLK_PLL_SRC_XTAL; (void)CLK_PLLInit(stcMpllInit); /* Wait MPLL ready. */ while (SET ! CLK_GetStableStatus(CLK_STB_FLAG_PLL)) { ; } /* sram init include read/write wait cycle setting */ SRAM_SetWaitCycle(SRAM_SRAMH, SRAM_WAIT_CYCLE0, SRAM_WAIT_CYCLE0); SRAM_SetWaitCycle((SRAM_SRAM12 | SRAM_SRAM3 | SRAM_SRAMR), SRAM_WAIT_CYCLE1, SRAM_WAIT_CYCLE1); /* flash read wait cycle setting */ (void)EFM_SetWaitCycle(EFM_WAIT_CYCLE5); /* 3 cycles for 126MHz ~ 200MHz */ GPIO_SetReadWaitCycle(GPIO_RD_WAIT3); /* Switch driver ability */ (void)PWC_HighSpeedToHighPerformance(); /* Switch system clock source to MPLL. */ CLK_SetSysClockSrc(CLK_SYSCLK_SRC_PLL); /* Reset cache ram */ EFM_CacheRamReset(ENABLE); EFM_CacheRamReset(DISABLE); /* Enable cache */ EFM_CacheCmd(ENABLE); } void delay_ms(uint32_t ms) { uint32_t start g_tick_ms; while ((g_tick_ms - start) ms); } void SysTick_Handler(void) { g_tick_ms; }hall#define HALL_U_PORT (GPIO_PORT_C) #define HALL_U_PIN (GPIO_PIN_06) #define HALL_U_EXTINT_CH (EXTINT_CH06) #define HALL_U_INT_SRC (INT_SRC_PORT_EIRQ6) #define HALL_U_GLB_INT_IRQn (INT006_IRQn) #define HALL_U_GRP_INT_IRQn (INT033_IRQn) #define HALL_U_SHARE_INT_IRQn (INT128_IRQn) #define HALL_U_INT_PRIO (DDL_IRQ_PRIO_DEFAULT) #define HALL_V_PORT (GPIO_PORT_C) #define HALL_V_PIN (GPIO_PIN_07) #define HALL_V_EXTINT_CH (EXTINT_CH07) #define HALL_V_INT_SRC (INT_SRC_PORT_EIRQ7) #define HALL_V_GLB_INT_IRQn (INT007_IRQn) #define HALL_V_GRP_INT_IRQn (INT033_IRQn) #define HALL_V_SHARE_INT_IRQn (INT128_IRQn) #define HALL_V_INT_PRIO (DDL_IRQ_PRIO_DEFAULT) #define HALL_W_PORT (GPIO_PORT_C) #define HALL_W_PIN (GPIO_PIN_08) #define HALL_W_EXTINT_CH (EXTINT_CH08) #define HALL_W_INT_SRC (INT_SRC_PORT_EIRQ8) #define HALL_W_GLB_INT_IRQn (INT008_IRQn) #define HALL_W_GRP_INT_IRQn (INT033_IRQn) #define HALL_W_SHARE_INT_IRQn (INT128_IRQn) #define HALL_W_INT_PRIO (DDL_IRQ_PRIO_DEFAULT)void EXTINT_HALL_U_Global_IrqCallback(void) { uint8_t hall_u0, hall_v0, hall_w0; uint8_t hall_u_check0, hall_v_check0, hall_w_check0; uint8_t change0; for(volatile int i 0; i 100; i) ; // 约1-2μs根据频率调整 /* 读取当前霍尔引脚电平 */ hall_u (GPIO_ReadInputPins(HALL_U_PORT, HALL_U_PIN) PIN_SET) ? 1U : 0U; hall_v (GPIO_ReadInputPins(HALL_V_PORT, HALL_V_PIN) PIN_SET) ? 1U : 0U; hall_w (GPIO_ReadInputPins(HALL_W_PORT, HALL_W_PIN) PIN_SET) ? 1U : 0U; Hall_Value (uint8_t)((hall_u 2U) | (hall_v 1U) | hall_w); for(volatile int i 0; i 100; i) ; // 约1-2μs根据频率调整 hall_u_check (GPIO_ReadInputPins(HALL_U_PORT, HALL_U_PIN) PIN_SET) ? 1U : 0U; hall_v_check (GPIO_ReadInputPins(HALL_V_PORT, HALL_V_PIN) PIN_SET) ? 1U : 0U; hall_w_check (GPIO_ReadInputPins(HALL_W_PORT, HALL_W_PIN) PIN_SET) ? 1U : 0U; if((hall_u_check ! hall_u) ||(hall_v_check ! hall_v)||(hall_w_check ! hall_w)) { return; // 信号不稳定放弃本次中断 } if(g_Motor_Start_flag1 ) { if((Hall_Value0)(Hall_Value7)) { BLDC_PhaseChangeByHall(Hall_Value,500);//占空比50% } } EXTINT_ClearExtIntStatus(HALL_U_EXTINT_CH); } void HALL_U_Global_Init(void) { stc_extint_init_t stcExtIntInit; stc_irq_signin_config_t stcIrqSignConfig; stc_gpio_init_t stcGpioInit; /* GPIO config */ (void)GPIO_StructInit(stcGpioInit); stcGpioInit.u16ExtInt PIN_EXTINT_ON; stcGpioInit.u16PullUp PIN_PU_ON; (void)GPIO_Init(HALL_U_PORT, HALL_U_PIN, stcGpioInit); /* ExtInt config */ (void)EXTINT_StructInit(stcExtIntInit); stcExtIntInit.u32Filter EXTINT_FILTER_ON; stcExtIntInit.u32FilterClock EXTINT_FCLK_DIV64;//EXTINT_FCLK_DIV8; #if 1 stcExtIntInit.u32Edge EXTINT_TRIG_FALLING; #else stcExtIntInit.u32Edge EXTINT_TRIG_BOTH; #endif (void)EXTINT_Init(HALL_U_EXTINT_CH, stcExtIntInit); /* IRQ sign-in */ stcIrqSignConfig.enIntSrc HALL_U_INT_SRC; stcIrqSignConfig.enIRQn HALL_U_GLB_INT_IRQn; stcIrqSignConfig.pfnCallback EXTINT_HALL_U_Global_IrqCallback; (void)INTC_IrqSignIn(stcIrqSignConfig); /* NVIC config */ NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn); NVIC_SetPriority(stcIrqSignConfig.enIRQn, HALL_U_INT_PRIO); NVIC_EnableIRQ(stcIrqSignConfig.enIRQn); }void EXTINT_HALL_V_Global_IrqCallback(void) { uint8_t hall_u0, hall_v0, hall_w0; uint8_t hall_u_check0, hall_v_check0, hall_w_check0; uint8_t change0; for(volatile int i 0; i 100; i) ; // 约1-2μs根据频率调整 /* 读取当前霍尔引脚电平 */ hall_u (GPIO_ReadInputPins(HALL_U_PORT, HALL_U_PIN) PIN_SET) ? 1U : 0U; hall_v (GPIO_ReadInputPins(HALL_V_PORT, HALL_V_PIN) PIN_SET) ? 1U : 0U; hall_w (GPIO_ReadInputPins(HALL_W_PORT, HALL_W_PIN) PIN_SET) ? 1U : 0U; Hall_Value (uint8_t)((hall_u 2U) | (hall_v 1U) | hall_w); for(volatile int i 0; i 100; i) ; // 约1-2μs根据频率调整 hall_u_check (GPIO_ReadInputPins(HALL_U_PORT, HALL_U_PIN) PIN_SET) ? 1U : 0U; hall_v_check (GPIO_ReadInputPins(HALL_V_PORT, HALL_V_PIN) PIN_SET) ? 1U : 0U; hall_w_check (GPIO_ReadInputPins(HALL_W_PORT, HALL_W_PIN) PIN_SET) ? 1U : 0U; if((hall_u_check ! hall_u) ||(hall_v_check ! hall_v)||(hall_w_check ! hall_w)) { return; // 信号不稳定放弃本次中断 } if(g_Motor_Start_flag1 ) { if((Hall_Value0)(Hall_Value7)) if((Hall_Value0)(Hall_Value7)) { BLDC_PhaseChangeByHall(Hall_Value,500);//占空比50% } } EXTINT_ClearExtIntStatus(HALL_V_EXTINT_CH); } void HALL_V_Global_Init(void) { stc_extint_init_t stcExtIntInit; stc_irq_signin_config_t stcIrqSignConfig; stc_gpio_init_t stcGpioInit; /* GPIO config */ (void)GPIO_StructInit(stcGpioInit); stcGpioInit.u16ExtInt PIN_EXTINT_ON; stcGpioInit.u16PullUp PIN_PU_ON; (void)GPIO_Init(HALL_V_PORT, HALL_V_PIN, stcGpioInit); /* ExtInt config */ (void)EXTINT_StructInit(stcExtIntInit); stcExtIntInit.u32Filter EXTINT_FILTER_ON; stcExtIntInit.u32FilterClock EXTINT_FCLK_DIV64;//EXTINT_FCLK_DIV8; #if 1 stcExtIntInit.u32Edge EXTINT_TRIG_FALLING; #else stcExtIntInit.u32Edge EXTINT_TRIG_BOTH; #endif (void)EXTINT_Init(HALL_V_EXTINT_CH, stcExtIntInit); /* IRQ sign-in */ stcIrqSignConfig.enIntSrc HALL_V_INT_SRC; stcIrqSignConfig.enIRQn HALL_V_GLB_INT_IRQn; stcIrqSignConfig.pfnCallback EXTINT_HALL_V_Global_IrqCallback; (void)INTC_IrqSignIn(stcIrqSignConfig); /* NVIC config */ NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn); NVIC_SetPriority(stcIrqSignConfig.enIRQn, HALL_V_INT_PRIO); NVIC_EnableIRQ(stcIrqSignConfig.enIRQn); }static void EXTINT_HALL_W_Global_IrqCallback(void) { uint8_t hall_u0, hall_v0, hall_w0; uint8_t hall_u_check0, hall_v_check0, hall_w_check0; uint8_t change0; /* 读取当前霍尔引脚电平 */ hall_u (GPIO_ReadInputPins(HALL_U_PORT, HALL_U_PIN) PIN_SET) ? 1U : 0U; hall_v (GPIO_ReadInputPins(HALL_V_PORT, HALL_V_PIN) PIN_SET) ? 1U : 0U; hall_w (GPIO_ReadInputPins(HALL_W_PORT, HALL_W_PIN) PIN_SET) ? 1U : 0U; for(volatile int i 0; i 100; i) ; // 约1-2μs根据频率调整 hall_u_check (GPIO_ReadInputPins(HALL_U_PORT, HALL_U_PIN) PIN_SET) ? 1U : 0U; hall_v_check (GPIO_ReadInputPins(HALL_V_PORT, HALL_V_PIN) PIN_SET) ? 1U : 0U; hall_w_check (GPIO_ReadInputPins(HALL_W_PORT, HALL_W_PIN) PIN_SET) ? 1U : 0U; if((hall_u_check ! hall_u) ||(hall_v_check ! hall_v)||(hall_w_check ! hall_w)) { return; // 信号不稳定放弃本次中断 } Hall_Value (uint8_t)((hall_u 2U) | (hall_v 1U) | hall_w); if(g_Motor_Start_flag1 ) { if((Hall_Value0)(Hall_Value7)) if((Hall_Value0)(Hall_Value7)) { BLDC_PhaseChangeByHall(Hall_Value,500);//占空比50% } } EXTINT_ClearExtIntStatus(HALL_W_EXTINT_CH); } void HALL_W_Global_Init(void) { stc_extint_init_t stcExtIntInit; stc_irq_signin_config_t stcIrqSignConfig; stc_gpio_init_t stcGpioInit; /* GPIO config */ (void)GPIO_StructInit(stcGpioInit); stcGpioInit.u16ExtInt PIN_EXTINT_ON; stcGpioInit.u16PullUp PIN_PU_ON; (void)GPIO_Init(HALL_W_PORT, HALL_W_PIN, stcGpioInit); /* ExtInt config */ (void)EXTINT_StructInit(stcExtIntInit); stcExtIntInit.u32Filter EXTINT_FILTER_ON; stcExtIntInit.u32FilterClock EXTINT_FCLK_DIV64;//EXTINT_FCLK_DIV8; #if 1 stcExtIntInit.u32Edge EXTINT_TRIG_FALLING; #else stcExtIntInit.u32Edge EXTINT_TRIG_BOTH; #endif (void)EXTINT_Init(HALL_W_EXTINT_CH, stcExtIntInit); /* IRQ sign-in */ stcIrqSignConfig.enIntSrc HALL_W_INT_SRC; stcIrqSignConfig.enIRQn HALL_W_GLB_INT_IRQn; stcIrqSignConfig.pfnCallback EXTINT_HALL_W_Global_IrqCallback; (void)INTC_IrqSignIn(stcIrqSignConfig); /* NVIC config */ NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn); NVIC_SetPriority(stcIrqSignConfig.enIRQn, HALL_W_INT_PRIO); NVIC_EnableIRQ(stcIrqSignConfig.enIRQn); }定时器/* 下桥臂 PWM 引脚 (TMR6 通道 B) */ #define PWM_LU_PORT GPIO_PORT_B /* U 相下桥端口PB13 */ #define PWM_LU_PIN GPIO_PIN_13 /* U 相下桥引脚 */ #define PWM_LV_PORT GPIO_PORT_B /* V 相下桥端口PB14 */ #define PWM_LV_PIN GPIO_PIN_14 /* V 相下桥引脚 */ #define PWM_LW_PORT GPIO_PORT_B /* W 相下桥端口PB15 */ #define PWM_LW_PIN GPIO_PIN_15 /* W 相下桥引脚 */ #define BLDC_TMR6_UNIT_U CM_TMR6_1 /* U 相 TMR6 单元 */ #define BLDC_TMR6_UNIT_V CM_TMR6_2 /* V 相 TMR6 单元 */ #define BLDC_TMR6_UNIT_W CM_TMR6_3 /* W 相 TMR6 单元 */ #define BLDC_TMR6_CH_UH TMR6_CH_A /* U 相上桥通道 */ #define BLDC_TMR6_CH_VH TMR6_CH_A /* V 相上桥通道 */ #define BLDC_TMR6_CH_WH TMR6_CH_A /* W 相上桥通道 */ #define BLDC_TMR6_CH_UL TMR6_CH_B /* U 相下桥通道 */ #define BLDC_TMR6_CH_VL TMR6_CH_B /* V 相下桥通道 */ #define BLDC_TMR6_CH_WL TMR6_CH_B /* W 相下桥通道 */void BSP_TMR6_Init(void ) { LL_PERIPH_WE(LL_PERIPH_GPIO | LL_PERIPH_FCG | LL_PERIPH_PWC_CLK_RMU); GPIO_Config(); TMR6_ConfigBLDC(); TMR6_NVIC_Config(); g_overflow_flag 0; } void GPIO_Config(void) { stc_gpio_init_t gpio_cfg; gpio_cfg.u16PinState PIN_STAT_RST; /* 初始低电平 */ gpio_cfg.u16PinDir PIN_DIR_OUT; /* 输出模式 */ gpio_cfg.u16PinOutputType PIN_OUT_TYPE_CMOS; /* CMOS 输出 */ gpio_cfg.u16PinDrv PIN_HIGH_DRV; /* 高驱动能力 */ gpio_cfg.u16Latch PIN_LATCH_OFF; /* 不锁存 */ gpio_cfg.u16PullUp PIN_PU_OFF; /* 不上拉 */ gpio_cfg.u16Invert PIN_INVT_OFF; /* 不反转 */ gpio_cfg.u16ExtInt PIN_EXTINT_OFF; /* 无外部中断 */ gpio_cfg.u16PinAttr PIN_ATTR_DIGITAL; /* 数字功能 */ /* 上桥臂 PA8/9/10 */ GPIO_SetFunc(PWM_HU_PORT, PWM_HU_PIN, GPIO_FUNC_3); GPIO_Init(PWM_HU_PORT, PWM_HU_PIN, gpio_cfg); GPIO_SetFunc(PWM_HV_PORT, PWM_HV_PIN, GPIO_FUNC_3); GPIO_Init(PWM_HV_PORT, PWM_HV_PIN, gpio_cfg); GPIO_SetFunc(PWM_HW_PORT, PWM_HW_PIN, GPIO_FUNC_3); GPIO_Init(PWM_HW_PORT, PWM_HW_PIN, gpio_cfg); /* 下桥臂 PB13/14/15 */ GPIO_SetFunc(PWM_LU_PORT, PWM_LU_PIN, GPIO_FUNC_3); GPIO_Init(PWM_LU_PORT, PWM_LU_PIN, gpio_cfg); GPIO_SetFunc(PWM_LV_PORT, PWM_LV_PIN, GPIO_FUNC_3); GPIO_Init(PWM_LV_PORT, PWM_LV_PIN, gpio_cfg); GPIO_SetFunc(PWM_LW_PORT, PWM_LW_PIN, GPIO_FUNC_3); GPIO_Init(PWM_LW_PORT, PWM_LW_PIN, gpio_cfg); } void TMR6_ConfigBLDC(void) { stc_tmr6_init_t init; stc_tmr6_pwm_init_t pwm_init; uint32_t period; /* 使能三个单元时钟 */ FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR6_1, ENABLE); FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR6_2, ENABLE); FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR6_3, ENABLE); period SystemCoreClock / 20000U; /* 锯齿波200MHz / 20kHz 10000 */ TMR6_StructInit(init); init.u8CountSrc TMR6_CNT_SRC_SW; init.sw_count.u32CountMode TMR6_MD_SAWTOOTH; init.sw_count.u32CountDir TMR6_CNT_UP; init.sw_count.u32ClockDiv TMR6_CLK_DIV1; init.u32PeriodValue period; /* 配置三个单元 */ TMR6_Init(BLDC_TMR6_UNIT_U, init); TMR6_Init(BLDC_TMR6_UNIT_V, init); TMR6_Init(BLDC_TMR6_UNIT_W, init); /* 配置上桥: 高有效PWM */ TMR6_PWM_StructInit(pwm_init); pwm_init.u32StartPolarity TMR6_PWM_LOW; /* 周期开始输出低 */ pwm_init.u32StopPolarity TMR6_PWM_LOW; /* 周期结束输出低 */ pwm_init.u32CompareMatchPolarity TMR6_PWM_HIGH; /* 比较匹配时翻转为高 */ pwm_init.u32PeriodMatchPolarity TMR6_PWM_LOW; /* 周期匹配时翻转为低 */ pwm_init.u32StartStopHold TMR6_PWM_START_STOP_CHANGE; pwm_init.u32CompareValue period; /* 初始占空比 0% (见注释1) */ /* 三个单元的上桥通道 */ TMR6_PWM_Init(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UH, pwm_init); TMR6_PWM_Init(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VH, pwm_init); TMR6_PWM_Init(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WH, pwm_init); /* 配置下桥: 常通 (低有效) */ /* 重新初始化结构体避免残留上桥配置 */ TMR6_PWM_StructInit(pwm_init); pwm_init.u32StartPolarity TMR6_PWM_HIGH; /* 周期开始输出高 */ pwm_init.u32StopPolarity TMR6_PWM_LOW; /* 周期结束输出低 */ pwm_init.u32CompareMatchPolarity TMR6_PWM_HIGH; /* 比较匹配输出高 (永不匹配) */ pwm_init.u32PeriodMatchPolarity TMR6_PWM_HIGH; /* 周期匹配输出高 */ pwm_init.u32StartStopHold TMR6_PWM_START_STOP_CHANGE; pwm_init.u32CompareValue period 1; /* 大于period永不匹配 常高 (见注释2) */ /* 三个单元的下桥通道 */ TMR6_PWM_Init(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UL, pwm_init); TMR6_PWM_Init(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VL, pwm_init); TMR6_PWM_Init(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WL, pwm_init); /* 设置引脚功能为比较输出 */ TMR6_SetFunc(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UH, TMR6_PIN_CMP_OUTPUT); TMR6_SetFunc(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UL, TMR6_PIN_CMP_OUTPUT); TMR6_SetFunc(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VH, TMR6_PIN_CMP_OUTPUT); TMR6_SetFunc(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VL, TMR6_PIN_CMP_OUTPUT); TMR6_SetFunc(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WH, TMR6_PIN_CMP_OUTPUT); TMR6_SetFunc(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WL, TMR6_PIN_CMP_OUTPUT); /* 初始化所有输出禁能 */ TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UL, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VL, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WL, DISABLE); /* 使能溢出中断供算法同步 */ TMR6_IntCmd(BLDC_TMR6_UNIT_U, TMR6_INT_OVF, ENABLE); } void TMR6_NVIC_Config(void) { stc_irq_signin_config_t irq_cfg; irq_cfg.enIntSrc INT_SRC_TMR6_1_OVF; /* 使用 TMR6_1 溢出中断 */ irq_cfg.enIRQn INT003_IRQn; irq_cfg.pfnCallback BSP_TMR6_OverflowIrqCallback; INTC_IrqSignIn(irq_cfg); NVIC_ClearPendingIRQ(irq_cfg.enIRQn); NVIC_SetPriority(irq_cfg.enIRQn, DDL_IRQ_PRIO_01); NVIC_EnableIRQ(irq_cfg.enIRQn); TMR6_IntCmd(BLDC_TMR6_UNIT_U, TMR6_INT_OVF, ENABLE); }void BSP_TMR6_OverflowIrqCallback(void) { g_overflow_flag 1; /* 置位溢出标志主循环检测后可用于急刹车 */ } void BSP_TMR6_Start(void) { TMR6_SWSyncStart(TMR6_SW_SYNC_U1 | TMR6_SW_SYNC_U2 | TMR6_SW_SYNC_U3); } #define BLDC_TIM_PWM_FREQ 20000 // PWM频率 // 定义定时器预分频定时器实际时钟频率为72MHz/BLDC_TIMx_PRESCALER1 #define BLDC_TIM_PRESCALER 0 // 实际时钟频率为72MHz // 定义定时器周期当定时器开始计数到BLDC_TIMx_PERIOD值并且重复计数寄存器为0时更新定时器并生成对应事件和中断 #define BLDC_TIM_PERIOD (uint16_t)(SystemCoreClock/(BLDC_TIM_PRESCALER1)/BLDC_TIM_PWM_FREQ) void BLDC_PhaseChangeByHall(uint8_t hall_state,uint16_t speed_duty) { uint32_t duty_cmp; duty_cmpBLDC_TIM_PERIOD*speed_duty/1000; /* 3. 根据新步骤使能对应上桥与下桥 */ switch (hall_state) { case 4: /* V W- */ TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UL, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VL, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WL, DISABLE); TMR6_SetCompareValue(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VH, duty_cmp); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VH, ENABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WL, ENABLE); break; case 5: /* V U- */ TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UL, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VL, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WL, DISABLE); TMR6_SetCompareValue(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VH, duty_cmp); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VH, ENABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UL, ENABLE); break; case 1: /* W U- */ TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UL, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VL, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WL, DISABLE); TMR6_SetCompareValue(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WH, duty_cmp); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WH, ENABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UL, ENABLE); break; case 3: /* W V- */ TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UL, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VL, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WL, DISABLE); TMR6_SetCompareValue(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WH, duty_cmp); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WH, ENABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VL, ENABLE); break; case 2: /* U V- */ TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UL, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VL, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WL, DISABLE); TMR6_SetCompareValue(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UH, duty_cmp); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UH, ENABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VL, ENABLE); break; case 6: /* U W- */ TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UL, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VL, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WL, DISABLE); TMR6_SetCompareValue(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UH, duty_cmp); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UH, ENABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WL, ENABLE); break; default: /* 错误步骤全部关闭 */ /* 1. 关闭所有上桥和下桥输出 */ TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_U, BLDC_TMR6_CH_UL, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_V, BLDC_TMR6_CH_VL, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WH, DISABLE); TMR6_PWM_OutputCmd(BLDC_TMR6_UNIT_W, BLDC_TMR6_CH_WL, DISABLE); break; } }实验结果电机转动正常。