传统 S 曲线是七段式(加加速、恒加速、减加速、匀速、加减速、恒减速、减减速),参数复杂。本章简化为五段式并令 T1=T2、T4=T5:


五段:加加速段(加速度 a 从 0 升到最大)→ 减加速段(a 从最大降回 0,速度仍在增加)→ 匀速 → 加减速 → 减减速。减速段与加速段完全对称(速度倒序),只需算一半。
| 对比 | 梯形 | S 形 |
|---|---|---|
| 加速度 | 突变(阶跃) | 连续渐变 |
| 冲击/噪音 | 较大 | 小 |
| 启停耗时 | 短 | 长 |
| 典型应用 | 定长送料、打印机 | 精密工件搬运 |
核心量是加加速度 J(加速度的变化率)。加加速段 $a_1 = J_1 t$,积分得 $v_1 = \frac12 J_1 t^2$,再积分得位移:
加速度达到最大值时速度恰好走到中点速度 $v_m = \dfrac{v_0+v_t}{2}$,于是 $J_1 = \dfrac{2 v_m}{t_1^2}$。减加速段 $a_2 = -J(t-t_1)$,$v = v_t - \frac12 J (t-t_1)^2$,位移 $S_2 = v_t t - S_1$,加速段总步数 $S = S_1 + S_2$。
/* 生成 S 形速度表:jerk = 2*(vm-vo)/time^2,逐点填表 */
vm = (g_calc_t.vo + g_calc_t.vt) / 2; /* 中点速度 */
jerk = fabs(2.0f * (vm - g_calc_t.vo) / (time * time)); /* 加加速度 */
inc_acc_stp = (int32_t)(g_calc_t.vo * time + INCACCELSTEP(jerk, time)); /* S1 */
dec_acc_stp = (int32_t)((g_calc_t.vt + g_calc_t.vo) * time - inc_acc_stp);
velocity_tab = (float*)mymalloc(SRAMIN, (accel_step + 1) * sizeof(float));
ti_cube = 6.0f * 1.0f / jerk; /* 第 1 步时间: ti^3 = 6*1/jerk */
ti = pow(ti_cube, (1 / 3.0f));
sum_t += ti;
delta_v = 0.5f * jerk * pow(sum_t, 2);
velocity_tab[0] = g_calc_t.vo + delta_v; /* 第一步速度 */
for (i = 1; i < accel_step; i++) {
ti = 1.0f / velocity_tab[i-1]; /* 每步时间 ti = 1/Vn-1 */
sum_t += ti;
if (i < inc_acc_stp) { /* 加加速段 */
delta_v = 0.5f * jerk * pow(sum_t, 2);
velocity_tab[i] = g_calc_t.vo + delta_v;
} else { /* 减加速段 */
delta_v = 0.5f * jerk * pow(fabs(time - sum_t), 2);
velocity_tab[i] = g_calc_t.vt - delta_v;
}
}状态机 STATE_ACCEL → STATE_AVESPEED → STATE_DECEL → STATE_STOP。速度表动态申请(mymalloc),加减速完成后必须 myfree 释放。翻转模式下比较值再除 2:
case STATE_ACCEL: /* 中断中查表输出脉冲 */
Tim_Pulse = T1_FREQ / (*g_calc_t.ptr); /* Cn = ft / vn,查表 */
g_calc_t.ptr++;
Toggle_Pulse = (uint16_t)(Tim_Pulse / 2); /* 翻转模式除以 2 */
if (g_calc_t.step_pos >= g_calc_t.accel_step) {
myfree(SRAMIN, g_calc_t.accel_tab); /* 释放加速表内存 */
g_motor_sta = STATE_AVESPEED; /* 进入匀速段 */
}
break;实验硬件与第 16 章完全相同(接口三、8 细分 1600 脉冲/圈)。KEY0 开启 S 形加减速(stepmotor_move_rel(V_START, V_END, ACCELTIME, DECELTIME, g_step_angle*SPR)),KEY1/KEY2 增减步数(1~50 循环)。注意:总步数必须 ≥ 加速步数 + 减速步数,否则报「参数设置错误」。现象:与梯形相比启停明显更柔和、冲击更小。