Parcourir la source

解决临时修改频率导致卡顿的bug,且解决临时修改频率会出现路径不结束的问题,当前存在问题:

1. 高频时会导致提前加速或者减速到目标频率的问题,
2. 临时修改频率会导致脉冲多发的问题
1
JIU JIALIN il y a 1 mois
Parent
révision
9125c6375b
4 fichiers modifiés avec 677 ajouts et 659 suppressions
  1. +35
    -17
      PLSR/PLSR/Core/Src/tim.c
  2. +12
    -12
      PLSR/PLSR/EWARM/settings/test.1.dnx
  3. +630
    -630
      PLSR/PLSR/EWARM/test.1.dep
  4. BIN
      PLSR/PLSR/EWARM/test.1/Exe/test.1.sim

+ 35
- 17
PLSR/PLSR/Core/Src/tim.c Voir le fichier

@@ -741,14 +741,31 @@ void PLSR_PWM_Stop(void)
} }




/**
* @brief 计算定时器参数
* @param frequency: 目标频率(Hz)
* @param prescaler: 预分频器值指针
* @param period: 周期值指针
* @retval None
* @note 根据目标频率计算TIM10的预分频器和周期值
*/
// /**
// * @brief 计算定时器参数
// * @param frequency: 目标频率(Hz)
// * @param prescaler: 预分频器值指针
// * @param period: 周期值指针
// * @retval None
// * @note 根据目标频率计算TIM10的预分频器和周期值
// */
// static void PLSR_CalculateTimerParams(uint32_t frequency, uint16_t* prescaler, uint32_t* period)
// {
// if (frequency < PLSR_PWM_FREQ_MIN) frequency = PLSR_PWM_FREQ_MIN;
// if (frequency > PLSR_PWM_FREQ_MAX) frequency = PLSR_PWM_FREQ_MAX;
// uint32_t psc; uint32_t arr; uint32_t f = frequency;
// // PLSR_Calc_TimerParams((uint32_t)(f_hz + 0.5f), &psc, &arr);
// uint32_t timer_clock = 168000000;
// psc = 1;
// while (timer_clock / (psc + 1) / f > 65535)
// {
// psc++; if (psc > 0XFFFF) psc = 0XFFFF;
// }
// arr = (timer_clock / (psc + 1)) / f - 1;
// if (arr < 2) arr = 2;
// *prescaler = psc;
// *period = arr;
// }
static void PLSR_CalculateTimerParams(uint32_t frequency, uint16_t* prescaler, uint32_t* period) static void PLSR_CalculateTimerParams(uint32_t frequency, uint16_t* prescaler, uint32_t* period)
{ {
if (frequency < PLSR_PWM_FREQ_MIN) frequency = PLSR_PWM_FREQ_MIN; if (frequency < PLSR_PWM_FREQ_MIN) frequency = PLSR_PWM_FREQ_MIN;
@@ -757,6 +774,7 @@ static void PLSR_CalculateTimerParams(uint32_t frequency, uint16_t* prescaler, u
const uint32_t timer_clock = 168000000UL; // 定时器时钟 const uint32_t timer_clock = 168000000UL; // 定时器时钟
uint32_t divider = (timer_clock + frequency / 2) / frequency; // 四舍五入 uint32_t divider = (timer_clock + frequency / 2) / frequency; // 四舍五入


if (divider > 0xFFFFFFFF) divider = 0xFFFFFFFF; // 防止溢出
if (divider < 2) divider = 2; // 至少 2 if (divider < 2) divider = 2; // 至少 2


// 限制 ARR <= 65535 // 限制 ARR <= 65535
@@ -772,6 +790,7 @@ static void PLSR_CalculateTimerParams(uint32_t frequency, uint16_t* prescaler, u
} }





/** /**
* @brief 设置PWM频率 * @brief 设置PWM频率
* @param frequency: PWM频率 (1Hz-100kHz) * @param frequency: PWM频率 (1Hz-100kHz)
@@ -1536,10 +1555,11 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
(((uint32_t)ModbusSlave.holding_regs[256+(16*(g_plsr_route.current_section_num-1))]) | (((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)ModbusSlave.holding_regs[257+(16*(g_plsr_route.current_section_num-1))]<<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.route_state == PLSR_ROUTE_RUNNING)
{ {
PLSR_PWM_Stop(); PLSR_PWM_Stop();
AllPluse += current_tim2_count; // 累加当前段已发送的脉冲数
AllPluse += __HAL_TIM_GET_COUNTER(&htim2); // 累加当前段已发送的脉冲数
PLSR_Section_StartNewSection(&g_plsr_route); ///<重新启动当前段 PLSR_Section_StartNewSection(&g_plsr_route); ///<重新启动当前段
} }
@@ -2489,14 +2509,12 @@ void PLSR_Accel_Process(PLSR_RouteConfig_t* route)
if (calculated_freq <= route->target_freq) if (calculated_freq <= route->target_freq)
{ {
calculated_freq = route->target_freq; // 限制到目标频率 calculated_freq = route->target_freq; // 限制到目标频率
// 如果目标频率为0,说明减速到停止
if (route->target_freq == 0)
if(route->target_freq == 0)
{ {
route->run_state = PLSR_STATE_IDLE; // 切换到空闲状态
PLSR_PWM_Stop(); // 停止PWM输出
return;
}
PLSR_HandleSectionEnd(); // 处理段结束逻辑
// 如果目标频率为0,停止PWM输出
PLSR_PWM_Stop();
}
} }
// 只有当计算出的频率与当前频率不同时才更新PWM频率 // 只有当计算出的频率与当前频率不同时才更新PWM频率


+ 12
- 12
PLSR/PLSR/EWARM/settings/test.1.dnx Voir le fichier

@@ -14,10 +14,10 @@
<StLinkDriver> <StLinkDriver>
<stlinkserialNo>46232557</stlinkserialNo> <stlinkserialNo>46232557</stlinkserialNo>
<stlinkfoundProbes /> <stlinkfoundProbes />
<stlinkResetStyle>0</stlinkResetStyle>
<stlinkResetStrategy>2</stlinkResetStrategy>
<CStepIntDis>_ 0</CStepIntDis> <CStepIntDis>_ 0</CStepIntDis>
<LeaveTargetRunning>_ 0</LeaveTargetRunning> <LeaveTargetRunning>_ 0</LeaveTargetRunning>
<stlinkResetStyle>0</stlinkResetStyle>
<stlinkResetStrategy>2</stlinkResetStrategy>
</StLinkDriver> </StLinkDriver>
<DebugChecksum> <DebugChecksum>
<Checksum>3785312791</Checksum> <Checksum>3785312791</Checksum>
@@ -84,6 +84,13 @@
<LogFile>_ ""</LogFile> <LogFile>_ ""</LogFile>
<Category>_ 0</Category> <Category>_ 0</Category>
</LogFile> </LogFile>
<DisassembleMode>
<mode>0</mode>
</DisassembleMode>
<Aliases>
<Count>0</Count>
<SuppressDialog>0</SuppressDialog>
</Aliases>
<Trace2> <Trace2>
<Enabled>0</Enabled> <Enabled>0</Enabled>
<ShowSource>0</ShowSource> <ShowSource>0</ShowSource>
@@ -129,6 +136,9 @@
<ShowTimeSum>1</ShowTimeSum> <ShowTimeSum>1</ShowTimeSum>
<SumSortOrder>0</SumSortOrder> <SumSortOrder>0</SumSortOrder>
</EventLog> </EventLog>
<Breakpoints2>
<Count>0</Count>
</Breakpoints2>
<DriverProfiling> <DriverProfiling>
<Enabled>0</Enabled> <Enabled>0</Enabled>
<Mode>3</Mode> <Mode>3</Mode>
@@ -142,14 +152,4 @@
<CallStackStripe> <CallStackStripe>
<ShowTiming>1</ShowTiming> <ShowTiming>1</ShowTiming>
</CallStackStripe> </CallStackStripe>
<DisassembleMode>
<mode>0</mode>
</DisassembleMode>
<Breakpoints2>
<Count>0</Count>
</Breakpoints2>
<Aliases>
<Count>0</Count>
<SuppressDialog>0</SuppressDialog>
</Aliases>
</settings> </settings>

+ 630
- 630
PLSR/PLSR/EWARM/test.1.dep
Fichier diff supprimé car celui-ci est trop grand
Voir le fichier


BIN
PLSR/PLSR/EWARM/test.1/Exe/test.1.sim Voir le fichier


Chargement…
Annuler
Enregistrer