| @@ -17,29 +17,29 @@ | |||
| */ | |||
| typedef struct { | |||
| uint32_t accel_pulses; /* 入口到目标频率需要的脉冲数 */ | |||
| uint32_t constant_pulses; /* 保持目标频率的脉冲数 */ | |||
| uint32_t const_pulses; /* 保持目标频率的脉冲数 */ | |||
| uint32_t decel_pulses; /* 目标到出口频率需要的脉冲数 */ | |||
| uint32_t start_frequency_hz; /* 本段实际入口频率 */ | |||
| uint32_t target_frequency_hz; /* 实际目标频率,短段可能被降低 */ | |||
| uint32_t end_frequency_hz; /* 本段出口频率 */ | |||
| uint32_t start_freq_hz; /* 本段实际入口频率 */ | |||
| uint32_t target_freq_hz; /* 实际目标频率,短段可能被降低 */ | |||
| uint32_t end_freq_hz; /* 本段出口频率 */ | |||
| uint32_t accel_rate_hz_per_s; /* 升高频率时使用的变化率 */ | |||
| uint32_t decel_rate_hz_per_s; /* 降低频率时使用的变化率 */ | |||
| PlsrAccelMode_e curve_mode; /* 直线 / S / 正弦 */ | |||
| } PlsrAccelPlan_t; | |||
| /** 配置起速 → 规划入口:起速>目标用起速;否则目标与起跳比较取其一 */ | |||
| uint32_t PlsrAccelCurveResolveStartHz(uint32_t configured_frequency_hz, | |||
| uint32_t target_frequency_hz, | |||
| uint32_t PlsrAccelCurveResolveStartHz(uint32_t configured_freq_hz, | |||
| uint32_t target_freq_hz, | |||
| uint32_t default_speed_hz, | |||
| uint32_t acceleration_time_ms, | |||
| uint32_t deceleration_time_ms); | |||
| uint32_t accel_time_ms, | |||
| uint32_t decel_time_ms); | |||
| /** 配置止速 → 规划出口:止速>目标用止速;否则目标与起跳比较取其一(不默认到 0) */ | |||
| uint32_t PlsrAccelCurveResolveEndHz(uint32_t configured_frequency_hz, | |||
| uint32_t target_frequency_hz, | |||
| uint32_t PlsrAccelCurveResolveEndHz(uint32_t configured_freq_hz, | |||
| uint32_t target_freq_hz, | |||
| uint32_t default_speed_hz, | |||
| uint32_t acceleration_time_ms, | |||
| uint32_t deceleration_time_ms); | |||
| uint32_t accel_time_ms, | |||
| uint32_t decel_time_ms); | |||
| /** | |||
| * 规划一整段脉冲域三相预算与实际峰值 | |||
| @@ -47,17 +47,17 @@ uint32_t PlsrAccelCurveResolveEndHz(uint32_t configured_frequency_hz, | |||
| */ | |||
| void PlsrAccelCurvePlan(PlsrAccelPlan_t *plan, | |||
| uint32_t total_pulses, | |||
| uint32_t start_frequency_hz, | |||
| uint32_t target_frequency_hz, | |||
| uint32_t end_frequency_hz, | |||
| uint32_t start_freq_hz, | |||
| uint32_t target_freq_hz, | |||
| uint32_t end_freq_hz, | |||
| uint32_t default_speed_hz, | |||
| uint32_t acceleration_time_ms, | |||
| uint32_t deceleration_time_ms, | |||
| uint32_t accel_time_ms, | |||
| uint32_t decel_time_ms, | |||
| PlsrAccelMode_e curve_mode); | |||
| /** 按已完成脉冲数取频(任务/预览;ISR 热路径用 PlsrAccelNextFrequency) */ | |||
| /** 按已完成脉冲数取频(任务/预览;ISR 热路径用 PlsrAccelNextFreq) */ | |||
| uint32_t PlsrAccelCurveFreqAtPulse(const PlsrAccelPlan_t *plan, | |||
| uint32_t completed_segment_pulses); | |||
| uint32_t completed_seg_pulses); | |||
| /** | |||
| * 单相逐脉冲运行态(ISR 热路径,每来一个 UPDATE 调 Step 一次) | |||
| @@ -65,21 +65,21 @@ uint32_t PlsrAccelCurveFreqAtPulse(const PlsrAccelPlan_t *plan, | |||
| * S/正弦:查预计算频率表(开相 BeginAcc/BeginDec 时填好) | |||
| */ | |||
| typedef struct { | |||
| uint32_t current_frequency_hz; /* 当前输出频率 */ | |||
| uint32_t start_frequency_hz; /* 当前相起点频率 */ | |||
| uint32_t end_frequency_hz; /* 当前相终点频率 */ | |||
| uint32_t acceleration_hz_per_s; /* 当前相使用的变化率 */ | |||
| uint32_t cur_freq_hz; /* 当前输出频率 */ | |||
| uint32_t start_freq_hz; /* 当前相起点频率 */ | |||
| uint32_t end_freq_hz; /* 当前相终点频率 */ | |||
| uint32_t accel_hz_per_s; /* 当前相使用的变化率 */ | |||
| uint32_t completed_pulses; /* 当前相已经步进的脉冲数 */ | |||
| uint32_t total_pulses; /* 当前相计划步进的脉冲数 */ | |||
| uint32_t elapsed_time_us; /* 时间曲线已经经过的时间 */ | |||
| uint32_t jerk_time_us; /* S 曲线单个 jerk 阶段时间 */ | |||
| uint32_t constant_accel_time_us; /* S 曲线恒加速阶段时间 */ | |||
| uint32_t const_accel_time_us; /* S 曲线恒加速阶段时间 */ | |||
| uint32_t ramp_time_us; /* 整个斜坡时间 */ | |||
| uint32_t table_stride; /* 每几个脉冲读取一个表项 */ | |||
| uint32_t table_length; /* 表中有效项数 */ | |||
| uint8_t frequency_rising; /* 1=频率升高,0=降低 */ | |||
| uint8_t freq_rising; /* 1=频率升高,0=降低 */ | |||
| uint8_t is_active; /* 1=当前相仍在运行 */ | |||
| uint8_t frequency_table_id; /* 0=不用表,1=加速表,2=减速表 */ | |||
| uint8_t freq_table_id; /* 0=不用表,1=加速表,2=减速表 */ | |||
| PlsrAccelMode_e curve_mode; | |||
| } PlsrAccelRuntime_t; | |||
| @@ -88,16 +88,16 @@ extern PlsrAccelPlan_t g_plsr_accel_plan; | |||
| extern PlsrAccelRuntime_t g_plsr_accel_runtime; | |||
| /** PlanSeg 后调用:预建 S/正弦加减速频率表(勿在 ISR) */ | |||
| void PlsrAccelPrebuildFrequencyTables(const PlsrAccelPlan_t *plan); | |||
| void PlsrAccelPrebuildFreqTables(const PlsrAccelPlan_t *plan); | |||
| void PlsrAccelBeginAcceleration(PlsrAccelRuntime_t *runtime, | |||
| void PlsrAccelBeginAccel(PlsrAccelRuntime_t *runtime, | |||
| const PlsrAccelPlan_t *plan); | |||
| void PlsrAccelBeginDeceleration(PlsrAccelRuntime_t *runtime, | |||
| void PlsrAccelBeginDecel(PlsrAccelRuntime_t *runtime, | |||
| const PlsrAccelPlan_t *plan); | |||
| void PlsrAccelBeginConstantSpeed(PlsrAccelRuntime_t *runtime, | |||
| void PlsrAccelBeginConstSpeed(PlsrAccelRuntime_t *runtime, | |||
| const PlsrAccelPlan_t *plan); | |||
| /** 本相前进 1 脉冲,返回下一拍命令频率 */ | |||
| uint32_t PlsrAccelNextFrequency(PlsrAccelRuntime_t *runtime); | |||
| uint32_t PlsrAccelNextFreq(PlsrAccelRuntime_t *runtime); | |||
| #endif | |||
| @@ -57,9 +57,9 @@ static void PlsrCommandPublishMonitor(void) | |||
| if (g_plsr_busy != 0U) | |||
| { | |||
| PlsrCommandWriteDWord(PLSR_MON_FREQ_L, g_plsr_output_frequency_hz); | |||
| PlsrCommandWriteDWord(PLSR_MON_FREQ_L, g_plsr_output_freq_hz); | |||
| WriteHoldReg(PLSR_MON_RUN_STATUS, 1U); | |||
| WriteHoldReg(PLSR_MON_CUR_SEG, (uint16_t)(g_plsr_current_segment_index + 1U)); | |||
| WriteHoldReg(PLSR_MON_CUR_SEG, (uint16_t)(g_plsr_cur_seg_idx + 1U)); | |||
| } | |||
| else | |||
| { | |||
| @@ -118,7 +118,7 @@ void PlsrCommandInit(void) | |||
| */ | |||
| void PlsrCommandOnSegFreqHoldWrite(uint16_t start_addr, uint16_t quantity) | |||
| { | |||
| uint16_t current_seg;//当前运行段 | |||
| uint16_t cur_seg;//当前运行段 | |||
| uint16_t seg;//当前改频段 | |||
| uint16_t offset;//偏移量 | |||
| uint32_t freqency; | |||
| @@ -147,8 +147,8 @@ void PlsrCommandOnSegFreqHoldWrite(uint16_t start_addr, uint16_t quantity) | |||
| return; | |||
| } | |||
| current_seg = (uint16_t)(g_plsr_current_segment_index + 1U); | |||
| if ((current_seg < 1U) || ((uint16_t)(current_seg - 1U) != seg)) | |||
| cur_seg = (uint16_t)(g_plsr_cur_seg_idx + 1U); | |||
| if ((cur_seg < 1U) || ((uint16_t)(cur_seg - 1U) != seg)) | |||
| { | |||
| return; | |||
| } | |||
| @@ -162,7 +162,7 @@ void PlsrCommandOnSegFreqHoldWrite(uint16_t start_addr, uint16_t quantity) | |||
| return; | |||
| } | |||
| g_plsr_segments[seg].freq_hz = (int32_t)freqency; | |||
| g_plsr_segs[seg].freq_hz = (int32_t)freqency; | |||
| /* 运行中改频只把该段频率写入 BKP */ | |||
| PlsrPersistSaveSegFreqToBkp(seg, freqency); | |||
| @@ -3,7 +3,7 @@ | |||
| * @brief 参数块管理实现:运行映像 + 分帧导入/导出 + ParamBlockTask | |||
| * | |||
| * @details 模块职责 | |||
| * 维护公共参数 g_plsr_config 和段参数 g_plsr_segments[],实现寄存器与 | |||
| * 维护公共参数 g_plsr_config 和段参数 g_plsr_segs[],实现寄存器与 | |||
| * 运行参数之间的双向转换,以及「5+N 分帧」收齐后的异步导入 | |||
| * | |||
| * 与其它模块关系 | |||
| @@ -18,7 +18,7 @@ | |||
| #include "ucos_ii.h" | |||
| PlsrCfg_t g_plsr_config; | |||
| PlsrSeg_t g_plsr_segments[PLSR_SEG_MAX]; | |||
| PlsrSeg_t g_plsr_segs[PLSR_SEG_MAX]; | |||
| static OS_EVENT *s_param_sem; /* 分帧收齐后唤醒 ParamBlockTask */ | |||
| static volatile uint16_t s_expect_frames; /* 本批期望总帧数 = 5 + 段数 */ | |||
| @@ -249,27 +249,27 @@ uint8_t PlsrParamBlockApplyFromHold(void) | |||
| for (i = 0U; i < n; i++) | |||
| { | |||
| base = (uint16_t)(PLSR_REG_SEG1_BASE + i * PLSR_SEG_STRIDE); | |||
| g_plsr_segments[i].freq_hz = | |||
| g_plsr_segs[i].freq_hz = | |||
| (int32_t)PlsrParamReadDWord((uint16_t)(base + PLSR_SEG_OFF_FREQ_L)); | |||
| if (PlsrParamIsSegFreqValid(g_plsr_segments[i].freq_hz) == 0U) | |||
| if (PlsrParamIsSegFreqValid(g_plsr_segs[i].freq_hz) == 0U) | |||
| { | |||
| fault = PLSR_ERR_FREQ_ILLEGAL; | |||
| } | |||
| g_plsr_segments[i].pulse_cnt = | |||
| g_plsr_segs[i].pulse_cnt = | |||
| (int32_t)PlsrParamReadDWord((uint16_t)(base + PLSR_SEG_OFF_PULSE_L)); | |||
| if (PlsrParamIsPulseCntValid(g_plsr_segments[i].pulse_cnt) == 0U) | |||
| if (PlsrParamIsPulseCntValid(g_plsr_segs[i].pulse_cnt) == 0U) | |||
| { | |||
| fault = PLSR_ERR_PULSE_RANGE; | |||
| } | |||
| g_plsr_segments[i].wait_type = | |||
| g_plsr_segs[i].wait_type = | |||
| (PlsrWaitType_e)ReadHoldReg((uint16_t)(base + PLSR_SEG_OFF_WAIT)); | |||
| g_plsr_segments[i].wait_ms = | |||
| g_plsr_segs[i].wait_ms = | |||
| ReadHoldReg((uint16_t)(base + PLSR_SEG_OFF_WAIT_MS)); | |||
| g_plsr_segments[i].act_ms = | |||
| g_plsr_segs[i].act_ms = | |||
| ReadHoldReg((uint16_t)(base + PLSR_SEG_OFF_ACT_MS)); | |||
| g_plsr_segments[i].jump_seg = | |||
| g_plsr_segs[i].jump_seg = | |||
| ReadHoldReg((uint16_t)(base + PLSR_SEG_OFF_JUMP)); | |||
| } | |||
| } | |||
| @@ -4,7 +4,7 @@ | |||
| * | |||
| * @details 模块职责 | |||
| * 1. 定义公共参数区 0x1000~0x1013、段表区 0x1100+i*0x10 的地址与字段语义; | |||
| * 2. 维护 g_plsr_config / g_plsr_segments[]; | |||
| * 2. 维护 g_plsr_config / g_plsr_segs[]; | |||
| * 3. 支持上位机「5 公共帧 + N 段帧」分帧 FC10 写入:收齐后 ApplyFromHold; | |||
| * 4. 上电由 PersistLoad 填 hold;ExportToHold 仅保留作调试接口。 | |||
| * | |||
| @@ -168,7 +168,7 @@ typedef struct { | |||
| /* ---------- 运行参数 ---------- */ | |||
| extern PlsrCfg_t g_plsr_config; | |||
| extern PlsrSeg_t g_plsr_segments[PLSR_SEG_MAX]; | |||
| extern PlsrSeg_t g_plsr_segs[PLSR_SEG_MAX]; | |||
| /** @return 有效段数,钳制到 [0, PLSR_SEG_MAX] */ | |||
| uint16_t PlsrParamGetSegCount(void); | |||
| @@ -202,7 +202,7 @@ void PlsrParamBlockTask(void *pArg); | |||
| void PlsrParamBlockOnHoldWrite(uint16_t start_addr, uint16_t quantity); | |||
| /** | |||
| * @brief 保持寄存器 → g_plsr_config / g_plsr_segments,边拷贝边校验 | |||
| * @brief 保持寄存器 → g_plsr_config / g_plsr_segs,边拷贝边校验 | |||
| * @return 1=全部通过;0=存在门禁故障 | |||
| */ | |||
| uint8_t PlsrParamBlockApplyFromHold(void); | |||
| @@ -26,7 +26,7 @@ | |||
| /* run_control 拥有的共享运行状态;段下标从 0 开始。 */ | |||
| extern volatile uint8_t g_plsr_busy; | |||
| extern volatile uint16_t g_plsr_current_segment_index; | |||
| extern volatile uint16_t g_plsr_cur_seg_idx; | |||
| extern volatile int32_t g_plsr_accumulated_pulses; | |||
| #include "plsr_param.h" | |||
| @@ -33,7 +33,7 @@ TIM_HandleTypeDef htim13; | |||
| #define PLSR_Y3_PORT GPIOF | |||
| #define PLSR_Y3_PIN GPIO_PIN_9 | |||
| volatile uint32_t g_plsr_output_frequency_hz; | |||
| volatile uint32_t g_plsr_output_freq_hz; | |||
| volatile uint8_t g_plsr_pwm_running; | |||
| uint8_t g_plsr_direction_forward; | |||
| uint8_t g_plsr_direction_valid; | |||
| @@ -272,7 +272,7 @@ static void PlsrPulseDriverTimInitOne(TIM_HandleTypeDef *htim, TIM_TypeDef *inst | |||
| /** @brief 驱动初始化 */ | |||
| void PlsrPulseDriverInit(void) | |||
| { | |||
| g_plsr_output_frequency_hz = 0U; | |||
| g_plsr_output_freq_hz = 0U; | |||
| g_plsr_pwm_running = 0U; | |||
| g_plsr_direction_forward = 0U; | |||
| g_plsr_direction_valid = 0U; | |||
| @@ -554,7 +554,7 @@ static void PlsrPulseDriverLoadRegs(uint32_t freq_hz) | |||
| if (freq_hz == 0U) | |||
| { | |||
| PlsrPulseDriverStopHtim(htim); | |||
| g_plsr_output_frequency_hz = 0U; | |||
| g_plsr_output_freq_hz = 0U; | |||
| g_plsr_pwm_running = 0U; | |||
| s_last_psc = 0xFFFFFFFFUL; | |||
| s_last_arr = 0xFFFFFFFFUL; | |||
| @@ -578,7 +578,7 @@ static void PlsrPulseDriverLoadRegs(uint32_t freq_hz) | |||
| ccr = 1U; | |||
| } | |||
| g_plsr_output_frequency_hz = freq_hz; | |||
| g_plsr_output_freq_hz = freq_hz; | |||
| s_last_psc = psc; | |||
| s_last_arr = arr; | |||
| s_last_ccr = ccr; | |||
| @@ -677,7 +677,7 @@ static void PlsrPulseDriverCommitOutput(void) | |||
| */ | |||
| static void PlsrPulseDriverStartCommon(uint32_t freq_hz) | |||
| { | |||
| if ((s_regs_prepared == 0U) || (freq_hz != g_plsr_output_frequency_hz) || (freq_hz == 0U)) | |||
| if ((s_regs_prepared == 0U) || (freq_hz != g_plsr_output_freq_hz) || (freq_hz == 0U)) | |||
| { | |||
| PlsrPulseDriverLoadRegs(freq_hz); | |||
| } | |||
| @@ -702,7 +702,7 @@ void PlsrPulseDriverSetFreq(uint32_t freq_hz) | |||
| uint32_t clk_hz; | |||
| TIM_HandleTypeDef *htim; | |||
| if (freq_hz == g_plsr_output_frequency_hz) | |||
| if (freq_hz == g_plsr_output_freq_hz) | |||
| { | |||
| return; | |||
| } | |||
| @@ -715,7 +715,7 @@ void PlsrPulseDriverSetFreq(uint32_t freq_hz) | |||
| if (freq_hz == 0U) | |||
| { | |||
| PlsrPulseDriverStopHtim(htim); | |||
| g_plsr_output_frequency_hz = 0U; | |||
| g_plsr_output_freq_hz = 0U; | |||
| g_plsr_pwm_running = 0U; | |||
| s_last_psc = 0xFFFFFFFFUL; | |||
| s_last_arr = 0xFFFFFFFFUL; | |||
| @@ -734,7 +734,7 @@ void PlsrPulseDriverSetFreq(uint32_t freq_hz) | |||
| if ((psc == s_last_psc) && (arr == s_last_arr)) | |||
| { | |||
| g_plsr_output_frequency_hz = freq_hz; | |||
| g_plsr_output_freq_hz = freq_hz; | |||
| return; | |||
| } | |||
| @@ -760,7 +760,7 @@ void PlsrPulseDriverSetFreq(uint32_t freq_hz) | |||
| __HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE); | |||
| } | |||
| g_plsr_output_frequency_hz = freq_hz; | |||
| g_plsr_output_freq_hz = freq_hz; | |||
| s_last_psc = psc; | |||
| s_last_arr = arr; | |||
| } | |||
| @@ -811,7 +811,7 @@ void PlsrPulseDriverSetFreqIsr(uint32_t freq_hz) | |||
| } | |||
| /* 匀速热路径:频率未变 → 不算量化、不写寄存器 */ | |||
| if (freq_hz == g_plsr_output_frequency_hz) | |||
| if (freq_hz == g_plsr_output_freq_hz) | |||
| { | |||
| return; | |||
| } | |||
| @@ -844,7 +844,7 @@ void PlsrPulseDriverSetFreqIsr(uint32_t freq_hz) | |||
| if ((psc == s_last_psc) && (arr == s_last_arr)) | |||
| { | |||
| g_plsr_output_frequency_hz = freq_hz; | |||
| g_plsr_output_freq_hz = freq_hz; | |||
| return; | |||
| } | |||
| @@ -857,7 +857,7 @@ void PlsrPulseDriverSetFreqIsr(uint32_t freq_hz) | |||
| __HAL_TIM_SET_AUTORELOAD(htim, arr); | |||
| __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, ccr); | |||
| g_plsr_output_frequency_hz = freq_hz; | |||
| g_plsr_output_freq_hz = freq_hz; | |||
| s_last_psc = psc; | |||
| s_last_arr = arr; | |||
| s_last_ccr = ccr; | |||
| @@ -909,7 +909,7 @@ void PlsrPulseDriverStop(void) | |||
| PlsrPulseDriverStopHtim(&htim10); | |||
| PlsrPulseDriverStopHtim(&htim11); | |||
| PlsrPulseDriverStopHtim(&htim13); | |||
| g_plsr_output_frequency_hz = 0U; | |||
| g_plsr_output_freq_hz = 0U; | |||
| g_plsr_pwm_running = 0U; | |||
| s_last_psc = 0xFFFFFFFFUL; | |||
| s_last_arr = 0xFFFFFFFFUL; | |||
| @@ -35,7 +35,7 @@ extern TIM_HandleTypeDef htim11; | |||
| extern TIM_HandleTypeDef htim13; | |||
| /* 驱动拥有的真实输出状态,run_control 直接读取,不再保存第二份。 */ | |||
| extern volatile uint32_t g_plsr_output_frequency_hz; | |||
| extern volatile uint32_t g_plsr_output_freq_hz; | |||
| extern volatile uint8_t g_plsr_pwm_running; | |||
| extern uint8_t g_plsr_direction_forward; | |||
| extern uint8_t g_plsr_direction_valid; | |||