| @@ -671,8 +671,8 @@ void PLSR_PWM_Start(void) | |||||
| switch(g_plsr_route.output_port) | switch(g_plsr_route.output_port) | ||||
| { | { | ||||
| case 0: // TIM10 | case 0: // TIM10 | ||||
| //__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2); // 设置占空比为50% | |||||
| HAL_TIM_PWM_Start(&htim10, TIM_CHANNEL_1); | |||||
| __HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2); // 设置占空比为50% | |||||
| //HAL_TIM_PWM_Start(&htim10, TIM_CHANNEL_1); | |||||
| break; | break; | ||||
| case 1: // TIM11 | case 1: // TIM11 | ||||
| @@ -715,27 +715,27 @@ void PLSR_PWM_Stop(void) | |||||
| switch(g_plsr_route.output_port) | switch(g_plsr_route.output_port) | ||||
| { | { | ||||
| case 0: // TIM10 | case 0: // TIM10 | ||||
| //__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); // | |||||
| HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1); | |||||
| __HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); // | |||||
| //HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1); | |||||
| break; | break; | ||||
| case 1: // TIM11 | case 1: // TIM11 | ||||
| __HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); // | |||||
| __HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); // | |||||
| //HAL_TIM_PWM_Stop(&htim11, TIM_CHANNEL_1); | //HAL_TIM_PWM_Stop(&htim11, TIM_CHANNEL_1); | ||||
| break; | break; | ||||
| case 2: // TIM13 | case 2: // TIM13 | ||||
| __HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); // | |||||
| __HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); // | |||||
| //HAL_TIM_PWM_Stop(&htim13, TIM_CHANNEL_1); | //HAL_TIM_PWM_Stop(&htim13, TIM_CHANNEL_1); | ||||
| break; | break; | ||||
| case 3: // TIM14 | case 3: // TIM14 | ||||
| __HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); // | |||||
| __HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); // | |||||
| //HAL_TIM_PWM_Stop(&htim14, TIM_CHANNEL_1); | //HAL_TIM_PWM_Stop(&htim14, TIM_CHANNEL_1); | ||||
| break; | break; | ||||
| default: // 默认使用TIM10 | default: // 默认使用TIM10 | ||||
| __HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); // | |||||
| __HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); // | |||||
| //HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1); | //HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1); | ||||
| break; | break; | ||||
| } | } | ||||
| @@ -1148,6 +1148,7 @@ void Calculate_PluseNum_Simplified(PLSR_RouteConfig_t *route) | |||||
| // if(route->accel_pulse_count > 1) route->accel_pulse_count -= 1; | // if(route->accel_pulse_count > 1) route->accel_pulse_count -= 1; | ||||
| } | } | ||||
| } | } | ||||
| void Calculate_PluseNum(PLSR_RouteConfig_t *route) | void Calculate_PluseNum(PLSR_RouteConfig_t *route) | ||||
| { | { | ||||
| int32_t part1_pulse_num = 0; // 第一部分脉冲数 | int32_t part1_pulse_num = 0; // 第一部分脉冲数 | ||||
| @@ -1303,16 +1304,53 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) | |||||
| part3_time = 0; | part3_time = 0; | ||||
| } | } | ||||
| // 确保总脉冲数不超过限制 | |||||
| // 确保总脉冲数完全匹配 | |||||
| int32_t calculated_total = part1_pulse_num + part3_pulse_num; | int32_t calculated_total = part1_pulse_num + part3_pulse_num; | ||||
| if (calculated_total > total_pulses) | |||||
| if (calculated_total != total_pulses) | |||||
| { | { | ||||
| // 按比例调整 | |||||
| if (part1_pulse_num > 0) { | |||||
| part1_pulse_num = (part1_pulse_num * total_pulses) / calculated_total; | |||||
| if (calculated_total > total_pulses) | |||||
| { | |||||
| // 脉冲数超出限制,按比例缩减 | |||||
| if (part1_pulse_num > 0 && part3_pulse_num > 0) { | |||||
| // 两个阶段都有脉冲,按比例分配 | |||||
| part1_pulse_num = (part1_pulse_num * total_pulses) / calculated_total; | |||||
| part3_pulse_num = total_pulses - part1_pulse_num; | |||||
| } else if (part1_pulse_num > 0) { | |||||
| // 只有第一阶段有脉冲 | |||||
| part1_pulse_num = total_pulses; | |||||
| } else if (part3_pulse_num > 0) { | |||||
| // 只有第三阶段有脉冲 | |||||
| part3_pulse_num = total_pulses; | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| // 脉冲数不足,将剩余脉冲分配给匀速阶段 | |||||
| int32_t remaining_pulses = total_pulses - calculated_total; | |||||
| // 将剩余脉冲分配给第二阶段(匀速阶段) | |||||
| // 这样既不影响加减速的数学精确性,又能充分利用所有脉冲 | |||||
| part2_pulse_num = remaining_pulses; | |||||
| // 计算匀速阶段的时间 | |||||
| if (vt > 0 && part2_pulse_num > 0) { | |||||
| part2_time = (part2_pulse_num * 1000) / vt; | |||||
| } | |||||
| // 更新第二阶段状态为匀速 | |||||
| part2_state = PLSR_STATE_CONST; | |||||
| } | } | ||||
| if (part3_pulse_num > 0) { | |||||
| part3_pulse_num = total_pulses - part1_pulse_num; | |||||
| // 最终验证:确保总数完全匹配 | |||||
| int32_t final_total = part1_pulse_num + part3_pulse_num; | |||||
| if (final_total != total_pulses) { | |||||
| // 如果还有差异,调整第一阶段 | |||||
| int32_t adjustment = total_pulses - final_total; | |||||
| part1_pulse_num += adjustment; | |||||
| if (part1_pulse_num < 0) { | |||||
| part3_pulse_num += part1_pulse_num; // 将负数转移给第三阶段 | |||||
| part1_pulse_num = 0; | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -1369,6 +1407,7 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) | |||||
| } | } | ||||
| } | } | ||||
| /** | /** | ||||
| * @brief 计算最优中间频率 | * @brief 计算最优中间频率 | ||||
| * @param v0 起始频率 | * @param v0 起始频率 | ||||
| @@ -1613,14 +1652,11 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| // 第二部分完成且无减速阶段,当前段结束 | |||||
| g_plsr_route.current_part = PLSR_PART_COMPLETE; | |||||
| PLSR_HandleSectionEnd(); | PLSR_HandleSectionEnd(); | ||||
| } | } | ||||
| break; | break; | ||||
| case PLSR_PART_3: | case PLSR_PART_3: | ||||
| g_plsr_route.current_part = PLSR_PART_COMPLETE; | |||||
| PLSR_HandleSectionEnd(); | PLSR_HandleSectionEnd(); | ||||
| break; | break; | ||||
| @@ -1754,8 +1790,6 @@ void PLSR_Route_Init(PLSR_RouteConfig_t* route) | |||||
| */ | */ | ||||
| void PLSR_Route_Start(PLSR_RouteConfig_t* route) | void PLSR_Route_Start(PLSR_RouteConfig_t* route) | ||||
| { | { | ||||
| // 参数有效性检查 | // 参数有效性检查 | ||||
| if (route == NULL) return; | if (route == NULL) return; | ||||
| // 状态检查 - 避免重复启动 | // 状态检查 - 避免重复启动 | ||||
| @@ -1938,6 +1972,7 @@ void PLSR_Section_StartNewSection(PLSR_RouteConfig_t* route) | |||||
| { | { | ||||
| if(g_plsr_mod_flag == 1) | if(g_plsr_mod_flag == 1) | ||||
| { | { | ||||
| g_plsr_route.initial_freq = g_plsr_route.current_freq; // 更新加减速初始频率 | |||||
| if(route->current_part == PLSR_PART_2) //匀速过程被修改 | if(route->current_part == PLSR_PART_2) //匀速过程被修改 | ||||
| { | { | ||||
| // 目标频率被修改,重新计算实际脉冲数 | // 目标频率被修改,重新计算实际脉冲数 | ||||
| @@ -2122,13 +2157,6 @@ void PLSR_Section_StartNewSection(PLSR_RouteConfig_t* route) | |||||
| // 重置TIM2计数器 | // 重置TIM2计数器 | ||||
| __HAL_TIM_SET_COUNTER(&htim2, 0); | __HAL_TIM_SET_COUNTER(&htim2, 0); | ||||
| // 设置PWM频率为当前段的起始频率 | |||||
| if(route->current_freq > 0) | |||||
| { | |||||
| PLSR_PWM_SetFrequency(route->current_freq); | |||||
| PLSR_PWM_Start(); | |||||
| } | |||||
| // 清除外部事件标志,确保新段开始时状态干净 | // 清除外部事件标志,确保新段开始时状态干净 | ||||
| PLSR_ClearExtEvent(route); | PLSR_ClearExtEvent(route); | ||||
| @@ -2581,8 +2609,8 @@ void PLSR_TaskSectionSwitch(PLSR_RouteConfig_t* route) | |||||
| PLSR_Section_SwitchNext(route, 0); // 外部事件触发,传入0 | PLSR_Section_SwitchNext(route, 0); // 外部事件触发,传入0 | ||||
| /* 启动新段,设置新的脉冲参数和频率 */ | /* 启动新段,设置新的脉冲参数和频率 */ | ||||
| PLSR_Section_StartNewSection(route); | PLSR_Section_StartNewSection(route); | ||||
| // /* 启动PWM输出 */ | |||||
| // PLSR_PWM_Start(); | |||||
| /* 启动PWM输出 */ | |||||
| PLSR_PWM_Start(); | |||||
| PLSR_ClearGpioTriggerFlag(); // 清除GPIO触发标志 | PLSR_ClearGpioTriggerFlag(); // 清除GPIO触发标志 | ||||
| } | } | ||||
| return; // 等待外部事件时不需要继续处理 | return; // 等待外部事件时不需要继续处理 | ||||
| @@ -2611,8 +2639,8 @@ void PLSR_TaskSectionSwitch(PLSR_RouteConfig_t* route) | |||||
| PLSR_Section_SwitchNext(route, 1); // 脉冲完成触发,传入1 | PLSR_Section_SwitchNext(route, 1); // 脉冲完成触发,传入1 | ||||
| /* 启动新段,设置新的脉冲参数和频率 */ | /* 启动新段,设置新的脉冲参数和频率 */ | ||||
| PLSR_Section_StartNewSection(route); | PLSR_Section_StartNewSection(route); | ||||
| // /* 启动PWM输出 */ | |||||
| // PLSR_PWM_Start(); | |||||
| /* 启动PWM输出 */ | |||||
| PLSR_PWM_Start(); | |||||
| } | } | ||||
| } | } | ||||
| else | else | ||||
| @@ -2624,8 +2652,8 @@ void PLSR_TaskSectionSwitch(PLSR_RouteConfig_t* route) | |||||
| PLSR_Section_SwitchNext(route, 0); // 其他等待条件触发,传入0 | PLSR_Section_SwitchNext(route, 0); // 其他等待条件触发,传入0 | ||||
| /* 启动新段,设置新的脉冲参数和频率 */ | /* 启动新段,设置新的脉冲参数和频率 */ | ||||
| PLSR_Section_StartNewSection(route); | PLSR_Section_StartNewSection(route); | ||||
| // /* 启动PWM输出 */ | |||||
| // PLSR_PWM_Start(); | |||||
| /* 启动PWM输出 */ | |||||
| PLSR_PWM_Start(); | |||||
| } | } | ||||
| /* 如果等待条件未满足,保持等待状态,等待下次检查 */ | /* 如果等待条件未满足,保持等待状态,等待下次检查 */ | ||||
| } | } | ||||