|
|
@@ -143,7 +143,7 @@ void MX_TIM2_Init(void) |
|
|
|
} |
|
|
|
// 配置外部时钟源 - ETR模式 |
|
|
|
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_ETRMODE2; // 外部时钟模式2 |
|
|
|
sClockSourceConfig.ClockPolarity = TIM_CLOCKPOLARITY_NONINVERTED; // 下降沿触发 |
|
|
|
sClockSourceConfig.ClockPolarity = TIM_CLOCKPOLARITY_NONINVERTED; // 上升沿触发 |
|
|
|
sClockSourceConfig.ClockPrescaler = TIM_CLOCKPRESCALER_DIV1; // 不分频 |
|
|
|
sClockSourceConfig.ClockFilter = 0; // 无滤波 |
|
|
|
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) |
|
|
@@ -704,38 +704,69 @@ void PLSR_PWM_Start(void) |
|
|
|
* @retval None |
|
|
|
* @note 根据g_plsr_route.output_port选择目标定时器:0-TIM10, 1-TIM11, 2-TIM13, 3-TIM14 |
|
|
|
*/ |
|
|
|
void PLSR_PWM_Stop(void) |
|
|
|
void PLSR_Section_PWM_Stop(void) |
|
|
|
{ |
|
|
|
// 根据output_port选择目标定时器并停止PWM输出 |
|
|
|
switch(g_plsr_route.output_port) |
|
|
|
{ |
|
|
|
case 0: // TIM10 |
|
|
|
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); // |
|
|
|
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0); // |
|
|
|
//HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1); |
|
|
|
break; |
|
|
|
|
|
|
|
case 1: // TIM11 |
|
|
|
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); // |
|
|
|
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0); // |
|
|
|
//HAL_TIM_PWM_Stop(&htim11, TIM_CHANNEL_1); |
|
|
|
break; |
|
|
|
|
|
|
|
case 2: // TIM13 |
|
|
|
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); // |
|
|
|
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0); // |
|
|
|
//HAL_TIM_PWM_Stop(&htim13, TIM_CHANNEL_1); |
|
|
|
break; |
|
|
|
|
|
|
|
case 3: // TIM14 |
|
|
|
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); // |
|
|
|
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0); // |
|
|
|
//HAL_TIM_PWM_Stop(&htim14, TIM_CHANNEL_1); |
|
|
|
break; |
|
|
|
|
|
|
|
default: // 默认使用TIM10 |
|
|
|
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); // |
|
|
|
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0); // |
|
|
|
//HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void PLSR_Route_PWM_Stop() |
|
|
|
{ |
|
|
|
// 根据output_port选择目标定时器并停止PWM输出 |
|
|
|
switch(g_plsr_route.output_port) |
|
|
|
{ |
|
|
|
case 0: // TIM10 |
|
|
|
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); // |
|
|
|
//HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1); |
|
|
|
break; |
|
|
|
|
|
|
|
case 1: // TIM11 |
|
|
|
//__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); // |
|
|
|
HAL_TIM_PWM_Stop(&htim11, TIM_CHANNEL_1); |
|
|
|
break; |
|
|
|
|
|
|
|
case 2: // TIM13 |
|
|
|
//__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); // |
|
|
|
HAL_TIM_PWM_Stop(&htim13, TIM_CHANNEL_1); |
|
|
|
break; |
|
|
|
|
|
|
|
case 3: // TIM14 |
|
|
|
//__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); // |
|
|
|
HAL_TIM_PWM_Stop(&htim14, TIM_CHANNEL_1); |
|
|
|
break; |
|
|
|
|
|
|
|
default: // 默认使用TIM10 |
|
|
|
//__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); // |
|
|
|
HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @brief 计算定时器参数 |
|
|
@@ -1529,10 +1560,10 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) |
|
|
|
// TIM2中断:负责段切换逻辑 |
|
|
|
if(htim->Instance == TIM2) |
|
|
|
{ |
|
|
|
PLSR_PWM_Stop(); |
|
|
|
PLSR_Section_PWM_Stop(); |
|
|
|
// 精确累加当前段已发送的脉冲数 |
|
|
|
int32_t current_section_pulses = __HAL_TIM_GetAutoreload(&htim2); |
|
|
|
AllPluse += current_section_pulses; |
|
|
|
AllPluse += current_section_pulses + 1; |
|
|
|
g_plsr_route.pulse_count = AllPluse; |
|
|
|
PLSR_UpdateGlobalPulseCount(AllPluse); |
|
|
|
// 三部分状态机处理 |
|
|
@@ -1546,11 +1577,13 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) |
|
|
|
g_plsr_route.current_part = PLSR_PART_2; |
|
|
|
g_plsr_route.run_state = g_plsr_route.part2_state; |
|
|
|
g_plsr_route.target_freq = g_plsr_route.part2_target_freq; |
|
|
|
g_plsr_route.initial_freq = g_plsr_route.current_freq; // 更新加减速初始频率 |
|
|
|
g_plsr_route.initial_freq = g_plsr_route.part2_target_freq; // 更新加减速初始频率 |
|
|
|
g_last_freq = 0; // 清零g_last_freq,防止频率计算时的累加效果 |
|
|
|
|
|
|
|
PLSR_PWM_SetFrequency(g_plsr_route.target_freq); |
|
|
|
__HAL_TIM_SetAutoreload(&htim2, g_plsr_route.const_pulse_count); |
|
|
|
|
|
|
|
g_plsr_route.current_freq = g_plsr_route.target_freq; |
|
|
|
PLSR_PWM_SetFrequency(g_plsr_route.current_freq); |
|
|
|
__HAL_TIM_SetAutoreload(&htim2, g_plsr_route.const_pulse_count - 1); |
|
|
|
__HAL_TIM_SET_COUNTER(&htim2, 0); |
|
|
|
PLSR_PWM_Start(); |
|
|
|
break; |
|
|
@@ -1563,7 +1596,7 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) |
|
|
|
g_plsr_route.target_freq = g_plsr_route.part3_target_freq; |
|
|
|
g_plsr_route.initial_freq = g_plsr_route.current_freq; // 更新加减速初始频率 |
|
|
|
g_last_freq = 0; // 清零g_last_freq,防止频率计算时的累加效果 |
|
|
|
__HAL_TIM_SetAutoreload(&htim2, g_plsr_route.decel_pulse_count); |
|
|
|
__HAL_TIM_SetAutoreload(&htim2, g_plsr_route.decel_pulse_count - 1); |
|
|
|
__HAL_TIM_SET_COUNTER(&htim2, 0); |
|
|
|
PLSR_PWM_Start(); |
|
|
|
break; |
|
|
@@ -1584,7 +1617,7 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) |
|
|
|
g_plsr_route.run_state = g_plsr_route.part3_state; |
|
|
|
g_plsr_route.target_freq = g_plsr_route.part3_target_freq; |
|
|
|
|
|
|
|
__HAL_TIM_SetAutoreload(&htim2, g_plsr_route.decel_pulse_count); |
|
|
|
__HAL_TIM_SetAutoreload(&htim2, g_plsr_route.decel_pulse_count - 1); |
|
|
|
__HAL_TIM_SET_COUNTER(&htim2, 0); |
|
|
|
PLSR_PWM_Start(); |
|
|
|
break; |
|
|
@@ -1627,7 +1660,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) |
|
|
|
{ |
|
|
|
g_plsr_mod_flag = 1; // 标记当前段目标频率被修改 |
|
|
|
PLSR_PWM_Stop(); |
|
|
|
PLSR_Section_PWM_Stop(); |
|
|
|
AllPluse += current_tim2_count; // 累加当前段已发送的脉冲数 |
|
|
|
PLSR_Section_StartNewSection(&g_plsr_route); ///<重新启动当前段 |
|
|
|
PLSR_PWM_Start(); |
|
|
@@ -1720,7 +1753,7 @@ void PLSR_Route_Init(PLSR_RouteConfig_t* route) |
|
|
|
g_last_freq = 0; // 清零上一次计算的频率 |
|
|
|
|
|
|
|
PLSR_TIM6_SetUpdateFreq(100); //初始化TIM6更新频率为1000us(1ms) |
|
|
|
PLSR_PWM_Stop(); // 确保PWM停止,避免意外输出 |
|
|
|
//PLSR_Section_PWM_Stop(); // 确保PWM停止,避免意外输出 |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@@ -1773,7 +1806,7 @@ void PLSR_Route_Stop(PLSR_RouteConfig_t* route) |
|
|
|
if (route == NULL) return; |
|
|
|
|
|
|
|
// 停止PWM输出和定时器 |
|
|
|
PLSR_PWM_Stop(); |
|
|
|
PLSR_Route_PWM_Stop(); |
|
|
|
PLSR_TIM6_Stop(); |
|
|
|
HAL_TIM_Base_Stop_IT(&htim2); // 停止TIM2中断 |
|
|
|
|
|
|
@@ -2119,7 +2152,7 @@ void PLSR_SetupThreePartExecution(PLSR_RouteConfig_t* route) |
|
|
|
route->part1_state == PLSR_STATE_DECEL || |
|
|
|
route->part1_state == PLSR_STATE_CONST) |
|
|
|
{ |
|
|
|
__HAL_TIM_SetAutoreload(&htim2, route->accel_pulse_count); |
|
|
|
__HAL_TIM_SetAutoreload(&htim2, route->accel_pulse_count - 1); |
|
|
|
route->run_state = route->part1_state; |
|
|
|
route->target_freq = route->part1_target_freq; |
|
|
|
return; // 设置完成,退出函数 |
|
|
@@ -2136,7 +2169,7 @@ void PLSR_SetupThreePartExecution(PLSR_RouteConfig_t* route) |
|
|
|
// 第二部分:匀速 |
|
|
|
if(route->const_pulse_count > 0) |
|
|
|
{ |
|
|
|
__HAL_TIM_SetAutoreload(&htim2, route->const_pulse_count); |
|
|
|
__HAL_TIM_SetAutoreload(&htim2, route->const_pulse_count - 1); |
|
|
|
route->run_state = route->part2_state; // 通常是PLSR_STATE_CONST |
|
|
|
route->target_freq = route->part2_target_freq; |
|
|
|
return; // 设置完成,退出函数 |
|
|
@@ -2153,7 +2186,7 @@ void PLSR_SetupThreePartExecution(PLSR_RouteConfig_t* route) |
|
|
|
// 第三部分:减速到0 |
|
|
|
if(route->decel_pulse_count > 0) |
|
|
|
{ |
|
|
|
__HAL_TIM_SetAutoreload(&htim2, route->decel_pulse_count); |
|
|
|
__HAL_TIM_SetAutoreload(&htim2, route->decel_pulse_count - 1); |
|
|
|
route->run_state = route->part3_state; // 通常是PLSR_STATE_DECEL |
|
|
|
route->target_freq = route->part3_target_freq; // 通常是0 |
|
|
|
return; // 设置完成,退出函数 |
|
|
@@ -2444,6 +2477,8 @@ void PLSR_Accel_Process(PLSR_RouteConfig_t* route) |
|
|
|
{ |
|
|
|
case 0: |
|
|
|
HAL_TIM_PWM_Start(&htim10, TIM_CHANNEL_1); |
|
|
|
// 触发更新事件 - 立即将新参数加载到影子寄存器 |
|
|
|
HAL_TIM_GenerateEvent(&htim10, TIM_EVENTSOURCE_UPDATE); |
|
|
|
break; |
|
|
|
case 1: |
|
|
|
HAL_TIM_PWM_Start(&htim11, TIM_CHANNEL_1); |
|
|
@@ -2585,7 +2620,7 @@ void PLSR_TaskSectionSwitch(PLSR_RouteConfig_t* route) |
|
|
|
{ |
|
|
|
/* 路径结束 */ |
|
|
|
route->route_state = PLSR_ROUTE_COMPLETED; |
|
|
|
PLSR_PWM_Stop(); |
|
|
|
PLSR_Route_PWM_Stop(); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|