步进电机有个「启动频率」:直接给高频脉冲,反电动势的阻尼让转子跟不上磁场,就会堵转/丢步;到达终点时速度太高,惯性又让它过冲。


对策是让速度走「梯形」:OA 段低于启动频率起跑、按固定加速度升速;AB 段以最大速度匀速;BC 段按固定减速度降到 0。加速度恒定,属于匀变速控制。
已知量:总步数 step、加速度 accel、减速度 decel、最大速度 Max_ω;未知量:加速段脉冲数 $n_1$、减速段脉冲数 $n_2$、下一个脉冲周期。两种运动形态:



void create_t_ctrl_param(int32_t step, uint32_t accel,
uint32_t decel, uint32_t speed)
{
g_srd.min_delay = (int32_t)(A_T_x10 / speed); /* 匀速段计数值 */
g_srd.step_delay = (int32_t)((T1_FREQ_148 * sqrt(A_SQ / accel)) / 10); /* c0 */
max_s_lim = (uint32_t)(speed * speed / (A_x200 * accel / 10));
if (max_s_lim == 0) max_s_lim = 1;
accel_lim = (uint32_t)(step * decel / (accel + decel));
if (accel_lim == 0) accel_lim = 1;
if (accel_lim <= max_s_lim) /* 三角形:到不了最大速度 */
g_srd.decel_val = accel_lim - step;
else /* 梯形:有匀速段 */
g_srd.decel_val = -(max_s_lim * accel / decel);
if (g_srd.decel_val == 0) g_srd.decel_val = -1;
g_srd.decel_start = step + g_srd.decel_val; /* 开始减速的步数点 */
if (step == 1) { g_srd.run_state = DECEL; g_srd.step_delay = 1000; }
}匀加速下第 n 个脉冲的时刻 $t_n = \sqrt{2\alpha n / \dot\omega}$,相邻间隔 $c_n = c_0(\sqrt{n+1} - \sqrt n)$,$c_0 = \frac{1}{t_t}\sqrt{2\alpha/\dot\omega}$。每步开两次方太奢侈,用麦克劳林展开近似:


n=1 时有 0.4142 偏差,用 $C_0 \times 0.69$ 修正(T1_FREQ_148)。递推中的余数 rest 参与下次计算,把整除丢掉的精度攒回来。匀速段计数值 $c = \alpha f_t / \omega$;为避免浮点,把 $\alpha f_t$ 放大 10 倍存成 A_T_x10。
状态机:STOP → ACCEL → RUN → DECEL → STOP,在定时器中断里按脉冲个数切换(只走 1 步直接进 DECEL)。


case ACCEL: /* 加速段:递推下一个脉冲周期 */
step_count++;
g_srd.accel_count++;
new_step_delay = g_srd.step_delay - (((2 * g_srd.step_delay) + rest)
/ (4 * g_srd.accel_count + 1)); /* Cn 递推 */
rest = ((2 * g_srd.step_delay) + rest)
% (4 * g_srd.accel_count + 1); /* 余数补偿 */
if (step_count >= g_srd.decel_start) { /* 到达减速点 */
g_srd.accel_count = g_srd.decel_val; /* 减速计数初值(负) */
g_srd.run_state = DECEL;
} else if (new_step_delay <= g_srd.min_delay) { /* 已达最大速度 */
last_accel_delay = new_step_delay;
new_step_delay = g_srd.min_delay; /* 切换匀速计数值 */
rest = 0;
g_srd.run_state = RUN;
}
break;实验用接口三(TIM8_CH3=PI7、DIR3=PB2、EN3=PF11),驱动器 1.0A、8 细分。KEY0 开启、KEY1/KEY2 增减总步数(1~100 圈循环)。步数够多时能明显看到:缓慢加速 → 最大速度匀速 → 缓慢减速停住。