|
|
@@ -60,9 +60,9 @@ void PLSR_CalculateTimerParams(uint32_t frequency, uint16_t* prescaler, uint32_t |
|
|
|
*/ |
|
|
|
void Calculate_PluseNum_Simplified(PLSR_RouteConfig_t *route) |
|
|
|
{ |
|
|
|
int32_t accel_pulse_num = 0; // 加速过程脉冲数 |
|
|
|
int32_t decel_pulse_num = 0; // 减速过程脉冲数 |
|
|
|
int32_t const_pulse_num = 0; // 匀速过程脉冲数 |
|
|
|
int64_t accel_pulse_num = 0; // 加速过程脉冲数 |
|
|
|
int64_t decel_pulse_num = 0; // 减速过程脉冲数 |
|
|
|
int64_t const_pulse_num = 0; // 匀速过程脉冲数 |
|
|
|
uint32_t accel_time = 0; // 加速时间(ms) |
|
|
|
uint32_t decel_time = 0; // 减速时间(ms) |
|
|
|
|
|
|
@@ -80,7 +80,7 @@ void Calculate_PluseNum_Simplified(PLSR_RouteConfig_t *route) |
|
|
|
uint32_t a = route->accel_rate; // 加速度 |
|
|
|
uint32_t d = route->decel_rate; // 减速度 |
|
|
|
// 使用实际可发脉冲数,不再区分相对/绝对模式 |
|
|
|
int32_t total_pulses = current_section->actual_pulse; // 总脉冲数 |
|
|
|
int64_t total_pulses = current_section->actual_pulse; // 总脉冲数 |
|
|
|
|
|
|
|
|
|
|
|
// 防止除零错误 |
|
|
@@ -99,7 +99,7 @@ void Calculate_PluseNum_Simplified(PLSR_RouteConfig_t *route) |
|
|
|
// 加速阶段脉冲数 = (起始频率 + 目标频率) * 时间 / 2000 |
|
|
|
// 使用梯形积分公式:面积 = (上底 + 下底) * 高 / 2 |
|
|
|
uint64_t temp_accel = (uint64_t)(v0 + vt) * accel_time; |
|
|
|
int32_t required_accel_pulses = (int32_t)(temp_accel / 2000); |
|
|
|
int64_t required_accel_pulses = (int64_t)(temp_accel / 2000); |
|
|
|
if(required_accel_pulses == 0) required_accel_pulses = 1; // 至少1个脉冲 |
|
|
|
|
|
|
|
if (required_accel_pulses <= total_pulses) |
|
|
@@ -146,7 +146,7 @@ void Calculate_PluseNum_Simplified(PLSR_RouteConfig_t *route) |
|
|
|
|
|
|
|
// 减速阶段脉冲数 = (起始频率 + 目标频率) * 时间 / 2000 |
|
|
|
uint64_t temp_decel = (uint64_t)(v0 + vt) * decel_time; |
|
|
|
int32_t required_decel_pulses = (int32_t)(temp_decel / 2000); |
|
|
|
int64_t required_decel_pulses = (int64_t)(temp_decel / 2000); |
|
|
|
if(required_decel_pulses == 0) required_decel_pulses = 1; // 至少1个脉冲 |
|
|
|
|
|
|
|
if (required_decel_pulses <= total_pulses) |
|
|
@@ -200,9 +200,9 @@ void Calculate_PluseNum_Simplified(PLSR_RouteConfig_t *route) |
|
|
|
|
|
|
|
void Calculate_PluseNum(PLSR_RouteConfig_t *route) |
|
|
|
{ |
|
|
|
int32_t part1_pulse_num = 0; // 第一部分脉冲数 |
|
|
|
int32_t part2_pulse_num = 0; // 第二部分脉冲数 |
|
|
|
int32_t part3_pulse_num = 0; // 第三部分脉冲数 |
|
|
|
int64_t part1_pulse_num = 0; // 第一部分脉冲数 |
|
|
|
int64_t part2_pulse_num = 0; // 第二部分脉冲数 |
|
|
|
int64_t part3_pulse_num = 0; // 第三部分脉冲数 |
|
|
|
uint32_t part1_time = 0; // 第一部分时间(ms) |
|
|
|
uint32_t part3_time = 0; // 第三部分时间(ms) |
|
|
|
|
|
|
@@ -225,7 +225,7 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) |
|
|
|
uint32_t d = route->decel_rate; // 减速度 |
|
|
|
|
|
|
|
// 在PLSR_Section_StartNewSection中已经根据模式计算了actual_pulse |
|
|
|
int32_t total_pulses = current_section->actual_pulse; // 总脉冲数 |
|
|
|
int64_t total_pulses = current_section->actual_pulse; // 总脉冲数 |
|
|
|
|
|
|
|
// 防止除零错误 |
|
|
|
if (a == 0) a = 1; |
|
|
@@ -280,7 +280,7 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) |
|
|
|
} |
|
|
|
|
|
|
|
// 检查脉冲数是否足够 |
|
|
|
int32_t used_pulses = part1_pulse_num + part3_pulse_num; |
|
|
|
int64_t used_pulses = part1_pulse_num + part3_pulse_num; |
|
|
|
|
|
|
|
if (used_pulses <= total_pulses) |
|
|
|
{ |
|
|
@@ -349,7 +349,7 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) |
|
|
|
} |
|
|
|
|
|
|
|
// 确保总脉冲数完全匹配 |
|
|
|
int32_t calculated_total = part1_pulse_num + part3_pulse_num; |
|
|
|
int64_t calculated_total = part1_pulse_num + part3_pulse_num; |
|
|
|
if (calculated_total != total_pulses) |
|
|
|
{ |
|
|
|
if (calculated_total > total_pulses) |
|
|
@@ -375,7 +375,7 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) |
|
|
|
else |
|
|
|
{ |
|
|
|
// 脉冲数不足,将剩余脉冲分配给匀速阶段 |
|
|
|
int32_t remaining_pulses = total_pulses - calculated_total; |
|
|
|
int64_t remaining_pulses = total_pulses - calculated_total; |
|
|
|
|
|
|
|
// 将剩余脉冲分配给第二阶段(匀速阶段) |
|
|
|
// 这样既不影响加减速的数学精确性,又能充分利用所有脉冲 |
|
|
@@ -444,7 +444,7 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) |
|
|
|
* @brief 计算最优中间频率 |
|
|
|
*/ |
|
|
|
uint32_t OptimalIntermediateFrequency(uint32_t v0, uint32_t vt_desired, |
|
|
|
int32_t total_pulses, uint32_t a, uint32_t d) |
|
|
|
int64_t total_pulses, uint32_t a, uint32_t d) |
|
|
|
{ |
|
|
|
if (total_pulses <= 0 || a == 0 || d == 0) { |
|
|
|
return v0; // 无法优化 |
|
|
@@ -502,7 +502,7 @@ uint32_t OptimalIntermediateFrequency(uint32_t v0, uint32_t vt_desired, |
|
|
|
* @return 最优频率 |
|
|
|
*/ |
|
|
|
uint32_t BinarySearchOptimalFreq(uint32_t v0, uint32_t vt_desired, |
|
|
|
int32_t total_pulses, uint32_t a, uint32_t d, |
|
|
|
int64_t total_pulses, uint32_t a, uint32_t d, |
|
|
|
uint8_t is_accel) |
|
|
|
{ |
|
|
|
uint32_t low = is_accel ? v0 : 0; |
|
|
@@ -525,7 +525,7 @@ uint32_t BinarySearchOptimalFreq(uint32_t v0, uint32_t vt_desired, |
|
|
|
} |
|
|
|
s3 = ((uint64_t)mid * mid) / (2000ULL * d); |
|
|
|
|
|
|
|
int32_t total_calc = s1 + s3; |
|
|
|
int64_t total_calc = s1 + s3; |
|
|
|
|
|
|
|
if (total_calc == total_pulses) { |
|
|
|
return mid; // 找到精确解 |
|
|
@@ -649,7 +649,8 @@ void SCurve_InitializeParameters(PLSR_RouteConfig_t* route) |
|
|
|
uint32_t delta_vel_accel = (vel_target_accel > vel_start_accel) ? |
|
|
|
(vel_target_accel - vel_start_accel) : 0; |
|
|
|
|
|
|
|
if (delta_vel_accel > 0) { |
|
|
|
if (delta_vel_accel > 0) |
|
|
|
{ |
|
|
|
/* 计算加速时间参数 */ |
|
|
|
uint32_t total_accel_time_ms = CLAMP_MIN(delta_vel_accel / accel_rate, 1); |
|
|
|
uint32_t jerk_time_ms = CLAMP_MIN(total_accel_time_ms / 2, 1); |
|
|
@@ -681,9 +682,12 @@ void SCurve_InitializeParameters(PLSR_RouteConfig_t* route) |
|
|
|
uint32_t calculated_total = phase1_pulses + phase2_pulses; |
|
|
|
uint32_t actual_total = route->accel_pulse_count; |
|
|
|
if (calculated_total != actual_total && calculated_total > 0) { |
|
|
|
if (actual_total > calculated_total) { |
|
|
|
if (actual_total > calculated_total) |
|
|
|
{ |
|
|
|
phase2_pulses += (actual_total - calculated_total); |
|
|
|
} else { |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
phase1_pulses = (uint32_t)(((uint64_t)phase1_pulses * actual_total) / calculated_total); |
|
|
|
phase2_pulses = actual_total - phase1_pulses; |
|
|
|
} |
|
|
@@ -695,7 +699,9 @@ void SCurve_InitializeParameters(PLSR_RouteConfig_t* route) |
|
|
|
route->scurve.accel_jerk_time_ms = jerk_time_ms; |
|
|
|
route->scurve.accel_phase1_pulses = phase1_pulses; |
|
|
|
route->scurve.accel_phase2_pulses = phase2_pulses; |
|
|
|
} else { |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
/* 无加速段,清零参数 */ |
|
|
|
route->scurve.accel_jerk = 0; |
|
|
|
route->scurve.accel_max = 0; |
|
|
|