Browse Source

暂时解决之前遇到的所有问题,添加最后一段等待条件为外部信号时触发减速到0的功能

2
JIU JIALIN 1 month ago
parent
commit
1392b8aa47
3 changed files with 925 additions and 755 deletions
  1. +252
    -82
      PLSR/PLSR/Core/Src/tim.c
  2. +673
    -673
      PLSR/PLSR/EWARM/test.1.dep
  3. BIN
      PLSR/PLSR/EWARM/test.1/Exe/test.1.sim

+ 252
- 82
PLSR/PLSR/Core/Src/tim.c View File

@@ -671,23 +671,23 @@ 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_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2); // 设置占空比为50%
break; break;
case 1: // TIM11 case 1: // TIM11
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2);
__HAL_TIM_SET_COMPARE(&htim11, TIM_CHANNEL_1, htim11.Init.Period / 2); // 设置占空比为50%
break; break;
case 2: // TIM13 case 2: // TIM13
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2);
__HAL_TIM_SET_COMPARE(&htim13, TIM_CHANNEL_1, htim13.Init.Period / 2); // 设置占空比为50%
break; break;
case 3: // TIM14 case 3: // TIM14
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2);
__HAL_TIM_SET_COMPARE(&htim14, TIM_CHANNEL_1, htim14.Init.Period / 2); // 设置占空比为50%
break; break;
default: // 默认使用TIM10 default: // 默认使用TIM10
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2);
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2); // 设置占空比为50%
break; break;
} }
} }
@@ -710,60 +710,60 @@ void PLSR_Section_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, 0); //
//HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0); // 停止PWM输出
//HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);
break; break;
case 1: // TIM11 case 1: // TIM11
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0); //
__HAL_TIM_SET_COMPARE(&htim11, TIM_CHANNEL_1, 0); // 停止PWM输出
//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, 0); //
__HAL_TIM_SET_COMPARE(&htim13, TIM_CHANNEL_1, 0); // 停止PWM输出
//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, 0); //
__HAL_TIM_SET_COMPARE(&htim14, TIM_CHANNEL_1, 0); // 停止PWM输出
//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, 0); //
//HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0); // 停止PWM输出
//HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);
break; break;
} }
} }


