Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

98 Zeilen
3.4 KiB

  1. #ifndef PLSR_PROFILE_H
  2. #define PLSR_PROFILE_H
  3. #include "plsr_types.h"
  4. #include <stdint.h>
  5. #ifdef __cplusplus
  6. extern "C" {
  7. #endif
  8. /* Q32.32 定点:32 位整数部分 + 32 位小数部分。
  9. * 频率与脉冲计数全部用定点,禁止在刷新中断中使用浮点。 */
  10. #define PLSR_PROFILE_Q32_ONE (UINT64_C(1) << 32U)
  11. /* 曲线模式与 S2 参数块中的编码一致。 */
  12. #define PLSR_PROFILE_CURVE_LINEAR (0U)
  13. #define PLSR_PROFILE_CURVE_S (1U)
  14. #define PLSR_PROFILE_CURVE_SINE (2U)
  15. /* 单段速度规划请求。 */
  16. typedef struct
  17. {
  18. uint32_t targetFrequencyHz; /* 本段目标频率 */
  19. uint32_t startFrequencyHz; /* 本段起始频率(后续模式衔接用) */
  20. uint32_t stopFrequencyHz; /* 本段终止频率(完成模式一般为 0) */
  21. uint32_t maxFrequencyHz; /* 最高速度限幅 */
  22. uint32_t accelSlopeHzPerMs; /* 加速斜率 Hz/ms */
  23. uint32_t decelSlopeHzPerMs; /* 减速斜率 Hz/ms */
  24. uint8_t curveMode; /* 0直线 1S形 2正弦 */
  25. } PLSR_PROFILE_REQUEST;
  26. /* 规划结果(时间轴概览,诊断/测试用)。 */
  27. typedef struct
  28. {
  29. uint32_t accelTimeMs;
  30. uint32_t cruiseTimeMs;
  31. uint32_t decelTimeMs;
  32. uint32_t totalTimeMs;
  33. uint32_t peakFrequencyHz;
  34. int64_t totalPulses;
  35. uint8_t triangular;
  36. } PLSR_PROFILE_PLAN;
  37. typedef enum
  38. {
  39. PLSR_PROFILE_PHASE_ACCEL = 0,
  40. PLSR_PROFILE_PHASE_CRUISE,
  41. PLSR_PROFILE_PHASE_DECEL,
  42. PLSR_PROFILE_PHASE_DONE
  43. } PLSR_PROFILE_PHASE;
  44. /* 执行状态:由 PlsrProfileStart 初始化,PlsrProfileStep 每刷新周期推进。 */
  45. typedef struct
  46. {
  47. uint32_t refreshHz; /* 刷新率:1000=1ms,10000=0.1ms */
  48. PLSR_PROFILE_PHASE phase;
  49. uint32_t targetFrequencyHz;
  50. uint32_t startFrequencyHz;
  51. uint32_t stopFrequencyHz;
  52. uint32_t decelTargetHz; /* 当前减速目标(降频时先到新目标) */
  53. uint32_t accelSlopeHzPerMs;
  54. uint32_t decelSlopeHzPerMs;
  55. uint8_t curveMode;
  56. uint64_t frequencyQ32; /* 当前瞬时频率 Q32.32 */
  57. uint64_t emittedPulsesQ32; /* 已发脉冲 Q32.32 */
  58. int64_t totalPulses; /* 目标总脉冲 */
  59. uint64_t deltaPerStepQ32; /* 每步频率增量 Q32.32(直线=常数) */
  60. uint64_t jerkPerStepQ32; /* 每步增量变化率 Q32.32(S形用) */
  61. uint32_t curveStep; /* 曲线相位计数(S形/正弦) */
  62. uint32_t curveStepLimit; /* 曲线相位上限 */
  63. uint8_t sPhase; /* S形增量 0=升 1=降 */
  64. uint8_t started;
  65. } PLSR_PROFILE_STATE;
  66. PLSR_RESULT PlsrProfilePlan(const PLSR_PROFILE_REQUEST *request,
  67. int64_t pulses,
  68. PLSR_PROFILE_PLAN *plan);
  69. PLSR_RESULT PlsrProfileStart(PLSR_PROFILE_STATE *state,
  70. const PLSR_PROFILE_REQUEST *request,
  71. int64_t pulses,
  72. uint32_t refreshHz);
  73. /* 每刷新周期推进一步。返回当前应输出频率(Hz,四舍五入)与完成标志。 */
  74. PLSR_RESULT PlsrProfileStep(PLSR_PROFILE_STATE *state,
  75. uint32_t *frequencyHz,
  76. uint8_t *completed);
  77. /* 运行中动态调频:按斜率平滑过渡到新目标频率。 */
  78. PLSR_RESULT PlsrProfileRetarget(PLSR_PROFILE_STATE *state,
  79. uint32_t newTargetFrequencyHz);
  80. #ifdef __cplusplus
  81. }
  82. #endif
  83. #endif /* PLSR_PROFILE_H */