浏览代码

解决临时修改频率的bug,但是脉冲会多发需要解决,解决了段切换不减速的bug

1
JIU JIALIN 2 个月前
父节点
当前提交
2b0671b85b
共有 4 个文件被更改,包括 508 次插入503 次删除
  1. +31
    -26
      PLSR/PLSR/Core/Src/tim.c
  2. +2
    -2
      PLSR/PLSR/EWARM/settings/test.1.dnx
  3. +475
    -475
      PLSR/PLSR/EWARM/test.1.dep
  4. 二进制
      PLSR/PLSR/EWARM/test.1/Exe/test.1.sim

+ 31
- 26
PLSR/PLSR/Core/Src/tim.c 查看文件

@@ -743,7 +743,7 @@ static void PLSR_CalculateTimerParams(uint32_t frequency, uint16_t* prescaler, u


uint32_t psc; uint32_t psc;
uint32_t arr; uint32_t arr;
uint32_t f = (uint32_t)(frequency + 0.5f);
uint32_t f = frequency;


// PLSR_Calc_TimerParams((uint32_t)(f_hz + 0.5f), &psc, &arr); // PLSR_Calc_TimerParams((uint32_t)(f_hz + 0.5f), &psc, &arr);
uint32_t timer_clock = 168000000; uint32_t timer_clock = 168000000;
@@ -1594,6 +1594,7 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
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)
{ {
PLSR_PWM_Stop();
AllPluse += current_tim2_count; // 累加当前段已发送的脉冲数 AllPluse += current_tim2_count; // 累加当前段已发送的脉冲数
PLSR_Section_StartNewSection(&g_plsr_route); ///<重新启动当前段 PLSR_Section_StartNewSection(&g_plsr_route); ///<重新启动当前段
} }
@@ -2017,6 +2018,7 @@ void PLSR_Section_StartNewSection(PLSR_RouteConfig_t* route)
if(route->current_freq > 0) if(route->current_freq > 0)
{ {
PLSR_PWM_SetFrequency(route->current_freq); PLSR_PWM_SetFrequency(route->current_freq);
PLSR_PWM_Start();
} }
// 清除外部事件标志,确保新段开始时状态干净 // 清除外部事件标志,确保新段开始时状态干净
@@ -2202,12 +2204,8 @@ uint32_t PLSR_Calculate_FreqByPosition(PLSR_RouteConfig_t* route, uint8_t is_acc
else else
{ {
// 减速过程:使用全局脉冲计数器 // 减速过程:使用全局脉冲计数器
executed_pulses = g_plsr_route.decel_pulse_count - current_tim2_count;
next_executed_pulses = executed_pulses-1;
if(next_executed_pulses < 0)
{
next_executed_pulses = 0;
}
executed_pulses = current_tim2_count;
next_executed_pulses = executed_pulses + 1;
} }
// 检查是否需要重新计算:脉冲步数、加减速状态或段号发生变化时才重新计算 // 检查是否需要重新计算:脉冲步数、加减速状态或段号发生变化时才重新计算
@@ -2219,7 +2217,6 @@ uint32_t PLSR_Calculate_FreqByPosition(PLSR_RouteConfig_t* route, uint8_t is_acc
return s_last_calculated_freq; return s_last_calculated_freq;
} }


