|
@@ -19,6 +19,7 @@ |
|
|
/* USER CODE END Header */ |
|
|
/* USER CODE END Header */ |
|
|
/* Includes ------------------------------------------------------------------*/ |
|
|
/* Includes ------------------------------------------------------------------*/ |
|
|
#include "tim.h" |
|
|
#include "tim.h" |
|
|
|
|
|
#include "flash_save.h" // 包含Modbus地址定义和寄存器操作函数 |
|
|
#include <math.h> // 用于sinf函数 |
|
|
#include <math.h> // 用于sinf函数 |
|
|
|
|
|
|
|
|
/* USER CODE BEGIN 0 */ |
|
|
/* USER CODE BEGIN 0 */ |
|
@@ -315,7 +316,7 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) |
|
|
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); |
|
|
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); |
|
|
|
|
|
|
|
|
/* TIM2 interrupt Init */ |
|
|
/* TIM2 interrupt Init */ |
|
|
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); |
|
|
|
|
|
|
|
|
HAL_NVIC_SetPriority(TIM2_IRQn, 4, 4); |
|
|
HAL_NVIC_EnableIRQ(TIM2_IRQn); |
|
|
HAL_NVIC_EnableIRQ(TIM2_IRQn); |
|
|
/* USER CODE BEGIN TIM2_MspInit 1 */ |
|
|
/* USER CODE BEGIN TIM2_MspInit 1 */ |
|
|
|
|
|
|
|
@@ -330,7 +331,7 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) |
|
|
__HAL_RCC_TIM6_CLK_ENABLE(); |
|
|
__HAL_RCC_TIM6_CLK_ENABLE(); |
|
|
|
|
|
|
|
|
// 配置TIM6中断 |
|
|
// 配置TIM6中断 |
|
|
HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 5, 5); |
|
|
|
|
|
|
|
|
HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 3, 3); |
|
|
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); |
|
|
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); |
|
|
/* USER CODE BEGIN TIM6_MspInit 1 */ |
|
|
/* USER CODE BEGIN TIM6_MspInit 1 */ |
|
|
|
|
|
|
|
@@ -851,8 +852,8 @@ static void PLSR_UpdateGlobalPulseCount(int32_t current_pulse_count) |
|
|
} |
|
|
} |
|
|
// 将32位全局累加脉冲计数分解为两个16位寄存器(支持负数) |
|
|
// 将32位全局累加脉冲计数分解为两个16位寄存器(支持负数) |
|
|
int32_t signed_count = g_plsr_location; // 使用有符号数进行计算 |
|
|
int32_t signed_count = g_plsr_location; // 使用有符号数进行计算 |
|
|
ModbusSlave.holding_regs[0x1000] = signed_count & 0xFFFF; // 低16位 |
|
|
|
|
|
ModbusSlave.holding_regs[0x1001] = (signed_count >> 16) & 0xFFFF; // 高16位 |
|
|
|
|
|
|
|
|
backup_data->holding_regs[73] = signed_count & 0xFFFF; |
|
|
|
|
|
backup_data->holding_regs[74] = (signed_count >> 16) & 0xFFFF; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void PLSR_HandleSectionEnd(void) |
|
|
void PLSR_HandleSectionEnd(void) |
|
@@ -866,9 +867,10 @@ void PLSR_HandleSectionEnd(void) |
|
|
// 重置部分状态 |
|
|
// 重置部分状态 |
|
|
g_plsr_route.current_part = PLSR_PART_COMPLETE; |
|
|
g_plsr_route.current_part = PLSR_PART_COMPLETE; |
|
|
|
|
|
|
|
|
if(g_plsr_route.current_section_num == g_plsr_route.section_num |
|
|
|
|
|
&& g_plsr_route.section[g_plsr_route.current_section_num - 1].next_section == 0) |
|
|
|
|
|
|
|
|
if(g_plsr_route.current_section_num >= g_plsr_route.section_num |
|
|
|
|
|
&& g_plsr_route.section[g_plsr_route.current_section_num - 1].next_section == 0) |
|
|
{ |
|
|
{ |
|
|
|
|
|
// 最后一段完成,路径结束 |
|
|
PLSR_Route_Stop(&g_plsr_route); |
|
|
PLSR_Route_Stop(&g_plsr_route); |
|
|
} |
|
|
} |
|
|
else |
|
|
else |
|
@@ -895,14 +897,13 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) |
|
|
// TIM2中断:负责段切换逻辑 |
|
|
// TIM2中断:负责段切换逻辑 |
|
|
if(htim->Instance == TIM2) |
|
|
if(htim->Instance == TIM2) |
|
|
{ |
|
|
{ |
|
|
// if(g_plsr_route.current_section_num >= g_plsr_route.section_num && |
|
|
|
|
|
// g_plsr_route.current_part != PLSR_PART_1 && |
|
|
|
|
|
// g_plsr_route.run_state == PLSR_STATE_DECEL) |
|
|
|
|
|
// { |
|
|
|
|
|
// PLSR_Route_PWM_Stop(); |
|
|
|
|
|
// } |
|
|
|
|
|
// else PLSR_Section_PWM_Stop(); |
|
|
|
|
|
PLSR_Route_PWM_Stop(); |
|
|
|
|
|
|
|
|
if(g_plsr_route.current_section_num >= g_plsr_route.section_num && |
|
|
|
|
|
g_plsr_route.current_part != PLSR_PART_1 && |
|
|
|
|
|
g_plsr_route.run_state == PLSR_STATE_DECEL) |
|
|
|
|
|
{ |
|
|
|
|
|
PLSR_Route_PWM_Stop(); |
|
|
|
|
|
} |
|
|
|
|
|
else PLSR_Section_PWM_Stop(); |
|
|
if(g_plsr_route.part1_target_freq == g_plsr_route.section[g_plsr_route.current_section_num - 1].target_freq |
|
|
if(g_plsr_route.part1_target_freq == g_plsr_route.section[g_plsr_route.current_section_num - 1].target_freq |
|
|
&& g_plsr_route.current_part == 1) |
|
|
&& g_plsr_route.current_part == 1) |
|
|
{ |
|
|
{ |
|
@@ -1053,9 +1054,12 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) |
|
|
// 更新路由结构体的脉冲计数(使用原子操作保证一致性) |
|
|
// 更新路由结构体的脉冲计数(使用原子操作保证一致性) |
|
|
g_plsr_route.pulse_count = current_pulse_count; |
|
|
g_plsr_route.pulse_count = current_pulse_count; |
|
|
|
|
|
|
|
|
|
|
|
// 计算当前段的Modbus地址基址 |
|
|
|
|
|
uint16_t current_seg_base_addr = MODBUS_ADDR_SEGMENT_BASE + ((g_plsr_route.current_section_num-1) * MODBUS_ADDR_SEGMENT_OFFSET); |
|
|
|
|
|
|
|
|
g_plsr_route.section[g_plsr_route.current_section_num-1].target_freq = |
|
|
g_plsr_route.section[g_plsr_route.current_section_num-1].target_freq = |
|
|
(((uint32_t)ModbusSlave.holding_regs[256+(16*(g_plsr_route.current_section_num-1))]) | |
|
|
|
|
|
(uint32_t)ModbusSlave.holding_regs[257+(16*(g_plsr_route.current_section_num-1))]<<16); |
|
|
|
|
|
|
|
|
((uint32_t)FlashSave_Get_Holding_Register(current_seg_base_addr + MODBUS_OFFSET_FREQ_LOW)) | |
|
|
|
|
|
((uint32_t)FlashSave_Get_Holding_Register(current_seg_base_addr + MODBUS_OFFSET_FREQ_HIGH) << 16); |
|
|
|
|
|
|
|
|
if(g_plsr_route.section[g_plsr_route.current_section_num-1].target_freq != g_plsr_current_target_freq && |
|
|
if(g_plsr_route.section[g_plsr_route.current_section_num-1].target_freq != g_plsr_current_target_freq && |
|
|
g_plsr_route.current_part != PLSR_PART_COMPLETE) |
|
|
g_plsr_route.current_part != PLSR_PART_COMPLETE) |
|
@@ -1076,24 +1080,31 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* @brief 设置PLSR路径配置参数 |
|
|
|
|
|
* @param[in,out] route 路径控制结构体指针 |
|
|
|
|
|
* @note 使用Modbus地址映射表中的索引访问寄存器数据 |
|
|
|
|
|
*/ |
|
|
void PLSR_Route_Set(PLSR_RouteConfig_t* route) |
|
|
void PLSR_Route_Set(PLSR_RouteConfig_t* route) |
|
|
{ |
|
|
{ |
|
|
route->output_port = ModbusSlave.holding_regs[0]; |
|
|
|
|
|
route->dir_port = ModbusSlave.holding_regs[1]; |
|
|
|
|
|
route->ext_port = ModbusSlave.holding_regs[2]; |
|
|
|
|
|
route->dir_delay = ModbusSlave.holding_regs[3]; |
|
|
|
|
|
route->dir_logic = ModbusSlave.holding_regs[4]; |
|
|
|
|
|
route->accel_config.accel_algorithm = ModbusSlave.holding_regs[5]; |
|
|
|
|
|
route->mode = ModbusSlave.holding_regs[6]; //绝对/相对 |
|
|
|
|
|
route->section_num = ModbusSlave.holding_regs[7]; //总段数 |
|
|
|
|
|
route->start_section = ModbusSlave.holding_regs[8]; |
|
|
|
|
|
route->default_freq = ModbusSlave.holding_regs[9]|ModbusSlave.holding_regs[10]<<16; |
|
|
|
|
|
route->default_accel_time_ms = ModbusSlave.holding_regs[11]; |
|
|
|
|
|
route->default_decel_time_ms = ModbusSlave.holding_regs[12]; |
|
|
|
|
|
|
|
|
|
|
|
// 新增:设置默认加减速时间 |
|
|
|
|
|
route->default_accel_time_ms = ModbusSlave.holding_regs[11]; // 使用相同的加速时间 |
|
|
|
|
|
route->default_decel_time_ms = ModbusSlave.holding_regs[12]; // 使用相同的减速时间 |
|
|
|
|
|
|
|
|
/* 基本配置参数 - 使用Modbus地址访问 */ |
|
|
|
|
|
route->output_port = FlashSave_Get_Holding_Register(MODBUS_ADDR_PULSE_OUTPUT_PIN); ///< 脉冲输出端子 |
|
|
|
|
|
route->dir_port = FlashSave_Get_Holding_Register(MODBUS_ADDR_DIRECTION_OUTPUT_PIN); ///< 方向输出端子 |
|
|
|
|
|
route->ext_port = FlashSave_Get_Holding_Register(MODBUS_ADDR_EXT_INPUT_PIN); ///< 外部输入端子 |
|
|
|
|
|
route->dir_delay = FlashSave_Get_Holding_Register(MODBUS_ADDR_DIRECTION_DELAY_TIME); ///< 方向延时时间 |
|
|
|
|
|
route->dir_logic = FlashSave_Get_Holding_Register(MODBUS_ADDR_DIRECTION_LOGIC); ///< 方向逻辑 |
|
|
|
|
|
route->accel_config.accel_algorithm = FlashSave_Get_Holding_Register(MODBUS_ADDR_ACCEL_DECEL_MODE); ///< 加减速算法 |
|
|
|
|
|
route->mode = FlashSave_Get_Holding_Register(MODBUS_ADDR_RUN_MODE); ///< 运行模式(绝对/相对) |
|
|
|
|
|
route->section_num = FlashSave_Get_Holding_Register(MODBUS_ADDR_TOTAL_SEGMENTS); ///< 总段数 |
|
|
|
|
|
route->start_section = FlashSave_Get_Holding_Register(MODBUS_ADDR_START_SEGMENT); ///< 起始段 |
|
|
|
|
|
|
|
|
|
|
|
/* 默认频率(32位) = 低16位 | (高16位 << 16) */ |
|
|
|
|
|
route->default_freq = ((uint32_t)FlashSave_Get_Holding_Register(MODBUS_ADDR_DEFAULT_SPEED_LOW)) | |
|
|
|
|
|
((uint32_t)FlashSave_Get_Holding_Register(MODBUS_ADDR_DEFAULT_SPEED_HIGH) << 16); |
|
|
|
|
|
|
|
|
|
|
|
route->default_accel_time_ms = FlashSave_Get_Holding_Register(MODBUS_ADDR_DEFAULT_ACCEL_TIME); ///< 默认加速时间 |
|
|
|
|
|
route->default_decel_time_ms = FlashSave_Get_Holding_Register(MODBUS_ADDR_DEFAULT_DECEL_TIME); ///< 默认减速时间 |
|
|
|
|
|
|
|
|
// 自动更新加减速度 |
|
|
// 自动更新加减速度 |
|
|
PLSR_Accel_UpdateRates(route); |
|
|
PLSR_Accel_UpdateRates(route); |
|
|
|
|
|
|
|
@@ -1101,15 +1112,25 @@ void PLSR_Route_Set(PLSR_RouteConfig_t* route) |
|
|
route->end_freq = 0; // 结束频率:0Hz |
|
|
route->end_freq = 0; // 结束频率:0Hz |
|
|
route->initial_freq = 0; // 加减速初始频率:0Hz |
|
|
route->initial_freq = 0; // 加减速初始频率:0Hz |
|
|
|
|
|
|
|
|
// 初始化所有段的配置 - 遍历并初始化每个段 |
|
|
|
|
|
|
|
|
/* 初始化所有段的配置 - 使用Modbus地址访问段参数 */ |
|
|
for (uint8_t i = 0; i < route->section_num; i++) |
|
|
for (uint8_t i = 0; i < route->section_num; i++) |
|
|
{ |
|
|
{ |
|
|
|
|
|
|
|
|
route->section[i].section_num = i + 1; |
|
|
route->section[i].section_num = i + 1; |
|
|
route->section[i].target_freq = (((uint32_t)ModbusSlave.holding_regs[256+(16*i)]) | (uint32_t)ModbusSlave.holding_regs[257+(16*i)]<<16); |
|
|
|
|
|
route->section[i].target_pulse = (((int32_t)ModbusSlave.holding_regs[258+(16*i)]) | (int32_t)ModbusSlave.holding_regs[259+(16*i)]<<16); |
|
|
|
|
|
route->section[i].wait_condition.wait_type = ModbusSlave.holding_regs[260+(16*i)]; |
|
|
|
|
|
route->section[i].next_section = ModbusSlave.holding_regs[261+(16*i)]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* 计算当前段的Modbus地址基址 */ |
|
|
|
|
|
uint16_t seg_base_addr = MODBUS_ADDR_SEGMENT_BASE + (i * MODBUS_ADDR_SEGMENT_OFFSET); |
|
|
|
|
|
|
|
|
|
|
|
/* 目标频率 = 低16位 | (高16位 << 16) */ |
|
|
|
|
|
route->section[i].target_freq = ((uint32_t)FlashSave_Get_Holding_Register(seg_base_addr + MODBUS_OFFSET_FREQ_LOW)) | |
|
|
|
|
|
((uint32_t)FlashSave_Get_Holding_Register(seg_base_addr + MODBUS_OFFSET_FREQ_HIGH) << 16); |
|
|
|
|
|
|
|
|
|
|
|
/* 目标脉冲数 = 低16位 | (高16位 << 16) */ |
|
|
|
|
|
route->section[i].target_pulse = ((int32_t)FlashSave_Get_Holding_Register(seg_base_addr + MODBUS_OFFSET_PULSE_COUNT_LOW)) | |
|
|
|
|
|
((int32_t)FlashSave_Get_Holding_Register(seg_base_addr + MODBUS_OFFSET_PULSE_COUNT_HIGH) << 16); |
|
|
|
|
|
|
|
|
|
|
|
/* 等待条件和跳转编号 */ |
|
|
|
|
|
route->section[i].wait_condition.wait_type = FlashSave_Get_Holding_Register(seg_base_addr + MODBUS_OFFSET_WAIT_CONDITION); |
|
|
|
|
|
route->section[i].next_section = FlashSave_Get_Holding_Register(seg_base_addr + MODBUS_OFFSET_JUMP_NUMBER); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@@ -1982,6 +2003,9 @@ void PLSR_Accel_SetDefaultParams(PLSR_RouteConfig_t* route, uint32_t accel_time_ |
|
|
void PLSR_TaskSectionSwitch(PLSR_RouteConfig_t* route) |
|
|
void PLSR_TaskSectionSwitch(PLSR_RouteConfig_t* route) |
|
|
{ |
|
|
{ |
|
|
if (route == NULL) return; |
|
|
if (route == NULL) return; |
|
|
|
|
|
|
|
|
|
|
|
// 如果路径已完成,直接返回,不执行任何操作 |
|
|
|
|
|
if (route->route_state == PLSR_ROUTE_COMPLETED) return; |
|
|
/* 获取当前段配置 */ |
|
|
/* 获取当前段配置 */ |
|
|
PLSR_SectionConfig_t* current_section = &route->section[route->current_section_num - 1]; |
|
|
PLSR_SectionConfig_t* current_section = &route->section[route->current_section_num - 1]; |
|
|
if(current_section->wait_condition.wait_type == PLSR_WAIT_EXT_EVENT) |
|
|
if(current_section->wait_condition.wait_type == PLSR_WAIT_EXT_EVENT) |
|
@@ -2118,7 +2142,7 @@ uint8_t PLSR_Section_CheckWaitCondition(PLSR_RouteConfig_t* route) |
|
|
switch (wait_cond->wait_type) { |
|
|
switch (wait_cond->wait_type) { |
|
|
case PLSR_WAIT_PLUSEEND: |
|
|
case PLSR_WAIT_PLUSEEND: |
|
|
return PLSR_Section_CheckPulseComplete(route); |
|
|
return PLSR_Section_CheckPulseComplete(route); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case PLSR_WAIT_EXT_EVENT: |
|
|
case PLSR_WAIT_EXT_EVENT: |
|
|
// 外部事件条件:等待外部事件触发 |
|
|
// 外部事件条件:等待外部事件触发 |
|
|
// 外部事件可通过PLSR_SetExtEvent函数设置 |
|
|
// 外部事件可通过PLSR_SetExtEvent函数设置 |
|
@@ -2225,7 +2249,8 @@ void PLSR_SectionSwitchTask(void *p_arg) |
|
|
|
|
|
|
|
|
(void)p_arg; // 避免编译器警告 |
|
|
(void)p_arg; // 避免编译器警告 |
|
|
|
|
|
|
|
|
while (1) { |
|
|
|
|
|
|
|
|
while (1) |
|
|
|
|
|
{ |
|
|
/* 等待段切换信号量 */ |
|
|
/* 等待段切换信号量 */ |
|
|
OSSemPend(s_section_switch_sem, 0, &err); |
|
|
OSSemPend(s_section_switch_sem, 0, &err); |
|
|
|
|
|
|
|
@@ -2233,6 +2258,5 @@ void PLSR_SectionSwitchTask(void *p_arg) |
|
|
/* 信号量获取成功,执行段切换逻辑 */ |
|
|
/* 信号量获取成功,执行段切换逻辑 */ |
|
|
PLSR_TaskSectionSwitch(&g_plsr_route); |
|
|
PLSR_TaskSectionSwitch(&g_plsr_route); |
|
|
} |
|
|
} |
|
|
/* 如果信号量获取失败,继续等待下一次信号 */ |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |