|
|
@@ -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频率 |
|
|
|