// 使用速度位移公式 vt^2 = v0^2 + 2ax 计算当前频率,其中v0使用initial_freq作为初始速度 // 使用速度位移公式 vt^2 = v0^2 + 2ax 计算当前频率,其中v0使用initial_freq作为初始速度
uint32_t v0 = route->initial_freq; // 使用initial_freq作为初始速度v0 uint32_t v0 = route->initial_freq; // 使用initial_freq作为初始速度v0
uint64_t a = 0; uint64_t a = 0;
@@ -2253,13 +2250,18 @@ uint32_t PLSR_Calculate_FreqByPosition(PLSR_RouteConfig_t* route, uint8_t is_acc
} }
else else
{ {
uint64_t freq_squared_start = 2 * a * executed_pulses;
freq_start = integer_sqrt_64(freq_squared_start);

uint64_t v0_squared = (uint64_t)v0 * v0;
if (v0_squared >= 2 * a * executed_pulses)
{
uint64_t freq_squared_start = v0_squared - 2 * a * executed_pulses;
freq_start = integer_sqrt_64(freq_squared_start);
}
else
{
freq_start = 0;
}
} }
}

}
// 计算当前脉冲结束时的频率(executed_pulses + 1位置) // 计算当前脉冲结束时的频率(executed_pulses + 1位置)
if (is_accel) if (is_accel)
{ {
@@ -2270,8 +2272,15 @@ uint32_t PLSR_Calculate_FreqByPosition(PLSR_RouteConfig_t* route, uint8_t is_acc
else else
{ {
uint64_t v0_squared = (uint64_t)v0 * v0; uint64_t v0_squared = (uint64_t)v0 * v0;
uint64_t freq_squared_end = 2 * a * next_executed_pulses;
freq_end = integer_sqrt_64(freq_squared_end);
if (v0_squared >= 2 * a * next_executed_pulses)
{
uint64_t freq_squared_end = v0_squared - 2 * a * next_executed_pulses;
freq_end = integer_sqrt_64(freq_squared_end);
}
else
{
freq_end = 0;
}
} }
// 计算当前脉冲的平均频率 // 计算当前脉冲的平均频率
@@ -2279,10 +2288,6 @@ uint32_t PLSR_Calculate_FreqByPosition(PLSR_RouteConfig_t* route, uint8_t is_acc
// 更新全局变量(保存当前脉冲结束时的频率,供下次使用) // 更新全局变量(保存当前脉冲结束时的频率,供下次使用)
g_last_freq = freq_end; g_last_freq = freq_end;
// if(executed_pulses > 61)
// {
// printf("freq_start: %lu, freq_end: %lu, calculated_freq: %lu\r\n", freq_start, freq_end, calculated_freq);
// }
// 限制频率范围 // 限制频率范围
if (calculated_freq < PLSR_PWM_FREQ_MIN) if (calculated_freq < PLSR_PWM_FREQ_MIN)
@@ -2474,8 +2479,8 @@ void PLSR_TaskSectionSwitch(PLSR_RouteConfig_t* route)
PLSR_Section_SwitchNext(route, 0); // 外部事件触发,传入0 PLSR_Section_SwitchNext(route, 0); // 外部事件触发,传入0
/* 启动新段,设置新的脉冲参数和频率 */ /* 启动新段,设置新的脉冲参数和频率 */
PLSR_Section_StartNewSection(route); PLSR_Section_StartNewSection(route);
/* 启动PWM输出 */
PLSR_PWM_Start();
// /* 启动PWM输出 */
// PLSR_PWM_Start();
PLSR_ClearGpioTriggerFlag(); // 清除GPIO触发标志 PLSR_ClearGpioTriggerFlag(); // 清除GPIO触发标志
} }
return; // 等待外部事件时不需要继续处理 return; // 等待外部事件时不需要继续处理
@@ -2504,8 +2509,8 @@ void PLSR_TaskSectionSwitch(PLSR_RouteConfig_t* route)
PLSR_Section_SwitchNext(route, 1); // 脉冲完成触发,传入1 PLSR_Section_SwitchNext(route, 1); // 脉冲完成触发,传入1
/* 启动新段,设置新的脉冲参数和频率 */ /* 启动新段,设置新的脉冲参数和频率 */
PLSR_Section_StartNewSection(route); PLSR_Section_StartNewSection(route);
/* 启动PWM输出 */
PLSR_PWM_Start();
// /* 启动PWM输出 */
// PLSR_PWM_Start();
} }
} }
else else
@@ -2517,8 +2522,8 @@ void PLSR_TaskSectionSwitch(PLSR_RouteConfig_t* route)
PLSR_Section_SwitchNext(route, 0); // 其他等待条件触发,传入0 PLSR_Section_SwitchNext(route, 0); // 其他等待条件触发,传入0
/* 启动新段,设置新的脉冲参数和频率 */ /* 启动新段,设置新的脉冲参数和频率 */
PLSR_Section_StartNewSection(route); PLSR_Section_StartNewSection(route);
/* 启动PWM输出 */
PLSR_PWM_Start();
// /* 启动PWM输出 */
// PLSR_PWM_Start();
} }
/* 如果等待条件未满足,保持等待状态,等待下次检查 */ /* 如果等待条件未满足,保持等待状态,等待下次检查 */
} }


+ 2
- 2
PLSR/PLSR/EWARM/settings/test.1.dnx 查看文件

@@ -12,12 +12,12 @@
<ByteLimit>50</ByteLimit> <ByteLimit>50</ByteLimit>
</Stack> </Stack>
<StLinkDriver> <StLinkDriver>
<stlinkserialNo>46232557</stlinkserialNo>
<stlinkfoundProbes />
<CStepIntDis>_ 0</CStepIntDis> <CStepIntDis>_ 0</CStepIntDis>
<LeaveTargetRunning>_ 0</LeaveTargetRunning> <LeaveTargetRunning>_ 0</LeaveTargetRunning>
<stlinkResetStyle>0</stlinkResetStyle> <stlinkResetStyle>0</stlinkResetStyle>
<stlinkResetStrategy>2</stlinkResetStrategy> <stlinkResetStrategy>2</stlinkResetStrategy>
<stlinkserialNo>46232557</stlinkserialNo>
<stlinkfoundProbes />
</StLinkDriver> </StLinkDriver>
<DebugChecksum> <DebugChecksum>
<Checksum>2012208745</Checksum> <Checksum>2012208745</Checksum>


+ 475
- 475
PLSR/PLSR/EWARM/test.1.dep
文件差异内容过多而无法显示
查看文件


二进制
PLSR/PLSR/EWARM/test.1/Exe/test.1.sim 查看文件


正在加载...
取消
保存