Просмотр исходного кода

修正等待条件:EXT或者脉冲发完,改为先到先切,哪个先满足就按照哪个条件切段。

Signed-off-by: hanyongwei <2043702190@qq.com>
master
hanyongwei 1 месяц назад
Родитель
Сommit
a86180eb6b
2 измененных файлов: 18 добавлений и 17 удалений
  1. +2
    -2
      plsr/param/plsr_param.h
  2. +16
    -15
      plsr/run_control/plsr_run_control.c

+ 2
- 2
plsr/param/plsr_param.h Просмотреть файл

@@ -84,8 +84,8 @@ typedef enum {
PLSR_WAIT_TIME = 0, /* 发完后等 wait_ms,再跳转 */
PLSR_WAIT_SIGNAL = 1, /* 发完后等 WAIT 口下降沿(EXTI),再跳转 */
PLSR_WAIT_ACT = 2, /* ACT:满 act_ms 从当前频率切下一段;脉冲先完则等到点 */
PLSR_WAIT_EXT = 3, /* 运行中 EXT 下降沿中途切段并立即跳转 */
PLSR_WAIT_EXT_OR_DONE = 4 /* EXT 沿或脉冲发完,先到先跳转 */
PLSR_WAIT_EXT = 3, /* 运行中 EXT 下降沿中途切段;发完后仍等 EXT */
PLSR_WAIT_EXT_OR_DONE = 4 /* EXT 沿或脉冲发完,先到先切段 */
} PlsrWaitType_e;

/** 公共运行参数(运动侧只读此映像,不直接啃寄存器) */


+ 16
- 15
plsr/run_control/plsr_run_control.c Просмотреть файл

@@ -269,12 +269,11 @@ static void PlsrRunControlEnterPostWaitOrNext(void)
return;
}

if ((seg->wait_type == PLSR_WAIT_EXT) ||
(seg->wait_type == PLSR_WAIT_EXT_OR_DONE))
if (seg->wait_type == PLSR_WAIT_EXT)
{
/*
* EXT 脉冲发完后等待:停表,输出已经是 0
* 下一段从配置起速(0 则起跳)重新规划;不是接着本段 f_end 往下跑
* 纯 EXT:脉冲发完后仍要等 EXT 沿才跳转
* 停表,下一段从起速/起跳重新规划
*/
PlsrPulseDriverStop();
s_follow_cont = 0U;
@@ -294,6 +293,10 @@ static void PlsrRunControlEnterPostWaitOrNext(void)
return;
}

/*
* EXT_OR_DONE:脉冲先发完 = 条件已满足,立刻下一段(不再等 EXT)。
* EXT 先到:RUN 里已 CutSegToNext,走不到这里。
*/
PlsrRunControlGotoNextOrFinish(s_cur_seg);
}

@@ -392,17 +395,15 @@ static uint8_t PlsrRunControlBlocksFollowKeep(uint16_t cur_seg)
PlsrSeg_t *seg = PlsrParamGetSeg(cur_seg);

/*
* WAIT时间/信号/ACT:禁止后续无缝衔接(发完后停表等条件)。
* EXT/EXT_OR_DONE:脉冲发完之前 EXT 可能尚未触发,发完后进等待态,
* 此时 PWM 必须停;所以也禁止无缝衔接。
* (EXT 触发时若脉冲还在跑,由 CutSegToNext 判断 keep,
* 那条路不走 BlocksFollowKeep。)
* WAIT时间/信号/ACT:发完后停表等条件,禁止后续无缝衔接。
* EXT:发完后仍等 EXT 沿,必须停表。
* EXT_OR_DONE:脉冲先完则条件已满足,允许后续衔接;
* EXT 先到由 CutSegToNext 自行判断 keep。
*/
if ((seg->wait_type == PLSR_WAIT_TIME) ||
(seg->wait_type == PLSR_WAIT_SIGNAL) ||
(seg->wait_type == PLSR_WAIT_ACT) ||
(seg->wait_type == PLSR_WAIT_EXT) ||
(seg->wait_type == PLSR_WAIT_EXT_OR_DONE))
(seg->wait_type == PLSR_WAIT_EXT))
{
return 1U;
}
@@ -458,8 +459,9 @@ static uint8_t PlsrRunControlResolveSegCallIo(uint16_t seg_0, uint32_t f_tgt,

/*
* ---------- 终止频率 ----------
* 完成方式 / 真末段 / 发完后要停表等(WAIT时间/信号):本段规划到止速。
* ACT/EXT 中途打断时剩余减速本来就会丢弃,不影响「进不进减速」。
* 完成方式 / 真末段 / 发完后要停表等(WAIT时间/信号/纯EXT/ACT):
* 本段规划到止速。
* EXT_OR_DONE:脉冲先完可衔接下一段;EXT 先到则丢弃剩余减速。
* 后续方式且无门禁:过渡到下一段目标。
*/
next0 = PlsrPathPlanNextSeg(seg_0);
@@ -1177,8 +1179,7 @@ void PlsrRunControlTickMs(void)
if (s_wait_is_signal != 0U)
{
seg = PlsrParamGetSeg(s_cur_seg);
if ((seg->wait_type == PLSR_WAIT_EXT) ||
(seg->wait_type == PLSR_WAIT_EXT_OR_DONE))
if (seg->wait_type == PLSR_WAIT_EXT)
{
if (PlsrSignalIoTakeExtFalling() != 0U)
{


Загрузка…
Отмена
Сохранить