#ifndef PLSR_PROFILE_H #define PLSR_PROFILE_H #include "plsr_types.h" #include #ifdef __cplusplus extern "C" { #endif /* Q32.32 定点:32 位整数部分 + 32 位小数部分。 * 频率与脉冲计数全部用定点,禁止在刷新中断中使用浮点。 */ #define PLSR_PROFILE_Q32_ONE (UINT64_C(1) << 32U) /* 曲线模式与 S2 参数块中的编码一致。 */ #define PLSR_PROFILE_CURVE_LINEAR (0U) #define PLSR_PROFILE_CURVE_S (1U) #define PLSR_PROFILE_CURVE_SINE (2U) /* 单段速度规划请求。 */ typedef struct { uint32_t targetFrequencyHz; /* 本段目标频率 */ uint32_t startFrequencyHz; /* 本段起始频率(后续模式衔接用) */ uint32_t stopFrequencyHz; /* 本段终止频率(完成模式一般为 0) */ uint32_t maxFrequencyHz; /* 最高速度限幅 */ uint32_t accelSlopeHzPerMs; /* 加速斜率 Hz/ms */ uint32_t decelSlopeHzPerMs; /* 减速斜率 Hz/ms */ uint8_t curveMode; /* 0直线 1S形 2正弦 */ } PLSR_PROFILE_REQUEST; /* 规划结果(时间轴概览,诊断/测试用)。 */ typedef struct { uint32_t accelTimeMs; uint32_t cruiseTimeMs; uint32_t decelTimeMs; uint32_t totalTimeMs; uint32_t peakFrequencyHz; int64_t totalPulses; uint8_t triangular; } PLSR_PROFILE_PLAN; typedef enum { PLSR_PROFILE_PHASE_ACCEL = 0, PLSR_PROFILE_PHASE_CRUISE, PLSR_PROFILE_PHASE_DECEL, PLSR_PROFILE_PHASE_DONE } PLSR_PROFILE_PHASE; /* 执行状态:由 PlsrProfileStart 初始化,PlsrProfileStep 每刷新周期推进。 */ typedef struct { uint32_t refreshHz; /* 刷新率:1000=1ms,10000=0.1ms */ PLSR_PROFILE_PHASE phase; uint32_t targetFrequencyHz; uint32_t startFrequencyHz; uint32_t stopFrequencyHz; uint32_t decelTargetHz; /* 当前减速目标(降频时先到新目标) */ uint32_t accelSlopeHzPerMs; uint32_t decelSlopeHzPerMs; uint8_t curveMode; uint64_t frequencyQ32; /* 当前瞬时频率 Q32.32 */ uint64_t emittedPulsesQ32; /* 已发脉冲 Q32.32 */ int64_t totalPulses; /* 目标总脉冲 */ uint64_t deltaPerStepQ32; /* 每步频率增量 Q32.32(直线=常数) */ uint64_t jerkPerStepQ32; /* 每步增量变化率 Q32.32(S形用) */ uint32_t curveStep; /* 曲线相位计数(S形/正弦) */ uint32_t curveStepLimit; /* 曲线相位上限 */ uint8_t sPhase; /* S形增量 0=升 1=降 */ uint8_t started; } PLSR_PROFILE_STATE; PLSR_RESULT PlsrProfilePlan(const PLSR_PROFILE_REQUEST *request, int64_t pulses, PLSR_PROFILE_PLAN *plan); PLSR_RESULT PlsrProfileStart(PLSR_PROFILE_STATE *state, const PLSR_PROFILE_REQUEST *request, int64_t pulses, uint32_t refreshHz); /* 每刷新周期推进一步。返回当前应输出频率(Hz,四舍五入)与完成标志。 */ PLSR_RESULT PlsrProfileStep(PLSR_PROFILE_STATE *state, uint32_t *frequencyHz, uint8_t *completed); /* 运行中动态调频:按斜率平滑过渡到新目标频率。 */ PLSR_RESULT PlsrProfileRetarget(PLSR_PROFILE_STATE *state, uint32_t newTargetFrequencyHz); #ifdef __cplusplus } #endif #endif /* PLSR_PROFILE_H */