Переглянути джерело

解决多次发送时脉冲个数紊乱的问题,原因在于实际脉冲个数的计算.

master
JIU JIALIN 1 місяць тому
джерело
коміт
f04bb3cafc
3 змінених файлів з 500 додано та 478 видалено
  1. +30
    -8
      PLSR/PLSR/Core/Src/tim.c
  2. +470
    -470
      PLSR/PLSR/EWARM/test.1.dep
  3. BIN
      PLSR/PLSR/EWARM/test.1/Exe/test.1.sim

+ 30
- 8
PLSR/PLSR/Core/Src/tim.c Переглянути файл

@@ -29,6 +29,7 @@ uint8_t g_plsr_ext_event_flag = 0; // 外部事件标志(0-无事件, 1-
int32_t g_plsr_location = 0; // 全局位置计数器(用于记录当前执行位置,支持负数)
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; // 初始值设为无效值,确保第一次总是认为有方向变化

// ==================== PLSR内部变量 ====================
static uint32_t s_tim6_update_freq_us = 1000; // TIM6更新频率(微秒)
@@ -1180,7 +1181,6 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route)
uint32_t a = route->accel_rate; // 加速度
uint32_t d = route->decel_rate; // 减速度
// 使用已计算的actual_pulse作为总脉冲数
// 在PLSR_Section_StartNewSection中已经根据模式计算了actual_pulse
int32_t total_pulses = current_section->actual_pulse; // 总脉冲数
@@ -1684,9 +1684,21 @@ void PLSR_Route_Stop(PLSR_RouteConfig_t* route)
// 重置计数器
__HAL_TIM_SET_COUNTER(&htim2, 0);
route->prevPulseCount = 0;
route->freq_step = 0;
// 重置方向相关变量
s_last_direction = 0xFF; // 重置为初始无效值,确保下次启动时正确设置方向
s_pulse_count_direction = 1; // 重置脉冲计数方向为默认值
route->accel_pulse_count = 0;
route->const_pulse_count = 0;
route->decel_pulse_count = 0;
// 重置目标频率
route->target_freq = 0;
g_plsr_current_target_freq = 0;
}


@@ -1698,7 +1710,6 @@ void PLSR_Route_Stop(PLSR_RouteConfig_t* route)
* @note 根据脉冲方向逻辑和目标脉冲数设置方向端子状态
*/
// 存储上一段的方向信息,用于检测方向变化
static uint8_t s_last_direction = 0xFF; // 初始值设为无效值,确保第一次总是认为有方向变化
static uint8_t PLSR_SetDirectionPin(PLSR_RouteConfig_t* route, PLSR_SectionConfig_t* current_section)
{
if (route == NULL || current_section == NULL) return 0;
@@ -1720,10 +1731,13 @@ static uint8_t PLSR_SetDirectionPin(PLSR_RouteConfig_t* route, PLSR_SectionConfi
s_pulse_count_direction = is_forward ? 1 : 0;
// 根据方向逻辑确定方向端子状态
if (route->dir_logic == 0) {
if (route->dir_logic == 0)
{
// 正逻辑:正向脉冲方向端子置ON(1),反向脉冲方向端子置OFF(0)
dir_pin_state = is_forward ? GPIO_PIN_SET : GPIO_PIN_RESET;
} else {
}
else
{
// 负逻辑:正向脉冲方向端子置OFF(0),反向脉冲方向端子置ON(1)
dir_pin_state = is_forward ? GPIO_PIN_RESET : GPIO_PIN_SET;
}
@@ -1776,8 +1790,17 @@ void PLSR_Section_StartNewSection(PLSR_RouteConfig_t* route)
}
else
{
// 相对模式:直接使用目标脉冲数
current_section->actual_pulse = current_section->target_pulse + route->prevPulseCount - g_plsr_location;
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));
}
// // 相对模式:直接使用目标脉冲数
// current_section->actual_pulse = current_section->target_pulse;
}
// 设置方向端子 - 使用计算后的actual_pulse确定方向
@@ -2022,7 +2045,6 @@ void PLSR_Section_SwitchNext(PLSR_RouteConfig_t* route, uint8_t is_pulse_complet
if (is_pulse_complete)
{
// 脉冲完成触发:累加整个目标脉冲数
// 使用原始的target_pulse而非actual_pulse,因为prevPulseCount需要记录原始目标值
route->prevPulseCount += current_section->target_pulse;
}
else


+ 470
- 470
PLSR/PLSR/EWARM/test.1.dep
Різницю між файлами не показано, бо вона завелика
Переглянути файл


BIN
PLSR/PLSR/EWARM/test.1/Exe/test.1.sim Переглянути файл


Завантаження…
Відмінити
Зберегти