| @@ -647,8 +647,11 @@ void PLSR_PWM_Init(void) | |||||
| MX_TIM14_Init(); | MX_TIM14_Init(); | ||||
| MX_TIM2_Init(); // TIM2恢复用于脉冲计数 | MX_TIM2_Init(); // TIM2恢复用于脉冲计数 | ||||
| MX_TIM6_Init(); | 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(); | BackupSRAM_RestoreData(); | ||||
| } | } | ||||
| @@ -667,23 +670,28 @@ 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_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; | break; | ||||
| case 1: // TIM11 | 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; | break; | ||||
| case 2: // TIM13 | 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; | break; | ||||
| case 3: // TIM14 | 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; | break; | ||||
| default: // 默认使用TIM10 | 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; | break; | ||||
| } | } | ||||
| } | } | ||||
| @@ -706,23 +714,28 @@ 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_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; | break; | ||||
| case 1: // TIM11 | 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; | break; | ||||
| case 2: // TIM13 | 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; | break; | ||||
| case 3: // TIM14 | 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; | break; | ||||
| default: // 默认使用TIM10 | 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; | break; | ||||
| } | } | ||||
| } | } | ||||
| @@ -997,7 +1010,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_total_pulse_count; // 使用有符号数进行计算 | |||||
| int32_t signed_count = g_plsr_location; // 使用有符号数进行计算 | |||||
| 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位 | ||||
| } | } | ||||
| @@ -1250,7 +1263,8 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) | |||||
| // 计算第一部分:v0 -> vt | // 计算第一部分:v0 -> vt | ||||
| PLSR_RunState_t part1_state = PLSR_STATE_CONST; // 默认匀速 | PLSR_RunState_t part1_state = PLSR_STATE_CONST; // 默认匀速 | ||||
| if (v0 < vt) { | |||||
| if (v0 < vt) | |||||
| { | |||||
| // 需要加速 | // 需要加速 | ||||
| part1_state = PLSR_STATE_ACCEL; | part1_state = PLSR_STATE_ACCEL; | ||||
| part1_time = (vt - v0) / a; | part1_time = (vt - v0) / a; | ||||
| @@ -1260,7 +1274,8 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) | |||||
| part1_pulse_num = (uint32_t)(temp_calc / 2000); | part1_pulse_num = (uint32_t)(temp_calc / 2000); | ||||
| if(part1_pulse_num == 0) part1_pulse_num = 1; // 防止为0 | if(part1_pulse_num == 0) part1_pulse_num = 1; // 防止为0 | ||||
| } | } | ||||
| else if (v0 > vt) { | |||||
| else if (v0 > vt) | |||||
| { | |||||
| // 需要减速 | // 需要减速 | ||||
| part1_state = PLSR_STATE_DECEL; | part1_state = PLSR_STATE_DECEL; | ||||
| part1_time = (v0 - vt) / d; | part1_time = (v0 - vt) / d; | ||||
| @@ -1279,7 +1294,8 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) | |||||
| // 计算第三部分:vt -> 0(必须减速到0) | // 计算第三部分:vt -> 0(必须减速到0) | ||||
| PLSR_RunState_t part3_state = PLSR_STATE_DECEL; | PLSR_RunState_t part3_state = PLSR_STATE_DECEL; | ||||
| if (vt > 0) { | |||||
| if (vt > 0) | |||||
| { | |||||
| part3_time = vt / d; | part3_time = vt / d; | ||||
| if (part3_time == 0) part3_time = 1; | 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; | uint64_t temp_calc = (uint64_t)vt * part3_time; | ||||
| part3_pulse_num = (uint32_t)(temp_calc / 2000); | part3_pulse_num = (uint32_t)(temp_calc / 2000); | ||||
| if(part3_pulse_num == 0) part3_pulse_num = 1; // 防止为0 | if(part3_pulse_num == 0) part3_pulse_num = 1; // 防止为0 | ||||
| } else { | |||||
| } | |||||
| else | |||||
| { | |||||
| // 目标频率已经是0,无需第三部分 | // 目标频率已经是0,无需第三部分 | ||||
| part3_pulse_num = 0; | part3_pulse_num = 0; | ||||
| part3_time = 0; | part3_time = 0; | ||||
| @@ -1309,7 +1327,6 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) | |||||
| else if (used_pulses > total_pulses) { | else if (used_pulses > total_pulses) { | ||||
| // 脉冲数不足,需要调整运动参数 | // 脉冲数不足,需要调整运动参数 | ||||
| // 策略:优先保证能减速到0,然后调整第一部分 | // 策略:优先保证能减速到0,然后调整第一部分 | ||||
| if (part3_pulse_num <= total_pulses) { | if (part3_pulse_num <= total_pulses) { | ||||
| // 第三部分可以完成,调整第一部分 | // 第三部分可以完成,调整第一部分 | ||||
| int32_t remaining_pulses = total_pulses - part3_pulse_num; | int32_t remaining_pulses = total_pulses - part3_pulse_num; | ||||