Просмотр исходного кода

解决了临时修改频率会导致脉冲多发的问题,原因是修改频率的可发脉冲计算有误,当前问题:加速过程临时修改频率会导致程序卡

2
JIU JIALIN 2 месяцев назад
Родитель
Сommit
32a19a6815
6 измененных файлов: 552 добавлений и 761 удалений
  1. +2
    -2
      PLSR/PLSR/Core/Src/gpio.c
  2. +65
    -24
      PLSR/PLSR/Core/Src/tim.c
  3. +21
    -21
      PLSR/PLSR/EWARM/settings/test.1.dnx
  4. +460
    -710
      PLSR/PLSR/EWARM/test.1.dep
  5. Двоичные данные
      PLSR/PLSR/EWARM/test.1/Exe/test.1.sim
  6. +4
    -4
      PLSR/PLSR/UCOS/Config/app_cfg.h

+ 2
- 2
PLSR/PLSR/Core/Src/gpio.c Просмотреть файл

@@ -74,9 +74,9 @@ void MX_GPIO_Init(void)
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);

/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 3, 0);
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 1, 0);

HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 1, 0);

}



+ 65
- 24
PLSR/PLSR/Core/Src/tim.c Просмотреть файл

@@ -31,6 +31,7 @@ uint32_t g_last_freq = 0; // 上一次计算的频率,用于PLSR_Calc
static uint8_t s_pulse_count_direction = 1; // 脉冲计数方向(1-递增, 0-递减),用于替代dir_logic判断计数方向
uint32_t g_plsr_current_target_freq = 0; // 当前段目标频率频率(Hz),用于检测是否有频率变化
static uint8_t s_last_direction = 0xFF; // 初始值设为无效值,确保第一次总是认为有方向变化
uint8_t g_plsr_mod_flag = 0xff;

// ==================== PLSR内部变量 ====================
static uint32_t s_tim6_update_freq_us = 1000; // TIM6更新频率(微秒)
@@ -398,8 +399,8 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
__HAL_RCC_TIM6_CLK_ENABLE();

// 配置TIM6中断
HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 5, 0); // 设置中断优先级为最高(0,0)
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); // 使能TIM6中断
HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 5, 5);
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
/* USER CODE BEGIN TIM6_MspInit 1 */

/* USER CODE END TIM6_MspInit 1 */
@@ -412,9 +413,9 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
// 使能TIM10时钟
__HAL_RCC_TIM10_CLK_ENABLE();

// 配置TIM10中断
HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 5, 0); // 设置中断优先级为5
HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn); // 使能TIM10中断
// // 配置TIM10中断
// HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 5, 0); // 设置中断优先级为5
// HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn); // 使能TIM10中断
/* USER CODE BEGIN TIM10_MspInit 1 */

/* USER CODE END TIM10_MspInit 1 */
@@ -753,8 +754,15 @@ static void PLSR_CalculateTimerParams(uint32_t frequency, uint16_t* prescaler, u
{
if (frequency < PLSR_PWM_FREQ_MIN) frequency = PLSR_PWM_FREQ_MIN;
if (frequency > PLSR_PWM_FREQ_MAX) frequency = PLSR_PWM_FREQ_MAX;

const uint32_t timer_clock = 168000000UL; // 定时器时钟
uint32_t timer_clock = 0;
if(g_plsr_route.output_port == 0 || g_plsr_route.output_port == 1)
{
timer_clock = 168000000UL; // TIM10/TIM11时钟 (APB2 84MHz)
}
else
{
timer_clock = 84000000UL; // TIM13/TIM14时钟 (APB1 42MHz)
}
uint32_t divider = (timer_clock + frequency / 2) / frequency; // 四舍五入

if (divider > 0xFFFFFFFF) divider = 0xFFFFFFFF; // 防止溢出
@@ -1394,7 +1402,6 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route)
route->run_state = PLSR_STATE_CONST;
route->target_freq = v0;
}
}
}

