| @@ -1468,8 +1468,7 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) | |||||
| { | { | ||||
| // TIM2中断:负责段切换逻辑 | // TIM2中断:负责段切换逻辑 | ||||
| if(htim->Instance == TIM2) | if(htim->Instance == TIM2) | ||||
| { | |||||
| { | |||||
| // 立即停止PWM输出,防止多发脉冲 | // 立即停止PWM输出,防止多发脉冲 | ||||
| PLSR_PWM_Stop(); | PLSR_PWM_Stop(); | ||||
| // 精确累加当前段已发送的脉冲数 | // 精确累加当前段已发送的脉冲数 | ||||
| @@ -1477,8 +1476,12 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) | |||||
| AllPluse += current_section_pulses; | AllPluse += current_section_pulses; | ||||
| g_plsr_route.pulse_count = AllPluse; | g_plsr_route.pulse_count = AllPluse; | ||||
| PLSR_UpdateGlobalPulseCount(AllPluse); | PLSR_UpdateGlobalPulseCount(AllPluse); | ||||
| // 当前段脉冲发送完毕,进入等待状态 | |||||
| g_plsr_route.run_state = PLSR_STATE_WAIT; | |||||
| /*如果当前段不是最后一段且,等待条件为脉冲发送完成*/ | |||||
| if(g_plsr_route.current_section_num < g_plsr_route.section_num | |||||
| && g_plsr_route.section[g_plsr_route.current_section_num - 1].wait_condition.wait_type == PLSR_WAIT_PLUSEEND) | |||||
| { | |||||
| // 当前段脉冲发送完毕,进入等待状态 | |||||
| g_plsr_route.run_state = PLSR_STATE_WAIT; | |||||
| // 检查等待条件是否满足 | // 检查等待条件是否满足 | ||||
| if (PLSR_Section_CheckWaitCondition(&g_plsr_route)) | if (PLSR_Section_CheckWaitCondition(&g_plsr_route)) | ||||
| @@ -1486,14 +1489,6 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) | |||||
| // 等待条件满足,切换到下一段 | // 等待条件满足,切换到下一段 | ||||
| PLSR_SectionConfig_t* current_section = &g_plsr_route.section[g_plsr_route.current_section_num - 1]; | PLSR_SectionConfig_t* current_section = &g_plsr_route.section[g_plsr_route.current_section_num - 1]; | ||||
| if (current_section->next_section == 0 && g_plsr_route.current_section_num >= g_plsr_route.section_num) | |||||
| { | |||||
| // 当前段是最后一段或跳转段为0,路径结束 | |||||
| PLSR_Route_Stop(&g_plsr_route); | |||||
| return; | |||||
| } | |||||
| else if (current_section->next_section <= g_plsr_route.section_num) | |||||
| { | |||||
| // 更新prevPulseCount为当前段的累计脉冲数 | // 更新prevPulseCount为当前段的累计脉冲数 | ||||
| if (g_plsr_route.mode == PLSR_MODE_RELATIVE) | if (g_plsr_route.mode == PLSR_MODE_RELATIVE) | ||||
| { | { | ||||
| @@ -1560,14 +1555,131 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) | |||||
| PLSR_Route_Stop(&g_plsr_route); | PLSR_Route_Stop(&g_plsr_route); | ||||
| return; | return; | ||||
| } | } | ||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| if(g_plsr_route.run_state == PLSR_STATE_ACCEL) | |||||
| { | |||||
| // 加速阶段完成,清零加速脉冲计数 | |||||
| g_plsr_route.accel_pulse_count = 0; | |||||
| // 判断下一阶段:优先匀速,如果匀速脉冲数为0则直接进入减速 | |||||
| if(g_plsr_route.const_pulse_count > 0) | |||||
| { | |||||
| // 进入匀速阶段 | |||||
| g_plsr_route.run_state = PLSR_STATE_CONST; | |||||
| __HAL_TIM_SetAutoreload(&htim2, g_plsr_route.const_pulse_count); | |||||
| __HAL_TIM_SET_COUNTER(&htim2, 0); | |||||
| PLSR_PWM_Start(); | |||||
| } | |||||
| else if(g_plsr_route.decel_pulse_count > 0) | |||||
| { | |||||
| // 无匀速阶段,直接进入减速 | |||||
| g_plsr_route.run_state = PLSR_STATE_DECEL; | |||||
| __HAL_TIM_SetAutoreload(&htim2, g_plsr_route.decel_pulse_count); | |||||
| __HAL_TIM_SET_COUNTER(&htim2, 0); | |||||
| PLSR_PWM_Start(); | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| // 没有下一段,停止路径 | |||||
| // 加速完成且无后续阶段,路径结束 | |||||
| PLSR_Route_Stop(&g_plsr_route); | PLSR_Route_Stop(&g_plsr_route); | ||||
| return; | return; | ||||
| } | } | ||||
| } | } | ||||
| else if(g_plsr_route.run_state == PLSR_STATE_CONST) | |||||
| { | |||||
| // 匀速阶段完成,清零匀速脉冲计数 | |||||
| g_plsr_route.const_pulse_count = 0; | |||||
| // 进入减速阶段 | |||||
| if(g_plsr_route.decel_pulse_count > 0) | |||||
| { | |||||
| g_plsr_route.run_state = PLSR_STATE_DECEL; | |||||
| __HAL_TIM_SetAutoreload(&htim2, g_plsr_route.decel_pulse_count); | |||||
| __HAL_TIM_SET_COUNTER(&htim2, 0); | |||||
| PLSR_PWM_Start(); | |||||
| } | |||||
| else | |||||
| { | |||||
| // 匀速完成且无减速阶段,路径结束 | |||||
| PLSR_Route_Stop(&g_plsr_route); | |||||
| return; | |||||
| } | |||||
| } | |||||
| else if(g_plsr_route.run_state == PLSR_STATE_DECEL) | |||||
| { | |||||
| if(g_plsr_route.current_section_num == g_plsr_route.section_num) | |||||
| { | |||||
| // 减速阶段完成,清零减速脉冲计数 | |||||
| g_plsr_route.decel_pulse_count = 0; | |||||
| // 减速完成,路径结束 | |||||
| PLSR_Route_Stop(&g_plsr_route); | |||||
| return; | |||||
| } | |||||
| else | |||||
| { | |||||
| // 减速阶段完成,清零减速脉冲计数 | |||||
| g_plsr_route.decel_pulse_count = 0; | |||||
| // 进入等待状态,等待下一段开始 | |||||
| g_plsr_route.run_state = PLSR_STATE_WAIT; | |||||
| // 检查等待条件是否满足 | |||||
| if (PLSR_Section_CheckWaitCondition(&g_plsr_route)) | |||||
| { | |||||
| // 等待条件满足,切换到下一段 | |||||
| PLSR_SectionConfig_t* current_section = &g_plsr_route.section[g_plsr_route.current_section_num - 1]; | |||||
| if (current_section->next_section == 0 && g_plsr_route.current_section_num >= g_plsr_route.section_num) | |||||
| { | |||||
| // 当前段是最后一段同时跳转段为0,路径结束 | |||||
| PLSR_Route_Stop(&g_plsr_route); | |||||
| return; | |||||
| } | |||||
| // 检查是否有下一段可执行 | |||||
| if (g_plsr_route.current_section_num < g_plsr_route.section_num) | |||||
| { | |||||
| // 更新prevPulseCount为当前段的累计脉冲数 | |||||
| if (g_plsr_route.mode == PLSR_MODE_RELATIVE) | |||||
| { | |||||
| g_plsr_route.prevPulseCount = g_plsr_route.pulse_count; | |||||
| } | |||||
| // 切换到下一段 | |||||
| PLSR_SectionConfig_t* next_section = &g_plsr_route.section[g_plsr_route.current_section_num]; | |||||
| g_plsr_route.current_section_num++; | |||||
| g_plsr_route.current_freq = next_section->target_freq; // 更新当前频率 | |||||
| // 启动新段 | |||||
| PLSR_Section_StartNewSection(&g_plsr_route); | |||||
| // 计算新段需要发送的脉冲数 | |||||
| uint32_t next_pulse_target = next_section->target_pulse; | |||||
| if (next_pulse_target > 0 && next_pulse_target <= 0xFFFFFFFF) | |||||
| { | |||||
| __HAL_TIM_SetAutoreload(&htim2, next_pulse_target); | |||||
| __HAL_TIM_SET_COUNTER(&htim2, 0); | |||||
| PLSR_PWM_Start(); | |||||
| } | |||||
| else | |||||
| { | |||||
| // 脉冲数异常,停止路径 | |||||
| PLSR_Route_Stop(&g_plsr_route); | |||||
| return; | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| // 没有下一段,路径结束 | |||||
| PLSR_Route_Stop(&g_plsr_route); | |||||
| return; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | } | ||||
| // TIM6中断:负责加减速过程的频率更新、等待时间计时和实时脉冲计数更新 | // TIM6中断:负责加减速过程的频率更新、等待时间计时和实时脉冲计数更新 | ||||
| if(htim->Instance == TIM6) | if(htim->Instance == TIM6) | ||||