Quellcode durchsuchen

修复脉冲多发bug,没有考虑到0也属于CNT计数值

2
JIU JIALIN vor 1 Monat
Ursprung
Commit
7a118dba93
4 geänderte Dateien mit 705 neuen und 669 gelöschten Zeilen
  1. +2
    -1
      PLSR/PLSR/Core/Inc/tim.h
  2. +56
    -21
      PLSR/PLSR/Core/Src/tim.c
  3. +647
    -647
      PLSR/PLSR/EWARM/test.1.dep
  4. BIN
      PLSR/PLSR/EWARM/test.1/Exe/test.1.sim

+ 2
- 1
PLSR/PLSR/Core/Inc/tim.h Datei anzeigen

@@ -222,7 +222,8 @@ typedef enum {
// ==================== PWM控制函数 ====================
void PLSR_PWM_Init(void);
void PLSR_PWM_Start(void);
void PLSR_PWM_Stop(void);
void PLSR_Section_PWM_Stop(void);
void PLSR_Route_PWM_Stop();
void PLSR_PWM_SetFrequency(uint32_t frequency);

// ==================== PLSR路径控制函数 ====================


+ 56
- 21
PLSR/PLSR/Core/Src/tim.c Datei anzeigen

@@ -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;
}


+ 647
- 647
PLSR/PLSR/EWARM/test.1.dep
Datei-Diff unterdrückt, da er zu groß ist
Datei anzeigen


BIN
PLSR/PLSR/EWARM/test.1/Exe/test.1.sim Datei anzeigen


Laden…
Abbrechen
Speichern