void PLSR_Route_PWM_Stop() void PLSR_Route_PWM_Stop()
{ {
// 根据output_port选择目标定时器并停止PWM输出
// 根据output_port选择目标定时器并停止PWM输出
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, 0xFFFF); //
//HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); // 完全停止PWM输出
//HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);
break; break;
case 1: // TIM11 case 1: // TIM11
//__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); //
HAL_TIM_PWM_Stop(&htim11, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim11, TIM_CHANNEL_1, 0xFFFF); // 完全停止PWM输出
//HAL_TIM_PWM_Stop(&htim11, TIM_CHANNEL_1);
break; break;
case 2: // TIM13 case 2: // TIM13
//__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); //
HAL_TIM_PWM_Stop(&htim13, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim13, TIM_CHANNEL_1, 0xFFFF); // 完全停止PWM输出
//HAL_TIM_PWM_Stop(&htim13, TIM_CHANNEL_1);
break; break;
case 3: // TIM14 case 3: // TIM14
//__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); //
HAL_TIM_PWM_Stop(&htim14, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim14, TIM_CHANNEL_1, 0xFFFF); // 完全停止PWM输出
// HAL_TIM_PWM_Stop(&htim14, TIM_CHANNEL_1);
break; break;
default: // 默认使用TIM10 default: // 默认使用TIM10
//__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); //
HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); // 完全停止PWM输出
//HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);
break; break;
} }
} }
@@ -1563,7 +1563,7 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
PLSR_Section_PWM_Stop(); PLSR_Section_PWM_Stop();
// 精确累加当前段已发送的脉冲数 // 精确累加当前段已发送的脉冲数
int32_t current_section_pulses = __HAL_TIM_GetAutoreload(&htim2); int32_t current_section_pulses = __HAL_TIM_GetAutoreload(&htim2);
AllPluse += current_section_pulses + 1;
AllPluse += current_section_pulses;
g_plsr_route.pulse_count = AllPluse; g_plsr_route.pulse_count = AllPluse;
PLSR_UpdateGlobalPulseCount(AllPluse); PLSR_UpdateGlobalPulseCount(AllPluse);
// 三部分状态机处理 // 三部分状态机处理
@@ -1573,33 +1573,71 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
// 判断下一部分 // 判断下一部分
if(g_plsr_route.const_pulse_count > 0) if(g_plsr_route.const_pulse_count > 0)
{ {
// 进入第二部分:匀速
g_plsr_route.current_part = PLSR_PART_2;
g_plsr_route.run_state = g_plsr_route.part2_state;
g_plsr_route.target_freq = g_plsr_route.part2_target_freq;
g_plsr_route.initial_freq = g_plsr_route.part2_target_freq; // 更新加减速初始频率
g_last_freq = 0; // 清零g_last_freq,防止频率计算时的累加效果
if(g_plsr_route.const_pulse_count > 1)
{
// 进入第二部分:匀速
g_plsr_route.current_part = PLSR_PART_2;
g_plsr_route.run_state = g_plsr_route.part2_state;
g_plsr_route.target_freq = g_plsr_route.part2_target_freq;
g_plsr_route.initial_freq = g_plsr_route.part2_target_freq; // 更新加减速初始频率
g_last_freq = 0; // 清零g_last_freq,防止频率计算时的累加效果
g_plsr_route.current_freq = g_plsr_route.target_freq;
PLSR_PWM_SetFrequency(g_plsr_route.current_freq);
__HAL_TIM_SetAutoreload(&htim2, g_plsr_route.const_pulse_count);
__HAL_TIM_SET_COUNTER(&htim2, 1);
PLSR_PWM_Start();
break;
}
else
{
// 进入第二部分:匀速
g_plsr_route.current_part = PLSR_PART_2;
g_plsr_route.run_state = g_plsr_route.part2_state;
g_plsr_route.target_freq = g_plsr_route.part2_target_freq;
g_plsr_route.initial_freq = g_plsr_route.part2_target_freq; // 更新加减速初始频率
g_last_freq = 0; // 清零g_last_freq,防止频率计算时的累加效果
g_plsr_route.current_freq = g_plsr_route.target_freq;
PLSR_PWM_SetFrequency(g_plsr_route.current_freq);
PLSR_PWM_Start();
__HAL_TIM_SetAutoreload(&htim2, g_plsr_route.const_pulse_count);
__HAL_TIM_SET_COUNTER(&htim2, 1);
break;
}


g_plsr_route.current_freq = g_plsr_route.target_freq;
PLSR_PWM_SetFrequency(g_plsr_route.current_freq);
__HAL_TIM_SetAutoreload(&htim2, g_plsr_route.const_pulse_count - 1);
__HAL_TIM_SET_COUNTER(&htim2, 0);
PLSR_PWM_Start();
break;
} }
else if(g_plsr_route.decel_pulse_count > 0) else if(g_plsr_route.decel_pulse_count > 0)
{ {
// 无匀速阶段,直接进入第三部分:减速
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;
g_plsr_route.initial_freq = g_plsr_route.current_freq; // 更新加减速初始频率
g_last_freq = 0; // 清零g_last_freq,防止频率计算时的累加效果
__HAL_TIM_SetAutoreload(&htim2, g_plsr_route.decel_pulse_count - 1);
__HAL_TIM_SET_COUNTER(&htim2, 0);
PLSR_PWM_Start();
break;
if(g_plsr_route.decel_pulse_count > 1)
{
// 无匀速阶段,直接进入第三部分:减速
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;
g_plsr_route.initial_freq = g_plsr_route.current_freq; // 更新加减速初始频率
g_last_freq = 0; // 清零g_last_freq,防止频率计算时的累加效果
__HAL_TIM_SetAutoreload(&htim2, g_plsr_route.decel_pulse_count);
__HAL_TIM_SET_COUNTER(&htim2, 1);
PLSR_PWM_Start();
break;
}
else
{
// 无匀速阶段,直接进入第三部分:减速
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;
g_plsr_route.initial_freq = g_plsr_route.current_freq; // 更新加减速初始频率
g_last_freq = 0; // 清零g_last_freq,防止频率计算时的累加效果
uint32_t arr_freq = 0;
arr_freq = PLSR_Calculate_FreqByPosition(&g_plsr_route,0);
PLSR_PWM_SetFrequency(arr_freq);
PLSR_PWM_Start();
__HAL_TIM_SetAutoreload(&htim2, g_plsr_route.decel_pulse_count);
__HAL_TIM_SET_COUNTER(&htim2, 1);
break;
}

} }
else else
{ {
@@ -1613,14 +1651,30 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
// 进入第三部分:减速 // 进入第三部分:减速
if(g_plsr_route.decel_pulse_count > 0) if(g_plsr_route.decel_pulse_count > 0)
{ {
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;
__HAL_TIM_SetAutoreload(&htim2, g_plsr_route.decel_pulse_count - 1);
__HAL_TIM_SET_COUNTER(&htim2, 0);
PLSR_PWM_Start();
break;
if(g_plsr_route.decel_pulse_count > 1)
{
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;
__HAL_TIM_SetAutoreload(&htim2, g_plsr_route.decel_pulse_count);
__HAL_TIM_SET_COUNTER(&htim2, 1);
PLSR_PWM_Start();
break;
}
else
{
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;
uint32_t arr_freq = 0;
arr_freq = PLSR_Calculate_FreqByPosition(&g_plsr_route,0);
PLSR_PWM_SetFrequency(arr_freq);
PLSR_PWM_Start();
__HAL_TIM_SetAutoreload(&htim2, g_plsr_route.decel_pulse_count);
__HAL_TIM_SET_COUNTER(&htim2, 1);
break;
}

} }
else else
{ {
@@ -1753,7 +1807,6 @@ void PLSR_Route_Init(PLSR_RouteConfig_t* route)
g_last_freq = 0; // 清零上一次计算的频率 g_last_freq = 0; // 清零上一次计算的频率


PLSR_TIM6_SetUpdateFreq(100); //初始化TIM6更新频率为1000us(1ms) PLSR_TIM6_SetUpdateFreq(100); //初始化TIM6更新频率为1000us(1ms)
//PLSR_Section_PWM_Stop(); // 确保PWM停止,避免意外输出
} }


/** /**
@@ -1784,8 +1837,33 @@ void PLSR_Route_Start(PLSR_RouteConfig_t* route)
AllPluse = 0; AllPluse = 0;
g_first_flag = 0; g_first_flag = 0;
// 重置上次记录的总脉冲数,用于实时累加计算
s_last_total_pulse = g_plsr_route.pulse_count;
// 重置静态变量,确保每次启动效果一致
s_last_total_pulse = 0; // 重置上次记录的总脉冲数
s_last_direction = 0xFF; // 重置方向状态为初始无效值
s_pulse_count_direction = 1; // 重置脉冲计数方向为默认值
g_plsr_mod_flag = 0; // 重置修改标志
// 重置等待时间相关静态变量
s_wait_time_counter = 0; // 重置等待时间计数器
s_wait_time_target = 0; // 重置等待时间目标值
s_wait_time_flag = 0; // 重置等待时间到达标志
s_act_time_counter = 0; // 重置ACT时间计数器
s_act_time_target = 0; // 重置ACT时间目标值
s_act_time_flag = 0; // 重置ACT时间到达标志
// 重置所有PWM定时器状态,确保每次启动都是干净的状态
__HAL_TIM_SET_COUNTER(&htim10, 0); // 重置TIM10计数器
__HAL_TIM_SET_COUNTER(&htim11, 0); // 重置TIM11计数器
__HAL_TIM_SET_COUNTER(&htim13, 0); // 重置TIM13计数器
__HAL_TIM_SET_COUNTER(&htim14, 0); // 重置TIM14计数器
__HAL_TIM_SET_COUNTER(&htim2, 0); // 重置TIM2计数器
__HAL_TIM_SET_COUNTER(&htim6, 0); // 重置TIM6计数器
// 停止所有PWM输出,确保启动前处于停止状态
HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);
HAL_TIM_PWM_Stop(&htim11, TIM_CHANNEL_1);
HAL_TIM_PWM_Stop(&htim13, TIM_CHANNEL_1);
HAL_TIM_PWM_Stop(&htim14, TIM_CHANNEL_1);
// 启动第一段 // 启动第一段
PLSR_Section_StartNewSection(route); PLSR_Section_StartNewSection(route);
@@ -1817,7 +1895,7 @@ void PLSR_Route_Stop(PLSR_RouteConfig_t* route)
route->initial_freq = 0; // 重置加减速初始频率 route->initial_freq = 0; // 重置加减速初始频率
// 重置计数器 // 重置计数器
__HAL_TIM_SET_COUNTER(&htim2, 0);
__HAL_TIM_SET_COUNTER(&htim2, 1);
route->freq_step = 0; route->freq_step = 0;
@@ -2123,10 +2201,7 @@ void PLSR_Section_StartNewSection(PLSR_RouteConfig_t* route)
// 统一使用三部分运动状态机设置TIM2参数 // 统一使用三部分运动状态机设置TIM2参数
PLSR_SetupThreePartExecution(route); PLSR_SetupThreePartExecution(route);
// 重置TIM2计数器
__HAL_TIM_SET_COUNTER(&htim2, 0);

// 清除外部事件标志,确保新段开始时状态干净 // 清除外部事件标志,确保新段开始时状态干净
PLSR_ClearExtEvent(route); PLSR_ClearExtEvent(route);
@@ -2152,10 +2227,69 @@ void PLSR_SetupThreePartExecution(PLSR_RouteConfig_t* route)
route->part1_state == PLSR_STATE_DECEL || route->part1_state == PLSR_STATE_DECEL ||
route->part1_state == PLSR_STATE_CONST) route->part1_state == PLSR_STATE_CONST)
{ {
__HAL_TIM_SetAutoreload(&htim2, route->accel_pulse_count - 1);
route->run_state = route->part1_state; route->run_state = route->part1_state;
route->target_freq = route->part1_target_freq; route->target_freq = route->part1_target_freq;
if(route->run_state == PLSR_STATE_ACCEL)
{
uint32_t arr_freq = 0;
arr_freq = PLSR_Calculate_FreqByPosition(&g_plsr_route,1);
route->current_freq = arr_freq;
// 加速完成检查
if (route->run_state == PLSR_STATE_ACCEL && route->current_freq >= route->target_freq)
{
route->current_freq = route->target_freq; // 限制到目标频率
PLSR_PWM_SetFrequency(route->current_freq);
}
PLSR_PWM_SetFrequency(route->current_freq);
}
else
{
uint32_t arr_freq = 0;
arr_freq = PLSR_Calculate_FreqByPosition(&g_plsr_route,0);
route->current_freq = arr_freq;
// 减速完成检查 - 只有当减速到目标频率且目标频率大于0时才切换到匀速
if (route->run_state == PLSR_STATE_DECEL && route->current_freq <= route->target_freq && route->target_freq > 0)
{
route->current_freq = route->target_freq; // 限制到目标频率
PLSR_PWM_SetFrequency(route->current_freq);
}
PLSR_PWM_SetFrequency(route->current_freq);
}
if(g_first_flag == 0 && route->current_freq != 0) //在这里第一次启动PWM输出避免发默认脉冲
{
g_first_flag = 1;
PLSR_PWM_Start();
switch (route->output_port)
{
case 0:
HAL_TIM_PWM_Start(&htim10, TIM_CHANNEL_1);
// 触发更新事件 - 立即将新参数加载到影子寄存器
HAL_TIM_GenerateEvent(&htim10, TIM_EVENTSOURCE_UPDATE);
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;
}
__HAL_TIM_SetAutoreload(&htim2, route->accel_pulse_count);
__HAL_TIM_SET_COUNTER(&htim2,1);
return;
}
else
{
PLSR_PWM_Start();
}
__HAL_TIM_SetAutoreload(&htim2, route->accel_pulse_count);
__HAL_TIM_SET_COUNTER(&htim2,1);
return; // 设置完成,退出函数 return; // 设置完成,退出函数

} }
else else
{ {
@@ -2169,7 +2303,7 @@ void PLSR_SetupThreePartExecution(PLSR_RouteConfig_t* route)
// 第二部分:匀速 // 第二部分:匀速
if(route->const_pulse_count > 0) if(route->const_pulse_count > 0)
{ {
__HAL_TIM_SetAutoreload(&htim2, route->const_pulse_count - 1);
__HAL_TIM_SetAutoreload(&htim2, route->const_pulse_count);
route->run_state = route->part2_state; // 通常是PLSR_STATE_CONST route->run_state = route->part2_state; // 通常是PLSR_STATE_CONST
route->target_freq = route->part2_target_freq; route->target_freq = route->part2_target_freq;
return; // 设置完成,退出函数 return; // 设置完成,退出函数
@@ -2186,7 +2320,7 @@ void PLSR_SetupThreePartExecution(PLSR_RouteConfig_t* route)
// 第三部分:减速到0 // 第三部分:减速到0
if(route->decel_pulse_count > 0) if(route->decel_pulse_count > 0)
{ {
__HAL_TIM_SetAutoreload(&htim2, route->decel_pulse_count - 1);
__HAL_TIM_SetAutoreload(&htim2, route->decel_pulse_count);
route->run_state = route->part3_state; // 通常是PLSR_STATE_DECEL route->run_state = route->part3_state; // 通常是PLSR_STATE_DECEL
route->target_freq = route->part3_target_freq; // 通常是0 route->target_freq = route->part3_target_freq; // 通常是0
return; // 设置完成,退出函数 return; // 设置完成,退出函数
@@ -2207,7 +2341,7 @@ void PLSR_SetupThreePartExecution(PLSR_RouteConfig_t* route)
} }
// 所有部分完成或无效状态 // 所有部分完成或无效状态
__HAL_TIM_SetAutoreload(&htim2, 1); // 设置最小值
__HAL_TIM_SetAutoreload(&htim2, 0); // 设置最小值
route->run_state = PLSR_STATE_CONST; route->run_state = PLSR_STATE_CONST;
} }


@@ -2298,22 +2432,30 @@ uint32_t PLSR_Calculate_FreqByPosition(PLSR_RouteConfig_t* route, uint8_t is_acc
PLSR_SectionConfig_t* current_section = &route->section[route->current_section_num - 1]; PLSR_SectionConfig_t* current_section = &route->section[route->current_section_num - 1];
// 获取当前脉冲位置 // 获取当前脉冲位置
uint32_t current_tim2_count = __HAL_TIM_GET_COUNTER(&htim2);
uint32_t executed_pulses = 0;
uint32_t next_executed_pulses = 0;
int32_t current_tim2_count = __HAL_TIM_GET_COUNTER(&htim2);
int32_t executed_pulses = 0;
int32_t next_executed_pulses = 0;
// 计算当前部分已经执行的脉冲数 // 计算当前部分已经执行的脉冲数
if(is_accel)
if(is_accel == 0)
{ {
executed_pulses = current_tim2_count;
next_executed_pulses = current_tim2_count + 1;
// 减速过程:使用全局脉冲计数器
if((current_tim2_count - 1) < 0)
{
executed_pulses = 0;
}
else
{
executed_pulses = current_tim2_count - 1;
}
} }
else else
{ {
// 减速过程:使用全局脉冲计数器
executed_pulses = current_tim2_count; executed_pulses = current_tim2_count;
next_executed_pulses = executed_pulses + 1;
} }
//executed_pulses = current_tim2_count;
//executed_pulses = ((current_tim2_count - 1) < 0) ? 0 : (current_tim2_count - 1);
next_executed_pulses = executed_pulses + 1;

// 检查是否需要重新计算:脉冲步数、加减速状态或段号发生变化时才重新计算 // 检查是否需要重新计算:脉冲步数、加减速状态或段号发生变化时才重新计算
if (executed_pulses == s_last_executed_pulses && if (executed_pulses == s_last_executed_pulses &&
is_accel == s_last_is_accel && is_accel == s_last_is_accel &&
@@ -2601,12 +2743,40 @@ void PLSR_TaskSectionSwitch(PLSR_RouteConfig_t* route)
if (PLSR_Wait_CheckExtEvent(route)) if (PLSR_Wait_CheckExtEvent(route))
{ {
AllPluse += __HAL_TIM_GET_COUNTER(&htim2); // 累加当前段已发送的脉冲数 AllPluse += __HAL_TIM_GET_COUNTER(&htim2); // 累加当前段已发送的脉冲数
/* 外部事件满足,切换到下一段 */
PLSR_Section_SwitchNext(route, 0); // 外部事件触发,传入0
/* 启动新段,设置新的脉冲参数和频率 */
PLSR_Section_StartNewSection(route);
/* 启动PWM输出 */
PLSR_PWM_Start();
/* 检查当前段是否为最后一段 */
if (route->current_section_num >= route->section_num)
{
/* 当前段为最后一段,立即从当前频率减速到0并停止路径 */
route->target_freq = 0; // 设置目标频率为0
route->run_state = PLSR_STATE_DECEL; // 设置为减速状态
route->initial_freq = route->current_freq;
g_last_freq = 0;
__HAL_TIM_SetAutoreload(&htim2, 0xffffff);
__HAL_TIM_SET_COUNTER(&htim2, 1);
/* 如果当前频率已经为0,直接停止 */
if (route->current_freq == 0)
{
route->route_state = PLSR_ROUTE_COMPLETED;
PLSR_Route_Stop(route);
}
else
{
/* 启动减速到0的过程 */
PLSR_PWM_Start();
}
}
else
{
/* 非最后一段,正常进行段切换 */
PLSR_Section_SwitchNext(route, 0); // 外部事件触发,传入0
/* 启动新段,设置新的脉冲参数和频率 */
PLSR_Section_StartNewSection(route);
/* 启动PWM输出 */
PLSR_PWM_Start();
}
PLSR_ClearGpioTriggerFlag(); // 清除GPIO触发标志 PLSR_ClearGpioTriggerFlag(); // 清除GPIO触发标志
} }
return; // 等待外部事件时不需要继续处理 return; // 等待外部事件时不需要继续处理


+ 673
- 673
PLSR/PLSR/EWARM/test.1.dep
File diff suppressed because it is too large
View File


BIN
PLSR/PLSR/EWARM/test.1/Exe/test.1.sim View File


Loading…
Cancel
Save