Kaynağa Gözat

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

1. 高频时会导致提前加速或者减速到目标频率的问题,
2. 临时修改频率会导致脉冲多发的问题
1
JIU JIALIN 1 ay önce
ebeveyn
işleme
9125c6375b
4 değiştirilmiş dosya ile 677 ekleme ve 659 silme
  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 Dosyayı Görüntüle

@@ -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)
{
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; // 定时器时钟
uint32_t divider = (timer_clock + frequency / 2) / frequency; // 四舍五入

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

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



/**
* @brief 设置PWM频率
* @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[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();
AllPluse += current_tim2_count; // 累加当前段已发送的脉冲数
AllPluse += __HAL_TIM_GET_COUNTER(&htim2); // 累加当前段已发送的脉冲数
PLSR_Section_StartNewSection(&g_plsr_route); ///<重新启动当前段
}
@@ -2489,14 +2509,12 @@ void PLSR_Accel_Process(PLSR_RouteConfig_t* route)
if (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频率


+ 12
- 12
PLSR/PLSR/EWARM/settings/test.1.dnx Dosyayı Görüntüle

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

+ 630
- 630
PLSR/PLSR/EWARM/test.1.dep
Dosya farkı çok büyük olduğundan ihmal edildi
Dosyayı Görüntüle


BIN
PLSR/PLSR/EWARM/test.1/Exe/test.1.sim Dosyayı Görüntüle


Yükleniyor…
İptal
Kaydet