|
|
@@ -209,6 +209,8 @@ void MX_TIM10_Init(void) |
|
|
|
htim10.Init.Period = 9999; |
|
|
|
htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV2; |
|
|
|
htim10.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; |
|
|
|
htim10.Instance->CR1 |= TIM_CR1_ARPE; // 启用自动重载预加载 |
|
|
|
htim10.Instance->CCMR1 |= TIM_CCMR1_OC1PE; |
|
|
|
if (HAL_TIM_Base_Init(&htim10) != HAL_OK) |
|
|
|
{ |
|
|
|
Error_Handler(); |
|
|
@@ -675,17 +677,17 @@ void PLSR_PWM_Start(void) |
|
|
|
break; |
|
|
|
|
|
|
|
case 1: // TIM11 |
|
|
|
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2); |
|
|
|
__HAL_TIM_SET_COMPARE(&htim11, TIM_CHANNEL_1, htim10.Init.Period / 2); |
|
|
|
//HAL_TIM_PWM_Start_IT(&htim11, TIM_CHANNEL_1); |
|
|
|
break; |
|
|
|
|
|
|
|
case 2: // TIM13 |
|
|
|
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2); |
|
|
|
__HAL_TIM_SET_COMPARE(&htim13, TIM_CHANNEL_1, htim10.Init.Period / 2); |
|
|
|
//HAL_TIM_PWM_Start_IT(&htim13, TIM_CHANNEL_1); |
|
|
|
break; |
|
|
|
|
|
|
|
case 3: // TIM14 |
|
|
|
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2); |
|
|
|
__HAL_TIM_SET_COMPARE(&htim14, TIM_CHANNEL_1, htim10.Init.Period / 2); |
|
|
|
//HAL_TIM_PWM_Start_IT(&htim14, TIM_CHANNEL_1); |
|
|
|
break; |
|
|
|
|
|
|
@@ -719,17 +721,17 @@ void PLSR_PWM_Stop(void) |
|
|
|
break; |
|
|
|
|
|
|
|
case 1: // TIM11 |
|
|
|
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); // |
|
|
|
__HAL_TIM_SET_COMPARE(&htim11, TIM_CHANNEL_1, htim10.Init.Period); // |
|
|
|
//HAL_TIM_PWM_Stop(&htim11, TIM_CHANNEL_1); |
|
|
|
break; |
|
|
|
|
|
|
|
case 2: // TIM13 |
|
|
|
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); // |
|
|
|
__HAL_TIM_SET_COMPARE(&htim13, TIM_CHANNEL_1, htim10.Init.Period); // |
|
|
|
//HAL_TIM_PWM_Stop(&htim13, TIM_CHANNEL_1); |
|
|
|
break; |
|
|
|
|
|
|
|
case 3: // TIM14 |
|
|
|
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); // |
|
|
|
__HAL_TIM_SET_COMPARE(&htim14, TIM_CHANNEL_1, htim10.Init.Period); // |
|
|
|
//HAL_TIM_PWM_Stop(&htim14, TIM_CHANNEL_1); |
|
|
|
break; |
|
|
|
|
|
|
@@ -1122,8 +1124,8 @@ 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); |
|
|
|
/* 使用整数偏移法进行四舍五入 */ |
|
|
|
int32_t required_accel_pulses = (int32_t)(((uint64_t)(v0 + vt) * accel_time + 1000) / 2000); |
|
|
|
if(required_accel_pulses == 0) required_accel_pulses = 1; // 至少1个脉冲 |
|
|
|
|
|
|
|
if (required_accel_pulses <= total_pulses) |
|
|
@@ -1169,8 +1171,8 @@ void Calculate_PluseNum_Simplified(PLSR_RouteConfig_t *route) |
|
|
|
if (decel_time == 0) decel_time = 1; // 至少1ms |
|
|
|
|
|
|
|
// 减速阶段脉冲数 = (起始频率 + 目标频率) * 时间 / 2000 |
|
|
|
uint64_t temp_decel = (uint64_t)(v0 + vt) * decel_time; |
|
|
|
int32_t required_decel_pulses = (int32_t)(temp_decel / 2000); |
|
|
|
/* 使用整数偏移法进行四舍五入 */ |
|
|
|
int32_t required_decel_pulses = (int32_t)(((uint64_t)(v0 + vt) * decel_time + 1000) / 2000); |
|
|
|
if(required_decel_pulses == 0) required_decel_pulses = 1; // 至少1个脉冲 |
|
|
|
|
|
|
|
if (required_decel_pulses <= total_pulses) |
|
|
@@ -1220,6 +1222,7 @@ void Calculate_PluseNum_Simplified(PLSR_RouteConfig_t *route) |
|
|
|
route->accel_pulse_count = accel_pulse_num; |
|
|
|
route->const_pulse_count = const_pulse_num; |
|
|
|
route->decel_pulse_count = decel_pulse_num; |
|
|
|
route->accel_pulse_count -= 1; |
|
|
|
} |
|
|
|
} |
|
|
|
void Calculate_PluseNum(PLSR_RouteConfig_t *route) |
|
|
@@ -1270,8 +1273,8 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) |
|
|
|
part1_time = (vt - v0) / a; |
|
|
|
if (part1_time == 0) part1_time = 1; |
|
|
|
|
|
|
|
uint64_t temp_calc = (uint64_t)(v0 + vt) * part1_time; |
|
|
|
part1_pulse_num = (uint32_t)(temp_calc / 2000); |
|
|
|
/* 使用整数偏移法进行四舍五入 */ |
|
|
|
part1_pulse_num = (uint32_t)(((uint64_t)(v0 + vt) * part1_time + 1000) / 2000); |
|
|
|
if(part1_pulse_num == 0) part1_pulse_num = 1; // 防止为0 |
|
|
|
} |
|
|
|
else if (v0 > vt) |
|
|
@@ -1281,8 +1284,8 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) |
|
|
|
part1_time = (v0 - vt) / d; |
|
|
|
if (part1_time == 0) part1_time = 1; |
|
|
|
|
|
|
|
uint64_t temp_calc = (uint64_t)(v0 + vt) * part1_time; |
|
|
|
part1_pulse_num = (uint32_t)(temp_calc / 2000); |
|
|
|
/* 使用整数偏移法进行四舍五入 */ |
|
|
|
part1_pulse_num = (uint32_t)(((uint64_t)(v0 + vt) * part1_time + 1000) / 2000); |
|
|
|
if(part1_pulse_num == 0) part1_pulse_num = 1; // 防止为0 |
|
|
|
} |
|
|
|
else { |
|
|
@@ -1300,8 +1303,8 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) |
|
|
|
if (part3_time == 0) part3_time = 1; |
|
|
|
|
|
|
|
// 从vt减速到0的脉冲数:(vt + 0) * part3_time / 2000 |
|
|
|
uint64_t temp_calc = (uint64_t)vt * part3_time; |
|
|
|
part3_pulse_num = (uint32_t)(temp_calc / 2000); |
|
|
|
/* 使用整数偏移法进行四舍五入 */ |
|
|
|
part3_pulse_num = (uint32_t)(((uint64_t)vt * part3_time + 1000) / 2000); |
|
|
|
if(part3_pulse_num == 0) part3_pulse_num = 1; // 防止为0 |
|
|
|
} |
|
|
|
else |
|
|
@@ -1352,8 +1355,8 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) |
|
|
|
// 重新计算第三部分 |
|
|
|
part3_time = vt / d; |
|
|
|
if (part3_time == 0) part3_time = 1; |
|
|
|
uint64_t temp_calc = (uint64_t)vt * part3_time; |
|
|
|
part3_pulse_num = (uint32_t)(temp_calc / 2000); |
|
|
|
/* 使用整数偏移法进行四舍五入 */ |
|
|
|
part3_pulse_num = (uint32_t)(((uint64_t)vt * part3_time + 1000) / 2000); |
|
|
|
} |
|
|
|
} |
|
|
|
else if (v0 > vt) { |
|
|
@@ -1376,8 +1379,8 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) |
|
|
|
// 重新计算第三部分 |
|
|
|
part3_time = vt / d; |
|
|
|
if (part3_time == 0) part3_time = 1; |
|
|
|
uint64_t temp_calc = (uint64_t)vt * part3_time; |
|
|
|
part3_pulse_num = (uint32_t)(temp_calc / 2000); |
|
|
|
/* 使用整数偏移法进行四舍五入 */ |
|
|
|
part3_pulse_num = (uint32_t)(((uint64_t)vt * part3_time + 1000) / 2000); |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
@@ -1432,6 +1435,7 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) |
|
|
|
// 保存三个部分的状态和脉冲计数到结构体 |
|
|
|
// 使用现有的字段来存储三个部分的信息 |
|
|
|
|
|
|
|
|
|
|
|
// 第一部分 |
|
|
|
if (part1_state == PLSR_STATE_ACCEL) { |
|
|
|
route->accel_pulse_count = part1_pulse_num; |
|
|
@@ -1444,6 +1448,16 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) |
|
|
|
|
|
|
|
// 第三部分(减速到0) |
|
|
|
route->decel_pulse_count = part3_pulse_num; |
|
|
|
|
|
|
|
// uint8_t d_count = 0; |
|
|
|
// if(route->accel_pulse_count > 0) d_count++; |
|
|
|
// if(route->decel_pulse_count > 0) d_count++; |
|
|
|
// if(route->const_pulse_count > 0) d_count++; |
|
|
|
|
|
|
|
// if(route->const_pulse_count >= 3 ) |
|
|
|
// route->const_pulse_count -= d_count; |
|
|
|
// else |
|
|
|
route->accel_pulse_count -= 1; |
|
|
|
|
|
|
|
route->part1_state = part1_state; // 保存第一部分状态 |
|
|
|
route->part2_state = part2_state; // 保存第二部分状态 |
|
|
@@ -1452,16 +1466,23 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route) |
|
|
|
route->part2_target_freq = vt; // 第二部分结束频率 |
|
|
|
route->part3_target_freq = 0; // 第三部分结束频率必须为0 |
|
|
|
// 设置初始运行状态 |
|
|
|
if (part1_pulse_num > 0) { |
|
|
|
if (part1_pulse_num > 0) |
|
|
|
{ |
|
|
|
route->run_state = part1_state; |
|
|
|
route->target_freq = vt; |
|
|
|
} else if (part2_pulse_num > 0) { |
|
|
|
} |
|
|
|
else if (part2_pulse_num > 0) |
|
|
|
{ |
|
|
|
route->run_state = PLSR_STATE_CONST; |
|
|
|
route->target_freq = vt; |
|
|
|
} else if (part3_pulse_num > 0) { |
|
|
|
} |
|
|
|
else if (part3_pulse_num > 0) |
|
|
|
{ |
|
|
|
route->run_state = PLSR_STATE_DECEL; |
|
|
|
route->target_freq = 0; |
|
|
|
} else { |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
route->run_state = PLSR_STATE_CONST; |
|
|
|
route->target_freq = v0; |
|
|
|
} |
|
|
@@ -1511,7 +1532,7 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) |
|
|
|
PLSR_PWM_Stop(); |
|
|
|
// 精确累加当前段已发送的脉冲数 |
|
|
|
int32_t current_section_pulses = __HAL_TIM_GetAutoreload(&htim2); |
|
|
|
AllPluse += current_section_pulses; |
|
|
|
AllPluse += current_section_pulses + 1; |
|
|
|
g_plsr_route.pulse_count = AllPluse; |
|
|
|
PLSR_UpdateGlobalPulseCount(AllPluse); |
|
|
|
// 三部分状态机处理 |
|
|
@@ -1530,8 +1551,9 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) |
|
|
|
g_plsr_route.target_freq = g_plsr_route.part2_target_freq; |
|
|
|
g_plsr_route.initial_freq = g_plsr_route.current_freq; // 更新加减速初始频率 |
|
|
|
g_last_freq = 0; // 清零g_last_freq,防止频率计算时的累加效果 |
|
|
|
|
|
|
|
__HAL_TIM_SetAutoreload(&htim2, g_plsr_route.const_pulse_count); |
|
|
|
if(g_plsr_route.const_pulse_count > 1) |
|
|
|
__HAL_TIM_SetAutoreload(&htim2, g_plsr_route.const_pulse_count - 1); |
|
|
|
|
|
|
|
__HAL_TIM_SET_COUNTER(&htim2, 0); |
|
|
|
PLSR_PWM_Start(); |
|
|
|
} |
|
|
@@ -1544,6 +1566,9 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) |
|
|
|
g_plsr_route.initial_freq = g_plsr_route.current_freq; // 更新加减速初始频率 |
|
|
|
g_last_freq = 0; // 清零g_last_freq,防止频率计算时的累加效果 |
|
|
|
|
|
|
|
if(g_plsr_route.decel_pulse_count > 1) |
|
|
|
__HAL_TIM_SetAutoreload(&htim2, g_plsr_route.decel_pulse_count - 1); |
|
|
|
else |
|
|
|
__HAL_TIM_SetAutoreload(&htim2, g_plsr_route.decel_pulse_count); |
|
|
|
__HAL_TIM_SET_COUNTER(&htim2, 0); |
|
|
|
PLSR_PWM_Start(); |
|
|
@@ -1566,8 +1591,12 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) |
|
|
|
g_plsr_route.current_part = PLSR_PART_3; |
|
|
|
g_plsr_route.run_state = g_plsr_route.part3_state; |
|
|
|
g_plsr_route.target_freq = g_plsr_route.part3_target_freq; |
|
|
|
|
|
|
|
|
|
|
|
if(g_plsr_route.decel_pulse_count > 1) |
|
|
|
__HAL_TIM_SetAutoreload(&htim2, g_plsr_route.decel_pulse_count - 1); |
|
|
|
else |
|
|
|
__HAL_TIM_SetAutoreload(&htim2, g_plsr_route.decel_pulse_count); |
|
|
|
|
|
|
|
__HAL_TIM_SET_COUNTER(&htim2, 0); |
|
|
|
PLSR_PWM_Start(); |
|
|
|
} |
|
|
@@ -1744,10 +1773,23 @@ void PLSR_Route_Start(PLSR_RouteConfig_t* route) |
|
|
|
// 启动定时器 |
|
|
|
PLSR_TIM6_Start(); // 启动TIM6用于频率更新和等待时间计时 |
|
|
|
HAL_TIM_Base_Start_IT(&htim2); // 启动TIM2中断用于段切换 |
|
|
|
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); |
|
|
|
switch (route->output_port) |
|
|
|
{ |
|
|
|
case 0 : |
|
|
|
HAL_TIM_PWM_Start(&htim10, TIM_CHANNEL_1); |
|
|
|
break; |
|
|
|
case 1 : |
|
|
|
HAL_TIM_PWM_Start(&htim11, TIM_CHANNEL_1); |
|
|
|
break; |
|
|
|
case 2 : |
|
|
|
HAL_TIM_PWM_Start(&htim13, TIM_CHANNEL_1); |
|
|
|
break; |
|
|
|
case 3 : |
|
|
|
HAL_TIM_PWM_Start(&htim14, TIM_CHANNEL_1); |
|
|
|
break; |
|
|
|
default: |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|