Pārlūkot izejas kodu

解决代码修改后目标脉冲设置错误的bug,当前效果,低频加减速效果良好,时间准确,个数准确,但若目标频率高时,出现加速不到目标频率.

master
JIU JIALIN pirms 1 mēnesi
vecāks
revīzija
14591e39e4
4 mainītis faili ar 685 papildinājumiem un 690 dzēšanām
  1. +18
    -9
      PLSR/PLSR/Core/Src/main.c
  2. +21
    -35
      PLSR/PLSR/Core/Src/tim.c
  3. +646
    -646
      PLSR/PLSR/EWARM/test.1.dep
  4. Binārs
      PLSR/PLSR/EWARM/test.1/Exe/test.1.sim

+ 18
- 9
PLSR/PLSR/Core/Src/main.c Parādīt failu

@@ -262,20 +262,29 @@ static void KeyTask(void *p_arg)
(void)p_arg;
OSTimeDly(2000); //<等待硬件完全初始化.
uint8_t startflag = 0;
// 初始化PLSR路径配置
PLSR_Route_Init(&g_plsr_route);
PLSR_Route_Start(&g_plsr_route);
//PLSR_Route_Start(&g_plsr_route);
while (1)
{
// 按键任务现在只负责按键检测和简单的控制逻辑
// 段切换逻辑已移至专用的高优先级段切换任务中处理
// 可以在这里添加按键检测、LED控制等简单功能
// 例如:检测按键状态、更新LED显示等
OSTimeDlyHMSM(0, 0, 0, 10); /* 延时10ms */
if(ModbusSlave.holding_regs[0x2000] == 1) //按下发送脉冲按钮后,向0x3000地址写1,松手写2,设置地址偏移为0x1000,所以这里值为0x2000
{
startflag = 1;
g_plsr_route.route_state = PLSR_ROUTE_IDLE;
}
else
{
if(startflag == 1)
{
PLSR_Route_Init(&g_plsr_route);
PLSR_Route_Start(&g_plsr_route);
startflag = 0;
//PLSR_Section_Process(&g_plsr_route);
}
}
OSTimeDlyHMSM(0, 0, 0, 10); /* 延时10ms */
}
}



+ 21
- 35
PLSR/PLSR/Core/Src/tim.c Parādīt failu

@@ -1703,41 +1703,6 @@ void PLSR_Route_Start(PLSR_RouteConfig_t* route)
// 启动第一段
PLSR_Section_StartNewSection(route);
// 计算第一段需要发送的脉冲数
PLSR_SectionConfig_t* first_section = &route->section[route->current_section_num - 1];
uint32_t first_pulse_target;
if (route->mode == PLSR_MODE_RELATIVE)
{
// 相对模式:每段发送指定的脉冲数
first_pulse_target = first_section->target_pulse;
}
else
{
// 绝对模式:发送到绝对位置所需的脉冲数
// 第一段从0位置开始,所以脉冲数就是目标位置
first_pulse_target = first_section->target_pulse;
}
// 确保脉冲数有效
if (first_pulse_target > 0 && first_pulse_target <= 0xFFFF)
{
__HAL_TIM_SetAutoreload(&htim2, first_pulse_target);
}
else
{
// 脉冲数无效,设置为1避免除零错误
__HAL_TIM_SetAutoreload(&htim2, 1);
}
// 重置TIM2计数器
__HAL_TIM_SET_COUNTER(&htim2, 0);
if(route->start_freq > 0)
{
PLSR_PWM_SetFrequency(route->start_freq); // 设置初始PWM频率
PLSR_PWM_Start(); // 立即启动PWM输出
}
// 启动定时器
PLSR_TIM6_Start(); // 启动TIM6用于频率更新和等待时间计时
HAL_TIM_Base_Start_IT(&htim2); // 启动TIM2中断用于段切换
@@ -1843,6 +1808,8 @@ void PLSR_Section_StartNewSection(PLSR_RouteConfig_t* route)
// 设置本段的目标频率到路径控制结构体中
route->target_freq = current_section->target_freq;
if(current_section->section_num != route->section_num)
{
// 根据等待条件决定运行状态和TIM2设置
if(current_section->wait_condition.wait_type == PLSR_WAIT_PLUSEEND)
{
@@ -1888,6 +1855,25 @@ void PLSR_Section_StartNewSection(PLSR_RouteConfig_t* route)
__HAL_TIM_SetAutoreload(&htim2, route->decel_pulse_count);
}
}
}
else
{
if(route->run_state == PLSR_STATE_ACCEL)
{
// 如果是加速状态,设置TIM2自动重装值为加速脉冲数
__HAL_TIM_SetAutoreload(&htim2, route->accel_pulse_count);
}
else if(route->run_state == PLSR_STATE_CONST)
{
// 如果是匀速状态,设置TIM2自动重装值为匀速脉冲数
__HAL_TIM_SetAutoreload(&htim2, route->const_pulse_count);
}
else if(route->run_state == PLSR_STATE_DECEL)
{
// 如果是减速状态,设置TIM2自动重装值为减速脉冲数
__HAL_TIM_SetAutoreload(&htim2, route->decel_pulse_count);
}
}
// 重置TIM2计数器
__HAL_TIM_SET_COUNTER(&htim2, 0);


+ 646
- 646
PLSR/PLSR/EWARM/test.1.dep
Failā izmaiņas netiks attēlotas, jo tās ir par lielu
Parādīt failu


Binārs
PLSR/PLSR/EWARM/test.1/Exe/test.1.sim Parādīt failu


Notiek ielāde…
Atcelt
Saglabāt