| @@ -647,8 +647,11 @@ void PLSR_PWM_Init(void) | |||
| MX_TIM14_Init(); | |||
| MX_TIM2_Init(); // TIM2恢复用于脉冲计数 | |||
| MX_TIM6_Init(); | |||
| // 停止PWM输出 | |||
| HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1); | |||
| HAL_TIM_PWM_Start(&htim10, TIM_CHANNEL_1); | |||
| HAL_TIM_PWM_Start(&htim11, TIM_CHANNEL_1); | |||
| HAL_TIM_PWM_Start(&htim13, TIM_CHANNEL_1); | |||
| HAL_TIM_PWM_Start(&htim14, TIM_CHANNEL_1); | |||
| BackupSRAM_RestoreData(); | |||
| } | |||
| @@ -667,23 +670,28 @@ void PLSR_PWM_Start(void) | |||
| switch(g_plsr_route.output_port) | |||
| { | |||
| case 0: // TIM10 | |||
| HAL_TIM_PWM_Start_IT(&htim10, TIM_CHANNEL_1); | |||
| __HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2); // 设置占空比为50% | |||
| //HAL_TIM_PWM_Start_IT(&htim10, TIM_CHANNEL_1); | |||
| break; | |||
| case 1: // TIM11 | |||
| HAL_TIM_PWM_Start_IT(&htim11, TIM_CHANNEL_1); | |||
| __HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2); | |||
| //HAL_TIM_PWM_Start_IT(&htim11, TIM_CHANNEL_1); | |||
| break; | |||
| case 2: // TIM13 | |||
| HAL_TIM_PWM_Start_IT(&htim13, TIM_CHANNEL_1); | |||
| __HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2); | |||
| //HAL_TIM_PWM_Start_IT(&htim13, TIM_CHANNEL_1); | |||
| break; | |||
| case 3: // TIM14 | |||
| HAL_TIM_PWM_Start_IT(&htim14, TIM_CHANNEL_1); | |||
| __HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2); | |||
| //HAL_TIM_PWM_Start_IT(&htim14, TIM_CHANNEL_1); | |||
| break; | |||
| default: // 默认使用TIM10 | |||
| HAL_TIM_PWM_Start_IT(&htim10, TIM_CHANNEL_1); | |||
| __HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2); | |||
| //HAL_TIM_PWM_Start_IT(&htim10, TIM_CHANNEL_1); | |||
| break; | |||
| } | |||
| } | |||
| @@ -706,23 +714,28 @@ void PLSR_PWM_Stop(void) | |||
| switch(g_plsr_route.output_port) | |||
| { | |||
| case 0: // TIM10 | |||
| HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1); | |||
| __HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); // | |||
| //HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1); | |||
| break; | |||
| case 1: // TIM11 | |||
| HAL_TIM_PWM_Stop(&htim11, TIM_CHANNEL_1); | |||
| __HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); // | |||
| //HAL_TIM_PWM_Stop(&htim11, TIM_CHANNEL_1); | |||
| break; | |||
| case 2: // TIM13 | |||
| HAL_TIM_PWM_Stop(&htim13, TIM_CHANNEL_1); | |||
| __HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); // | |||
| //HAL_TIM_PWM_Stop(&htim13, TIM_CHANNEL_1); | |||
| break; | |||
| case 3: // TIM14 | |||
| HAL_TIM_PWM_Stop(&htim14, TIM_CHANNEL_1); | |||
| __HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); // | |||
| //HAL_TIM_PWM_Stop(&htim14, TIM_CHANNEL_1); | |||
| break; | |||
| default: // 默认使用TIM10 | |||
| HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1); | |||
| __HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); // | |||
| //HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1); | |||
| break; | |||
| } | |||
| } | |||
| @@ -997,7 +1010,7 @@ static void PLSR_UpdateGlobalPulseCount(int32_t current_pulse_count) | |||
| s_last_total_pulse = current_pulse_count; | |||
| } | |||
| // 将32位全局累加脉冲计数分解为两个16位寄存器(支持负数) | |||
| int32_t signed_count = g_plsr_total_pulse_count; // 使用有符号数进行计算 | |||
| int32_t signed_count = g_plsr_location; // 使用有符号数进行计算 | |||
| ModbusSlave.holding_regs[0x1000] = signed_count & 0xFFFF; // 低16位 | |||
| ModbusSlave.holding_regs[0x1001] = (signed_count >> 16) & 0xFFFF; // 高16位 | |||
| } | |||
| @@ -1250,7 +1263,8 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) | |||
| // 计算第一部分:v0 -> vt | |||
| PLSR_RunState_t part1_state = PLSR_STATE_CONST; // 默认匀速 | |||
| if (v0 < vt) { | |||
| if (v0 < vt) | |||
| { | |||
| // 需要加速 | |||
| part1_state = PLSR_STATE_ACCEL; | |||
| part1_time = (vt - v0) / a; | |||
| @@ -1260,7 +1274,8 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) | |||
| part1_pulse_num = (uint32_t)(temp_calc / 2000); | |||
| if(part1_pulse_num == 0) part1_pulse_num = 1; // 防止为0 | |||
| } | |||
| else if (v0 > vt) { | |||
| else if (v0 > vt) | |||
| { | |||
| // 需要减速 | |||
| part1_state = PLSR_STATE_DECEL; | |||
| part1_time = (v0 - vt) / d; | |||
| @@ -1279,7 +1294,8 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) | |||
| // 计算第三部分:vt -> 0(必须减速到0) | |||
| PLSR_RunState_t part3_state = PLSR_STATE_DECEL; | |||
| if (vt > 0) { | |||
| if (vt > 0) | |||
| { | |||
| part3_time = vt / d; | |||
| if (part3_time == 0) part3_time = 1; | |||
| @@ -1287,7 +1303,9 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) | |||
| uint64_t temp_calc = (uint64_t)vt * part3_time; | |||
| part3_pulse_num = (uint32_t)(temp_calc / 2000); | |||
| if(part3_pulse_num == 0) part3_pulse_num = 1; // 防止为0 | |||
| } else { | |||
| } | |||
| else | |||
| { | |||
| // 目标频率已经是0,无需第三部分 | |||
| part3_pulse_num = 0; | |||
| part3_time = 0; | |||
| @@ -1309,7 +1327,6 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) | |||
| else if (used_pulses > total_pulses) { | |||
| // 脉冲数不足,需要调整运动参数 | |||
| // 策略:优先保证能减速到0,然后调整第一部分 | |||
| if (part3_pulse_num <= total_pulses) { | |||
| // 第三部分可以完成,调整第一部分 | |||
| int32_t remaining_pulses = total_pulses - part3_pulse_num; | |||