|
|
|
@@ -30,8 +30,9 @@ |
|
|
|
* 若不超前,末拍实际是 f(N-1)≈sqrt(f_end^2+2a),示波器偶发「末频偏高」。 |
|
|
|
* 减速在 remain==dec_n+1 切入;纯减速开表再预装一拍。 |
|
|
|
* |
|
|
|
* 【段末停表】非 FOLLOW-keep 时开段锁 s_seg_end_opm,倒数第二拍 ISR 内立刻写 |
|
|
|
* CR1.OPM,避免改频路径拖长导致下一拍已开跑、偶发多出 1 个边沿。 |
|
|
|
* 【段末停表】非 FOLLOW-keep 时开段锁 s_seg_end_opm: |
|
|
|
* UPDATE≈上升沿;s_done 到 target 时武装 OPM,末拍整周期跑完后下一 UPDATE |
|
|
|
* 再 AfterSegDone 且不再 ++ → 末拍完整且不多 1。FOLLOW-keep 到点立刻衔接。 |
|
|
|
* |
|
|
|
* 【故障诊断 0x2006】(PlsrCommandSetFault,告警码 1~3 不停机;4 禁止启动) |
|
|
|
* 0x01 段结束 AfterSegDone:s_done != s_target |
|
|
|
@@ -127,6 +128,7 @@ static uint32_t s_chain_freq; /* 段末停表前的落地频率 |
|
|
|
static uint8_t s_chain_valid; /* 1=s_chain_freq 有效 */ |
|
|
|
static uint8_t s_pwm_on; /* 1=PWM 正在输出 */ |
|
|
|
static uint8_t s_seg_end_opm; /* 1=本段末拍用 OPM 单脉冲停表 */ |
|
|
|
static volatile uint8_t s_last_period_wait; /* 1=已计满 target,等末拍周期结束再 AfterSegDone */ |
|
|
|
|
|
|
|
static uint16_t s_run_accel_ms; /* 本段锁定加速时间 ms(ChangeFreq 复用) */ |
|
|
|
static uint16_t s_run_decel_ms; /* 本段锁定减速时间 ms */ |
|
|
|
@@ -1222,6 +1224,7 @@ static void PlsrRunControlFinishAll(void) |
|
|
|
s_act_handoff_keep = 0U; |
|
|
|
s_wait_expire_req = 0U; |
|
|
|
s_act_time_ms = 0U; |
|
|
|
s_last_period_wait = 0U; |
|
|
|
PlsrPersistNotifyMonitorChanged(); /* 全部结束:落盘累计与空闲状态 */ |
|
|
|
} |
|
|
|
|
|
|
|
@@ -1248,6 +1251,7 @@ static void PlsrRunControlBeginSeg(uint16_t seg_idx0) |
|
|
|
seg = PlsrParamGetSeg(seg_idx0); |
|
|
|
cfg = PlsrParamGetCfg(); |
|
|
|
s_cur_seg = seg_idx0; |
|
|
|
s_last_period_wait = 0U; |
|
|
|
cnt = seg->pulse_cnt; |
|
|
|
|
|
|
|
if (cfg->run_mode == PLSR_POS_ABSOLUTE) |
|
|
|
@@ -1390,6 +1394,7 @@ void PlsrRunControlInit(void) |
|
|
|
s_plan_dec_n = 0U; |
|
|
|
s_decel_budget = 0U; |
|
|
|
s_seg_end_opm = 0U; |
|
|
|
s_last_period_wait = 0U; |
|
|
|
s_phase = PH_CONST; |
|
|
|
s_act_armed = 0U; |
|
|
|
s_act_expire_req = 0U; |
|
|
|
@@ -1549,6 +1554,7 @@ void PlsrRunControlStop(void) |
|
|
|
s_act_handoff_keep = 0U;/*ACT 切段后是否保持当前频率衔接*/ |
|
|
|
s_wait_expire_req = 0U;/*段后等待到期请求标志*/ |
|
|
|
s_act_time_ms = 0U;/*本段 ACT 定时时长*/ |
|
|
|
s_last_period_wait = 0U; |
|
|
|
PlsrPersistNotifyMonitorChanged(); /* 停机:立刻落盘累计/状态 */ |
|
|
|
} |
|
|
|
|
|
|
|
@@ -1703,6 +1709,18 @@ void PlsrRunControlOnPulseIsr(void) |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
/* |
|
|
|
* 末拍整周期已跑完:本 UPDATE 由 OPM 停表产生,不再计入脉冲。 |
|
|
|
* 先于 s_done++,保证个数 = target 且示波器末拍完整。 |
|
|
|
*/ |
|
|
|
if (s_last_period_wait != 0U) |
|
|
|
{ |
|
|
|
s_last_period_wait = 0U; |
|
|
|
s_act_cut_pending = 0U; |
|
|
|
PlsrRunControlAfterSegDone(); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
s_done++; |
|
|
|
if (s_forward != 0U) |
|
|
|
{ |
|
|
|
@@ -1731,19 +1749,22 @@ void PlsrRunControlOnPulseIsr(void) |
|
|
|
|
|
|
|
if (s_done >= s_target) |
|
|
|
{ |
|
|
|
if (s_seg_end_opm != 0U) |
|
|
|
{ |
|
|
|
/* |
|
|
|
* 本 UPDATE = 末拍上升沿,已计入 target。 |
|
|
|
* 武装 OPM:本周期完整跑完后下一 UPDATE 停表 → s_last_period_wait 收尾。 |
|
|
|
* 此处不 AfterSegDone/Stop,否则会截断末拍成尖刺。 |
|
|
|
*/ |
|
|
|
PlsrPulseDriverArmOnePulseStop(); |
|
|
|
s_last_period_wait = 1U; |
|
|
|
return; |
|
|
|
} |
|
|
|
/* FOLLOW 不停表衔接:立刻切段,PWM 连续 */ |
|
|
|
PlsrRunControlAfterSegDone(); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
/* |
|
|
|
* 倒数第二拍立刻武装 OPM(在改频/曲线步进之前)。 |
|
|
|
* 若拖到 ISR 末尾才写 OPM,高频时下一拍已跑完甚至又开一拍 → 示波器偶发多 1。 |
|
|
|
*/ |
|
|
|
if ((s_seg_end_opm != 0U) && (s_done >= (s_target - 1))) |
|
|
|
{ |
|
|
|
PlsrPulseDriverArmOnePulseStop(); |
|
|
|
} |
|
|
|
|
|
|
|
remain = PlsrRunControlRemainPulses(); |
|
|
|
|
|
|
|
if (s_phase == PH_CONST) |
|
|
|
|