You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

111 lines
4.7 KiB

  1. #ifndef PLSR_PLANNER_H
  2. #define PLSR_PLANNER_H
  3. #include "plsr_platform.h"
  4. #include <stdint.h>
  5. typedef enum
  6. {
  7. PLSR_BOUNDARY_STOP = 0,
  8. PLSR_BOUNDARY_NEXT_FRESH,
  9. PLSR_BOUNDARY_NEXT_CARRY,
  10. PLSR_BOUNDARY_WAIT_TIME,
  11. PLSR_BOUNDARY_WAIT_SIGNAL,
  12. PLSR_BOUNDARY_WAIT_EXT,
  13. PLSR_BOUNDARY_JUMP,
  14. PLSR_BOUNDARY_EXT_CUT
  15. } PLSR_BOUNDARY_ACTION;
  16. /* A block is self-contained: the planner must not read live Modbus state. */
  17. typedef struct
  18. {
  19. uint32_t entryHz;
  20. uint32_t cruiseHz;
  21. uint32_t exitHz;
  22. uint32_t pulseBudget;
  23. uint32_t referenceSpeedHz;
  24. uint16_t accelerationTimeMs;
  25. uint16_t decelerationTimeMs;
  26. uint16_t curveMode;
  27. uint8_t pulseOutput;
  28. PLSR_BOUNDARY_ACTION boundary;
  29. } PLSR_MOTION_BLOCK;
  30. typedef struct
  31. {
  32. PLSR_PLATFORM_TIMER_SETTING setting;
  33. uint32_t requestedFrequencyHz;//用于诊断的频率
  34. uint32_t repeatCount;//这一档连续多少个脉冲。斜坡多半 1;匀速可以是剩下的全部(例如 5000)
  35. } PLSR_STREAM_ITEM;
  36. typedef enum
  37. {
  38. PLSR_PLANNER_OK = 0,
  39. PLSR_PLANNER_CLIPPED,
  40. PLSR_PLANNER_DONE,
  41. PLSR_PLANNER_INVALID
  42. } PLSR_PLANNER_STATUS;
  43. typedef enum
  44. {
  45. PLSR_PLANNER_PHASE_ENTRY = 0,
  46. PLSR_PLANNER_PHASE_STEADY,
  47. PLSR_PLANNER_PHASE_EXIT,
  48. PLSR_PLANNER_PHASE_COMPLETE
  49. } PLSR_PLANNER_PHASE;
  50. typedef struct
  51. {
  52. uint32_t pulseCount;
  53. uint32_t actualFrequencyHz;
  54. PLSR_PLANNER_PHASE phase;
  55. uint8_t deadlineInProfile;
  56. } PLSR_PLANNER_TIME_PREDICTION;
  57. typedef struct
  58. {
  59. PLSR_MOTION_BLOCK block; // 本块输入:起/巡/终速度、预算、加减速时间、曲线、通道
  60. uint64_t phasePulses; // 起点相位,已实际输出的脉冲累计,冷启动为 0
  61. uint32_t startHz; // 实际起始频率(appliedHz,0 抬成 1)
  62. uint32_t peakHz; // 实际峰值,预算不足时低于 cruise
  63. uint32_t endHz; // 实际终点:停止速度、carry 或 clip 后可达值
  64. uint32_t entryPulses; // 加速段脉冲数
  65. uint32_t steadyPulses; // 匀速段脉冲数,三角轮廓为 0
  66. uint32_t exitPulses; // 减速段脉冲数
  67. uint32_t generatedPulses; // 已交给调用方的脉冲总数(按脉冲计,非项数)
  68. uint32_t rampRelativePulse; // 当前斜坡内已走脉冲序号,0 为斜坡第一项
  69. uint32_t rampPulseCount; // 当前斜坡总脉冲数
  70. uint32_t rampFromHz; // 当前斜坡起点频率
  71. uint32_t rampToHz; // 当前斜坡终点频率
  72. uint32_t rampDurationMs; // 当前斜坡折算持续时间(ms)
  73. uint32_t lastRampHz; // 上一斜坡脉冲量化后的实际频率,禁止加减速倒退
  74. uint64_t rampTotalAreaQ32; // 当前斜坡 x=0~1 的总面积(Q32)
  75. uint64_t rampAreaStepQ32; // 每个脉冲的面积整数商:totalArea / N
  76. uint64_t rampTargetAreaQ32; // 到当前脉冲结束必须达到的累计面积
  77. uint64_t rampBoundaryQ32; // 上一脉冲结束时的归一化时间边界 x
  78. uint64_t rampActualTimeQ32; // 已按量化后 actualHz 走过的归一化时间(闭环)
  79. uint64_t rampLastPhaseStepQ32; // 上一脉冲相位步长,供后续预测边界
  80. uint64_t rampFirstBoundaryQ32; // 第 1 个斜坡脉冲的精确边界(二分)
  81. uint64_t rampSecondBoundaryQ32; // 第 2 个斜坡脉冲的精确边界(二分),其后改预测
  82. uint32_t rampAreaRemainder; // totalArea % N,余数往各脉冲面积上摊
  83. uint32_t rampRemainderAccumulator; // 摊余数累加器,满 N 则目标面积 +1
  84. uint8_t rampKind; // 0 无斜坡/匀速,1 加速,2 减速
  85. uint8_t clipped; // 预算不足已裁峰/终点,结果仍可执行
  86. uint8_t active; // 是否还可 Generate,吐完或失败清 0
  87. } PLSR_PLANNER_CONTEXT;
  88. PLSR_PLANNER_STATUS PlsrPlannerBegin(PLSR_PLANNER_CONTEXT *context,
  89. const PLSR_MOTION_BLOCK *block,
  90. uint32_t appliedHz,
  91. uint64_t phasePulses);
  92. uint16_t PlsrPlannerGenerate(PLSR_PLANNER_CONTEXT *context,
  93. PLSR_STREAM_ITEM *output,
  94. uint16_t capacity);
  95. uint8_t PlsrPlannerPredictTime(
  96. const PLSR_PLANNER_CONTEXT *context,
  97. uint32_t elapsedUs,
  98. PLSR_PLANNER_TIME_PREDICTION *prediction);
  99. #endif /* PLSR_PLANNER_H */