📖 第 16 章:步进电机梯形加减速(Trapezoidal Acceleration/Deceleration)

2次阅读
没有评论
这一章在干嘛?

解决第 15 章埋的雷:步进电机不能一上电就发高频脉冲(超过启动频率就堵转失步),到终点也不能高速急停(会过冲)。梯形加减速——加速、匀速、减速三段——是步进开环控制的标配算法。

16.1 为什么需要加减速

16.2 三角形还是梯形?

16.3 脉冲间隔的精确计算(免开方递推)

16.4 状态机与控制实现

16.1 为什么需要加减速

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

📖 第 16 章:步进电机梯形加减速(Trapezoidal Acceleration/Deceleration)
原书图 16.1.1:加减速实例图解

📖 第 16 章:步进电机梯形加减速(Trapezoidal Acceleration/Deceleration)
原书图 16.1.2:加减速模型解析

对策是让速度走「梯形」:OA 段低于启动频率起跑、按固定加速度升速;AB 段以最大速度匀速;BC 段按固定减速度降到 0。加速度恒定,属于匀变速控制。

16.2 三角形还是梯形?

已知量:总步数 step、加速度 accel、减速度 decel、最大速度 Max_ω;未知量:加速段脉冲数 $n_1$、减速段脉冲数 $n_2$、下一个脉冲周期。两种运动形态:

📖 第 16 章:步进电机梯形加减速(Trapezoidal Acceleration/Deceleration)
原书图 16.2.1.1:梯形加减速各阶段和脉冲的关系图解

📖 第 16 章:步进电机梯形加减速(Trapezoidal Acceleration/Deceleration)
原书图 16.2.2.1:梯形加减速运动场景 1(三角形)

📖 第 16 章:步进电机梯形加减速(Trapezoidal Acceleration/Deceleration)
原书图 16.2.3.1:梯形加减速运动场景 2(梯形)

$$text{判别阈值 } accel_lim = frac{Step cdot decel}{accel+decel} ,qquad text{达最大速度所需步数 } max_s_lim = frac{text{Max}_omega^2}{2alpha cdot accel}$$

  • $accel_lim le max_s_lim$:三角形——距离太短,没加到最大速度就得减速,$n_1 = accel_lim$,无匀速段;
  • $accel_lim > max_s_lim$:梯形——$n_1 = max_s_lim$,有匀速段;开始减速点 = 总步数 + 减速段步数(减速段步数记为负)。
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; }
}

16.3 脉冲间隔的精确计算(免开方递推)

匀加速下第 n 个脉冲的时刻 $t_n = sqrt{2alpha n / dotomega}$,相邻间隔 $c_n = c_0(sqrt{n+1} – sqrt n)$,$c_0 = frac{1}{t_t}sqrt{2alpha/dotomega}$。每步开两次方太奢侈,用麦克劳林展开近似:

📖 第 16 章:步进电机梯形加减速(Trapezoidal Acceleration/Deceleration)
原书图 16.2.4:脉冲间隔时间示意图

📖 第 16 章:步进电机梯形加减速(Trapezoidal Acceleration/Deceleration)
原书图 16.2.4.1:梯形加减速数学模型

$$C_n = C_{n-1} – frac{2 C_{n-1}}{4n+1}$$

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。

实验参数:

TIM8 168MHz、分频 84 → $f_t = 2MHz$;输出比较翻转模式(两次中断一个脉冲)。FSPR=200(整步 200 脉冲/圈)、MICRO_STEP=8 → SPR=1600;速度 2000、加速度 25、减速度 20(单位 0.1rad/s)。

16.4 状态机与控制实现

状态机:STOP → ACCEL → RUN → DECEL → STOP,在定时器中断里按脉冲个数切换(只走 1 步直接进 DECEL)。

📖 第 16 章:步进电机梯形加减速(Trapezoidal Acceleration/Deceleration)
原书图 16.3.1.1:梯形加减速时间-速度关系

📖 第 16 章:步进电机梯形加减速(Trapezoidal Acceleration/Deceleration)
原书图 16.3.1.2:状态表切换

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 圈循环)。步数够多时能明显看到:缓慢加速 → 最大速度匀速 → 缓慢减速停住。

1. 梯形加减速为什么能防止失步与过冲?

启动时低于启动频率低速起跑、再按固定加速度升速,避免高频启动堵转丢步;到终点前提前按固定减速度降到 0,防止刹不住过冲。

2. 如何判断运动是「三角形」还是「梯形」?

比较 accel_lim(= Step·decel/(accel+decel))与 max_s_lim(达最大速度所需步数):accel_lim ≤ max_s_lim 为三角形(无匀速段),否则为梯形。

3. 加速段脉冲周期如何递推?

$C_n = C_{n-1} – 2C_{n-1}/(4n+1)$,由 $c_n = c_0(sqrt{n+1}-sqrt n)$ 经麦克劳林展开近似得到;n=1 用 C0×0.69 修正,余数 rest 参与下次计算保精度。

正文完
 0