|
|
@@ -33,7 +33,7 @@ uint32_t PlsrCurrentTargetFreq = 0; // 当前段目标频率频率(Hz),用于 |
|
|
|
static uint8_t s_last_direction = 0xFF; // 初始值设为无效值,确保第一次总是认为有方向变化 |
|
|
|
uint8_t PlsrModFlag = 0xff; |
|
|
|
static uint8_t FirstFlag = 0; |
|
|
|
uint32_t TotalSePulse = 0; |
|
|
|
uint32_t SectionUpdatePluse = 0; |
|
|
|
uint8_t StopFlag = 0; |
|
|
|
// ==================== PLSR内部变量 ==================== |
|
|
|
|
|
|
@@ -831,7 +831,7 @@ void PLSR_TIM6_Stop(void) |
|
|
|
HAL_TIM_Base_Stop_IT(&htim6); |
|
|
|
} |
|
|
|
|
|
|
|
static int32_t AllPulse = 0; //总脉冲个数 |
|
|
|
static int32_t PartUpdatePluse = 0; //总脉冲个数 |
|
|
|
static int32_t s_last_total_pulse = 0; //上次记录的总脉冲数,用于实时累加 |
|
|
|
|
|
|
|
|
|
|
@@ -867,10 +867,23 @@ static void PLSR_UpdateGlobalPulseCount(int32_t current_pulse_count) |
|
|
|
|
|
|
|
void PLSR_HandleSectionEnd(void) |
|
|
|
{ |
|
|
|
// 获取当前段的配置指针(段号从1开始,数组索引从0开始) |
|
|
|
PLSR_SectionConfig_t* current_section = &PlsrRoute.section[PlsrRoute.current_section_num - 1]; |
|
|
|
// 清零所有部分的脉冲计数 |
|
|
|
PlsrRoute.accel_pulse_count = 0; |
|
|
|
PlsrRoute.const_pulse_count = 0; |
|
|
|
PlsrRoute.decel_pulse_count = 0; |
|
|
|
if(PlsrRoute.mode == PLSR_MODE_RELATIVE) |
|
|
|
{ |
|
|
|
if(current_section->target_pulse > 0) |
|
|
|
{ |
|
|
|
SectionUpdatePluse += current_section->target_pulse; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
SectionUpdatePluse -= current_section->target_pulse; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 重置部分状态 |
|
|
|
PlsrRoute.current_part = PLSR_PART_COMPLETE; |
|
|
@@ -920,9 +933,9 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) |
|
|
|
current_section_pulses -= 1; |
|
|
|
PlsrModFlag = 0; |
|
|
|
} |
|
|
|
AllPulse += current_section_pulses; |
|
|
|
PlsrRoute.pulse_count = AllPulse; |
|
|
|
PLSR_UpdateGlobalPulseCount(AllPulse); |
|
|
|
PartUpdatePluse += current_section_pulses; |
|
|
|
PlsrRoute.pulse_count = PartUpdatePluse; |
|
|
|
PLSR_UpdateGlobalPulseCount(PartUpdatePluse); |
|
|
|
// 三部分状态机处理 |
|
|
|
switch(PlsrRoute.current_part) |
|
|
|
{ |
|
|
@@ -1059,7 +1072,7 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) |
|
|
|
uint32_t current_tim2_count = __HAL_TIM_GET_COUNTER(&htim2); |
|
|
|
|
|
|
|
// 计算当前段已发送的总脉冲数 |
|
|
|
int32_t current_pulse_count = AllPulse + current_tim2_count; |
|
|
|
int32_t current_pulse_count = PartUpdatePluse + current_tim2_count; |
|
|
|
PlsrRoute.pulse_count = current_pulse_count; |
|
|
|
// 实时累加脉冲增量到全局计数器(根据方向逻辑决定递增或递减) |
|
|
|
PLSR_UpdateGlobalPulseCount(current_pulse_count); |
|
|
@@ -1080,7 +1093,7 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) |
|
|
|
{ |
|
|
|
PlsrModFlag = 1; // 标记当前段目标频率被修改 |
|
|
|
PLSR_Section_PWM_Stop(); |
|
|
|
AllPulse += current_tim2_count; // 累加当前段已发送的脉冲数 |
|
|
|
PartUpdatePluse += current_tim2_count; // 累加当前段已发送的脉冲数 |
|
|
|
PLSR_Section_StartNewSection(&PlsrRoute); ///<重新启动当前段 |
|
|
|
PLSR_PWM_Start(); |
|
|
|
} |
|
|
@@ -1205,7 +1218,7 @@ void PLSR_Route_Start(PLSR_RouteConfig_t* route) |
|
|
|
route->run_state = PLSR_STATE_IDLE; // 设置运行状态为空闲 |
|
|
|
|
|
|
|
// 重置全局脉冲计数器 |
|
|
|
AllPulse = 0; |
|
|
|
PartUpdatePluse = 0; |
|
|
|
FirstFlag = 0; |
|
|
|
|
|
|
|
// 重置静态变量,确保每次启动效果一致 |
|
|
@@ -1400,10 +1413,10 @@ uint8_t PLSR_Section_StartNewSection(PLSR_RouteConfig_t* route) |
|
|
|
PlsrRoute.initial_freq = PlsrRoute.current_freq; // 更新加减速初始频率 |
|
|
|
|
|
|
|
if(current_section->target_pulse > 0) |
|
|
|
current_section->actual_pulse = TotalSePulse + current_section->target_pulse - PlsrTotalPulseCount; |
|
|
|
current_section->actual_pulse = SectionUpdatePluse + current_section->target_pulse - PlsrTotalPulseCount; |
|
|
|
else |
|
|
|
current_section->actual_pulse = TotalSePulse + (-current_section->target_pulse) - PlsrTotalPulseCount; |
|
|
|
|
|
|
|
current_section->actual_pulse = SectionUpdatePluse + (-current_section->target_pulse) - PlsrTotalPulseCount; |
|
|
|
|
|
|
|
current_section->actual_pulse += 1; |
|
|
|
} |
|
|
|
else |
|
|
@@ -1719,13 +1732,12 @@ void PLSR_Section_SwitchNext(PLSR_RouteConfig_t* route, uint8_t is_pulse_complet |
|
|
|
|
|
|
|
// 脉冲完成触发:累加整个目标脉冲数 |
|
|
|
route->prevPulseCount += actual_total; |
|
|
|
TotalSePulse += actual_total; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
// 外部事件触发:直接使用全局脉冲计数器作为累计脉冲数 |
|
|
|
route->prevPulseCount = PlsrTotalPulseCount; |
|
|
|
TotalSePulse = PlsrTotalPulseCount; |
|
|
|
SectionUpdatePluse = PlsrTotalPulseCount; |
|
|
|
} |
|
|
|
} |
|
|
|
if(next_section_num == 0) |
|
|
@@ -2050,8 +2062,8 @@ void PLSR_TaskSectionSwitch(PLSR_RouteConfig_t* route) |
|
|
|
if (PLSR_Wait_CheckExtEvent(route)) |
|
|
|
{ |
|
|
|
/*检查是否完成,在外部事件这种特殊情况下对脉冲数进行计数*/ |
|
|
|
AllPulse += __HAL_TIM_GET_COUNTER(&htim2); // 累加当前段已发送的脉冲数 |
|
|
|
TotalSePulse = AllPulse; |
|
|
|
PartUpdatePluse += __HAL_TIM_GET_COUNTER(&htim2); // 累加当前段已发送的脉冲数 |
|
|
|
SectionUpdatePluse = PartUpdatePluse; |
|
|
|
if(PLSR_Section_CheckPulseComplete(route)) |
|
|
|
{ |
|
|
|
route->current_freq = 0; |
|
|
@@ -2059,8 +2071,8 @@ void PLSR_TaskSectionSwitch(PLSR_RouteConfig_t* route) |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
AllPulse -= 1; |
|
|
|
TotalSePulse -= 1; |
|
|
|
PartUpdatePluse -= 1; |
|
|
|
SectionUpdatePluse -= 1; |
|
|
|
} |
|
|
|
//PLSR_Route_PWM_Stop(); |
|
|
|
/* 检查当前段是否为最后一段 */ |
|
|
|