@@ -1447,9 +1454,6 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
switch(g_plsr_route.current_part)
{
case PLSR_PART_1:
g_plsr_route.accel_pulse_count = 0; // 清零第一部分脉冲计数
// 判断下一部分
if(g_plsr_route.const_pulse_count > 0)
{
@@ -1476,7 +1480,6 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
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_SET_COUNTER(&htim2, 0);
PLSR_PWM_Start();
break;
@@ -1490,9 +1493,6 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
break;
case PLSR_PART_2:
g_plsr_route.const_pulse_count = 0; // 清零第二部分脉冲计数
// 进入第三部分:减速
if(g_plsr_route.decel_pulse_count > 0)
{
@@ -1545,6 +1545,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();
AllPluse += current_tim2_count; // 累加当前段已发送的脉冲数
PLSR_Section_StartNewSection(&g_plsr_route); ///<重新启动当前段
@@ -1829,15 +1830,60 @@ void PLSR_Section_StartNewSection(PLSR_RouteConfig_t* route)
}
else
{
if(current_section->target_pulse > 0)
if(g_plsr_mod_flag == 1)
{
current_section->actual_pulse = (current_section->target_pulse - __HAL_TIM_GET_COUNTER(&htim2));
if(route->current_part == PLSR_PART_2) //匀速过程被修改
{
// 目标频率被修改,重新计算实际脉冲数
if(current_section->target_pulse > 0)
{
current_section->actual_pulse = (current_section->target_pulse - route->accel_pulse_count - __HAL_TIM_GET_COUNTER(&htim2));
}
else
{
current_section->actual_pulse = ((-current_section->target_pulse) - route->accel_pulse_count - __HAL_TIM_GET_COUNTER(&htim2));
}
}
else if(route->current_part == PLSR_PART_1)//加速过程被修改
{
// 目标频率被修改,重新计算实际脉冲数
if(current_section->target_pulse > 0)
{
current_section->actual_pulse = (current_section->target_pulse - __HAL_TIM_GET_COUNTER(&htim2));
}
else
{
current_section->actual_pulse = ((-current_section->target_pulse) - __HAL_TIM_GET_COUNTER(&htim2));
}
}
else if(route->current_part == PLSR_PART_3)//减速过程被修改
{
// 目标频率被修改,重新计算实际脉冲数
if(current_section->target_pulse > 0)
{
current_section->actual_pulse = (current_section->target_pulse -
route->accel_pulse_count - route->const_pulse_count - __HAL_TIM_GET_COUNTER(&htim2));
}
else
{
current_section->actual_pulse = ((-current_section->target_pulse) -
route->accel_pulse_count - route->const_pulse_count - __HAL_TIM_GET_COUNTER(&htim2));
}
}
g_plsr_mod_flag = 0; // 清除修改标记
}
else
{
current_section->actual_pulse = ((-current_section->target_pulse) - __HAL_TIM_GET_COUNTER(&htim2));
if(current_section->target_pulse > 0)
{
current_section->actual_pulse = (current_section->target_pulse - __HAL_TIM_GET_COUNTER(&htim2));
}
else
{
current_section->actual_pulse = ((-current_section->target_pulse) - __HAL_TIM_GET_COUNTER(&htim2));
}
}

}
// 设置方向端子 - 使用计算后的actual_pulse确定方向
@@ -2653,8 +2699,3 @@ void PLSR_SectionSwitchTask(void *p_arg)
/* 如果信号量获取失败,继续等待下一次信号 */
}
}






+ 21
- 21
PLSR/PLSR/EWARM/settings/test.1.dnx Просмотреть файл

@@ -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>1150792608</Checksum>
@@ -75,6 +75,22 @@
<ITMportsLogFile>0</ITMportsLogFile>
<ITMlogFile>$PROJ_DIR$\ITM.log</ITMlogFile>
</SWOTraceHWSettings>
<TermIOLog>
<LoggingEnabled>_ 0</LoggingEnabled>
<LogFile>_ ""</LogFile>
</TermIOLog>
<LogFile>
<LoggingEnabled>_ 0</LoggingEnabled>
<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>
@@ -120,15 +136,9 @@
<ShowTimeSum>1</ShowTimeSum>
<SumSortOrder>0</SumSortOrder>
</EventLog>
<TermIOLog>
<LoggingEnabled>_ 0</LoggingEnabled>
<LogFile>_ ""</LogFile>
</TermIOLog>
<LogFile>
<LoggingEnabled>_ 0</LoggingEnabled>
<LogFile>_ ""</LogFile>
<Category>_ 0</Category>
</LogFile>
<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>

+ 460
- 710
PLSR/PLSR/EWARM/test.1.dep
Разница между файлами не показана из-за своего большого размера
Просмотреть файл


Двоичные данные
PLSR/PLSR/EWARM/test.1/Exe/test.1.sim Просмотреть файл


+ 4
- 4
PLSR/PLSR/UCOS/Config/app_cfg.h Просмотреть файл

@@ -21,7 +21,7 @@
*********************************************************************************************************
*/
#define APP_CFG_STARTUP_TASK_PRIO 3u
#define APP_CFG_SECTION_SWITCH_TASK_PRIO 2u // 段切换任务,高优先级确保实时响应
#define APP_CFG_SECTION_SWITCH_TASK_PRIO 2u
#define APP_CFG_MODBUS_TASK_PRIO 4u
#define APP_CFG_KEY_TASK_PRIO 5u

@@ -32,10 +32,10 @@
* TASK STACK SIZES
*********************************************************************************************************
*/
#define APP_CFG_STARTUP_TASK_STK_SIZE 256u
#define APP_CFG_STARTUP_TASK_STK_SIZE 256u
#define APP_CFG_SECTION_SWITCH_TASK_STK_SIZE 128u // 段切换任务栈大小
#define APP_CFG_MODBUS_TASK_STK_SIZE 256u
#define APP_CFG_KEY_TASK_STK_SIZE 256u
#define APP_CFG_MODBUS_TASK_STK_SIZE 256u
#define APP_CFG_KEY_TASK_STK_SIZE 256u

/*
*********************************************************************************************************


Загрузка…
Отмена
Сохранить