| @@ -961,7 +961,7 @@ static void PLSR_UpdateGlobalPulseCount(int32_t current_pulse_count) | |||||
| s_last_total_pulse = current_pulse_count; | s_last_total_pulse = current_pulse_count; | ||||
| } | } | ||||
| // 将32位全局累加脉冲计数分解为两个16位寄存器(支持负数) | // 将32位全局累加脉冲计数分解为两个16位寄存器(支持负数) | ||||
| int32_t signed_count = g_plsr_location; // 使用有符号数进行计算 | |||||
| int32_t signed_count = g_plsr_total_pulse_count; // 使用有符号数进行计算 | |||||
| ModbusSlave.holding_regs[0x1000] = signed_count & 0xFFFF; // 低16位 | ModbusSlave.holding_regs[0x1000] = signed_count & 0xFFFF; // 低16位 | ||||
| ModbusSlave.holding_regs[0x1001] = (signed_count >> 16) & 0xFFFF; // 高16位 | ModbusSlave.holding_regs[0x1001] = (signed_count >> 16) & 0xFFFF; // 高16位 | ||||
| } | } | ||||
| @@ -1371,12 +1371,12 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) | |||||
| else | else | ||||
| { | { | ||||
| // 无法找到有效的运动规划,保持当前频率 | // 无法找到有效的运动规划,保持当前频率 | ||||
| part1_state = PLSR_STATE_CONST; | |||||
| part1_state = PLSR_STATE_DECEL; | |||||
| part1_pulse_num = total_pulses; | part1_pulse_num = total_pulses; | ||||
| part1_time = (total_pulses * 1000) / v0; | part1_time = (total_pulses * 1000) / v0; | ||||
| part3_pulse_num = 0; | part3_pulse_num = 0; | ||||
| part3_time = 0; | part3_time = 0; | ||||
| vt = v0; // 实际目标频率等于起始频率 | |||||
| vt = 0; // 实际目标频率等于起始频率 | |||||
| } | } | ||||
| } | } | ||||
| @@ -1560,7 +1560,14 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) | |||||
| // TIM2中断:负责段切换逻辑 | // TIM2中断:负责段切换逻辑 | ||||
| if(htim->Instance == TIM2) | if(htim->Instance == TIM2) | ||||
| { | { | ||||
| PLSR_Section_PWM_Stop(); | |||||
| if(g_plsr_route.current_section_num >= g_plsr_route.section_num && | |||||
| g_plsr_route.current_part != PLSR_PART_1 && | |||||
| g_plsr_route.run_state == PLSR_STATE_DECEL) | |||||
| { | |||||
| PLSR_Route_PWM_Stop(); | |||||
| } | |||||
| else PLSR_Section_PWM_Stop(); | |||||
| // 精确累加当前段已发送的脉冲数 | // 精确累加当前段已发送的脉冲数 | ||||
| int32_t current_section_pulses = __HAL_TIM_GetAutoreload(&htim2); | int32_t current_section_pulses = __HAL_TIM_GetAutoreload(&htim2); | ||||
| AllPluse += current_section_pulses; | AllPluse += current_section_pulses; | ||||
| @@ -2026,11 +2033,11 @@ void PLSR_Section_StartNewSection(PLSR_RouteConfig_t* route) | |||||
| // 目标频率被修改,重新计算实际脉冲数 | // 目标频率被修改,重新计算实际脉冲数 | ||||
| if(current_section->target_pulse > 0) | if(current_section->target_pulse > 0) | ||||
| { | { | ||||
| current_section->actual_pulse = (current_section->target_pulse - route->accel_pulse_count - __HAL_TIM_GET_COUNTER(&htim2)); | |||||
| current_section->actual_pulse = (current_section->target_pulse - route->accel_pulse_count - __HAL_TIM_GET_COUNTER(&htim2) + 1); | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| current_section->actual_pulse = ((-current_section->target_pulse) - route->accel_pulse_count - __HAL_TIM_GET_COUNTER(&htim2)); | |||||
| current_section->actual_pulse = ((-current_section->target_pulse) - route->accel_pulse_count - __HAL_TIM_GET_COUNTER(&htim2) + 1); | |||||
| } | } | ||||
| } | } | ||||
| else if(route->current_part == PLSR_PART_1)//加速过程被修改 | else if(route->current_part == PLSR_PART_1)//加速过程被修改 | ||||
| @@ -2038,11 +2045,11 @@ void PLSR_Section_StartNewSection(PLSR_RouteConfig_t* route) | |||||
| // 目标频率被修改,重新计算实际脉冲数 | // 目标频率被修改,重新计算实际脉冲数 | ||||
| if(current_section->target_pulse > 0) | if(current_section->target_pulse > 0) | ||||
| { | { | ||||
| current_section->actual_pulse = (current_section->target_pulse - __HAL_TIM_GET_COUNTER(&htim2)); | |||||
| current_section->actual_pulse = (current_section->target_pulse - __HAL_TIM_GET_COUNTER(&htim2) + 1); | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| current_section->actual_pulse = ((-current_section->target_pulse) - __HAL_TIM_GET_COUNTER(&htim2)); | |||||
| current_section->actual_pulse = ((-current_section->target_pulse) - __HAL_TIM_GET_COUNTER(&htim2) + 1); | |||||
| } | } | ||||
| } | } | ||||
| else if(route->current_part == PLSR_PART_3)//减速过程被修改 | else if(route->current_part == PLSR_PART_3)//减速过程被修改 | ||||
| @@ -2051,12 +2058,12 @@ void PLSR_Section_StartNewSection(PLSR_RouteConfig_t* route) | |||||
| if(current_section->target_pulse > 0) | if(current_section->target_pulse > 0) | ||||
| { | { | ||||
| current_section->actual_pulse = (current_section->target_pulse - | current_section->actual_pulse = (current_section->target_pulse - | ||||
| route->accel_pulse_count - route->const_pulse_count - __HAL_TIM_GET_COUNTER(&htim2)); | |||||
| route->accel_pulse_count - route->const_pulse_count - __HAL_TIM_GET_COUNTER(&htim2) + 1); | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| current_section->actual_pulse = ((-current_section->target_pulse) - | current_section->actual_pulse = ((-current_section->target_pulse) - | ||||
| route->accel_pulse_count - route->const_pulse_count - __HAL_TIM_GET_COUNTER(&htim2)); | |||||
| route->accel_pulse_count - route->const_pulse_count - __HAL_TIM_GET_COUNTER(&htim2) + 1); | |||||
| } | } | ||||
| } | } | ||||
| g_plsr_mod_flag = 0; // 清除修改标记 | g_plsr_mod_flag = 0; // 清除修改标记 | ||||
| @@ -2400,13 +2407,8 @@ void PLSR_Section_SwitchNext(PLSR_RouteConfig_t* route, uint8_t is_pulse_complet | |||||
| // 清除新段的外部事件标志,确保每段都是干净的状态 | // 清除新段的外部事件标志,确保每段都是干净的状态 | ||||
| PLSR_ClearExtEvent(route); | PLSR_ClearExtEvent(route); | ||||
| route->initial_freq = route->current_freq; | |||||
| // 根据切换原因更新当前频率 | |||||
| if (is_pulse_complete) | |||||
| { | |||||
| // 脉冲完成触发:更新为上一段的目标频率 | |||||
| route->current_freq = current_section->target_freq; | |||||
| } | |||||
| // 外部事件触发时保持当前频率不变,确保频率连续性 | // 外部事件触发时保持当前频率不变,确保频率连续性 | ||||
| } | } | ||||