/** * main.c — 无感方波 BLDC 主程序 * * 系统架构: * 主循环: 状态机调度 + 速度环/位置环 + 保护监测 * TIM1_UP_IRQ (20kHz): ADC读取 + 过零检测 + 电流环 + 换相 * TIM2_IRQ: 输入捕获 (换相间隔测量) * * 启动流程: * 上电 → HW_Init → FSM_Init → 等待 FSM_Start() * → ALIGN(500ms) → ACCEL(开环加速) → RUN(闭环) */ #include "bldc_hw.h" #include "bldc_comm.h" #include "bldc_bemf.h" #include "bldc_pid.h" #include "bldc_fsm.h" /* ==================== 全局变量 (本模块) ==================== */ static volatile uint32_t g_fault_led_counter = 0; static volatile uint8_t g_fault_led_state = 0; /* ==================== 系统时钟 (CMSIS 实现) ==================== */ /* SystemCoreClock 由 system_stm32f10x.c 定义, 此处明确设置 */ extern uint32_t SystemCoreClock; /* ==================== 函数前置声明 ==================== */ static void FaultLED_Update(void); static void DelayMs(volatile uint32_t ms); extern void HW_Init(void); /* ==================== main ==================== */ int main(void) { /* 系统初始化 */ HW_Init(); /* 状态机初始化 */ FSM_Init(); /* 等待外部启动信号 (可通过串口指令启动) */ /* 默认自动启动 (调试用) */ FSM_Start(); /* 主循环 */ while (1) { /* 状态机主循环调度 */ FSM_Loop(); /* 故障指示灯更新 (50ms 间隔近似) */ FaultLED_Update(); /* 简单延时 (约 1ms, 防止主循环空转太快) */ for (volatile uint32_t i = 0; i < 5000; i++); } } /* ==================== TIM1 更新中断 (20kHz) ==================== */ /* * 最高优先级中断, 每个 PWM 周期执行一次 * 执行时间必须 < 15μs * 所有关键实时控制在此完成 */ void TIM1_UP_IRQHandler(void) { if (TIM1->SR & TIM_SR_UIF) { TIM1->SR = ~TIM_SR_UIF; /* 清除中断标志 */ /* PWM 中断处理 (FSM 集成) */ FSM_PwmIsr(); } /* 处理 TIM1 刹车中断 (BKIN 触发时) */ if (TIM1->SR & TIM_SR_BIF) { TIM1->SR = ~TIM_SR_BIF; /* BKIN 刹车已自动由硬件完成 (MOE=0) */ /* 软件侧: 进入故障状态 */ if (g_state != FSM_FAULT) { g_fault = FAULT_OC_HARDWARE; g_state = FSM_FAULT; } } } /* ==================== TIM2 捕获中断 (换相间隔测量) ==================== */ /* * 每次换相信号(由外部换相脚输入或软件触发)产生输入捕获 * 用于测量换相间隔, 计算转速 */ void TIM2_IRQHandler(void) { if (TIM2->SR & TIM_SR_CC1IF) { TIM2->SR = ~TIM_SR_CC1IF; /* 读取捕获值 */ uint16_t capture = TIM2->CCR1; (void)capture; /* 可用于验证换相间隔 */ /* 主中断 FSM_PwmIsr 已处理换相间隔计算 */ /* TIM2 捕获用于辅助监控 */ } } /* ==================== 故障指示灯 ==================== */ /* * PC13: 低电平点亮 * 正常: 常亮 (LED 负极接 VCC 则常灭) * 故障: 500ms 闪烁 */ static void FaultLED_Update(void) { g_fault_led_counter++; if (g_state == FSM_FAULT) { /* 故障: 500ms 闪烁 (25000 ticks × 1ms ≈ 25s... 太慢, 修正) */ /* 实际: 用简单的 100ms 间隔 */ if ((g_fault_led_counter & 0x1FF) == 0) { /* 约 500ms */ GPIOC->ODR ^= GPIO_ODR_ODR13; } } else { /* 正常: 常亮 (或常灭, 根据硬件极性) */ GPIOC->ODR &= ~GPIO_ODR_ODR13; /* PC13 = 0 → 亮 (板载 LED) */ } } /* ==================== 简易延时 ==================== */ /* 粗略毫秒延时 (72MHz, 约 1ms) */ static void DelayMs(volatile uint32_t ms) { while (ms--) { for (volatile uint32_t i = 0; i < 6000; i++); } } /* ==================== 默认中断处理 ==================== */ void HardFault_Handler(void) { /* 硬件错误: 关所有输出, 死循环 */ COMM_Brake(); g_fault = FAULT_OC_HARDWARE; g_state = FSM_FAULT; while (1); } void NMI_Handler(void) { while (1); } void MemManage_Handler(void) { while (1); } void BusFault_Handler(void) { while (1); } void UsageFault_Handler(void) { while (1); } void SVC_Handler(void) {} void DebugMon_Handler(void) {} void PendSV_Handler(void) {} void SysTick_Handler(void) {}