【嵌入式必读】彻底理解步进电机梯形加减速运动算法原理


关于梯形加速度,我打算写2篇文章来描述整个实现流程。本章我们从原理的角度详细分析一下,梯形加速度是怎么实现的,下一篇文章我们一步步看看代码如何实现。
我们先来看看最终效果。

步进电机梯形加速度

关于代码实现,请大家看我这篇文章,所有代码均经过验证,可以直接拿来用。https://blog.csdn.net/yingzhefengyuzou/article/details/132199922?spm=1001.2014.3001.5502

一、 使用加减速的理由

为什么要使用加减速呢?步进电机有一个很重要的技术参数:空载启动频率,也就是在没有负载的情况下能够正常启动的最大脉冲频率,如果脉冲频率大于该值,步进电机则不能够正常启动,发生丢步或者堵转的情况;或者也可以理解为由于步进脉冲变化过快,转子由于惯性的作用跟不上电信号的变化。所以要使用加减速来解决启动频率低的问题,在启动时使用较低的脉冲频率,然后逐渐的加快频率。

二、 梯形加减速算法特点

在这里插入图片描述

梯形加减速一共分为三个阶段,OA 加速部分、AB 匀速部分 和 BC 减速部分。 在 OA 加速过程中,由低于步进电机的启动频率开始启动(模型中由 0 启动),以固定的加速度增加速度到目标值;在 AB 匀速过程中,以最大速度匀速运动; 在 BC 减速部分中,以加速度不变的速度递减到 0; 这种算法是一种在加速过程和减速过程中加速度不变的匀变速控制算法,由于速度变化的曲线有折点,所以在启动、停止、匀速段中很容易产生冲击和振动。

三、 算法基础

步进电机的转动需要控制器发送脉冲,如果控制器以恒定速度发送脉冲,那么步进电机就以恒定速度转动;如果控制器以加速度发送脉冲,那么步进电机就以加速度运动;所以只要改变脉冲的频率 就可以改变速度的变化,也就是说调整脉冲之间的时间间隔就可以改变速度。
在这里插入图片描述

上图为步进电机与时间的示意图,其中

  • t 0 t_0 t0 表示第1个脉冲发送时刻
  • t 1 t_1 t1 表示第2个脉冲发送时刻
  • t 2 t_2 t2 表示第3个脉冲发送时刻
  • t t t_t tt 表示定时器的计数周期
  • C 0 C_0 C0 表示定时器从 t 0 t_0 t0 ~ t 1 t_1 t1 时刻的定时器计数值
  • C 1 C_1 C1 表示定时器从 t 1 t_1 t1 ~ t 2 t_2 t2 时刻的定时器计数值
  • Δ t 1 Δt_1 Δt1 Δ t 2 Δt_2 Δt2表示两个脉冲之间的间隔时间

以 stm32 的高级定时器 8 为例,使用定时器PWM输出模式给控制器发送脉冲。高级定时器 8 的时钟频率为 168MHZ, 如果将分频值设置为 5,那么定时器的时钟频率则为: f t f_t ft=168/(5+1)=28MHZ, 相当于计数 28M 次正好为一秒,周期与频率为倒 数关系,所以分频值为 5 的定时器 8 的计数周期 t t = 1 / f t t_t = 1/f_t tt=1/ft; C 0 C_0 C0 C 1 C_1 C1的值即为ARR寄存器的值,所以我们在固定的定时器频率下,只需要改变ARR的值,即可改变电机的速度。

四、 梯形算法要求的变量

我们通过控制定时器输出PWM波形来描绘上述梯形,至少需要知道以下变量:

  1. 在加速阶段:
  • 加速初始PWM频率,即我们要求的ARR寄存器的值 C 0 C_0 C0
  • 加速度accel
  • 加速阶段总的脉冲数
  1. 匀速阶段
  • 匀速所用的脉冲数
  1. 减速阶段
  • 减速初始频率(也是匀速运动的速度)
  • 减速度decel
  • 减速所用的脉冲
    一般情况下,电机加速度accel、减速度decel和总步数(即总脉冲数)是给定的,我们需要通过这3个变量推导出剩余的变量。知道以上变量,再推导出每步的定时器频率,结合脉冲数即可绘制完整的梯形图。

五、 加减速算法推导过程

1. 电机转过的角度θ的计算:

电机转过的角度θ等于脉冲数乘以步距角

θ = n ∗ α (1) \boxed{θ = n * α} \tag{1} θ=nα(1)

其中:n表示驱动电机的脉冲数,α表示电机的步距角

2. 电机由速度0匀加速运动,转过θ所用的时间 t n t_n tn:

由匀加速直线运动公式:

S = ν 0 t + 1 2 a t 2 (2) \boxed{S =ν_0 t+{1\over2} at^2} \tag{2} S=ν0t+21at2(2)

可推导出,电机转过的角度θ:

θ = ω 0 t + 1 2 ω ˊ t n 2 (3) \boxed{θ = ω_0 t+{1\over2}ώt_n^2} \tag{3} θ=ω0t+21ωˊtn2(3)

其中:θ为转过的角度 , ω 0 ω_0 ω0为初角速度,ώ为加角速度, t n t_n tn为所用的时间

当初角速度 ω 0 = 0 ω_0 = 0 ω0=0时,电机转过θ所用的时间 t n t_n tn

t n = 2 θ ω ˊ (4) \boxed{t_n = \sqrt{2θ\over{ώ}}} \tag{4} tn=ωˊ2θ (4)

3.求相邻脉冲时间间隔Δt:

时间间隔Δt:

Δ t = C n ∗ t t (5) \boxed{Δt = C_n*t_t} \tag{5} Δt=Cntt(5)

其中: C n C_n Cn表示定时器计数器相邻两脉冲间的计数值, t t t_t tt表示定时器的时钟周期,定时器频率的倒数
假设相邻两脉冲间转过的角度分别用 θ t θ_t θt θ t − 1 θ_{t-1} θt1表示,所用时间用 t n t_n tn t n − 1 t_{n-1} tn1表示,则Δt根据公式(4)也可以表示为

Δ t = t n – t n − 1 = 2 θ t ω ˊ − 2 θ t − 1 ω ˊ \boxed{Δt = t_n – t_{n-1}\\ = \sqrt{2θ_t\over{ώ}} - \sqrt{2θ_{t-1}\over{ώ}} } Δt=tntn1=ωˊ2θt ωˊ2θt1

上式中n表示转过 θ t − 1 θ_{t-1} θt1角度时,所用的脉冲数
Δ t = t n – t n − 1 = 2 θ t ω ˊ − 2 θ t − 1 ω ˊ \begin{aligned} Δt &= t_n – t_{n-1} \\ &= \sqrt{2θ_t\over{ώ}} - \sqrt{2θ_{t-1}\over{ώ}} \end{aligned} Δt=tntn1=ωˊ2θt ωˊ2θt1
上式中 θ t θ_t θt θ t − 1 θ_{t-1} θt1根据公式(1)可得出: θ t = ( n + 1 ) α , θ t − 1 = n α θ_t = (n+1) α, θ_t-1 = nα θt=(n+1)α,θt1=nα,则带入最终可得到公式(6)

Δ t = 2 α ω ˊ ( n + 1 − n ) (6) \boxed{Δt = \sqrt{2α\overώ} (\sqrt{n+1}- \sqrt{n})}\tag{6} Δt=ωˊ2α (n+1 n )(6)

上式中n表示转过 θ t − 1 θ_{t-1} θt1角度时,所用的脉冲数
此处计算时,让 θ t = ( n + 1 ) α , θ t − 1 = n α , θ_t = (n+1) α, θ_{t-1} = nα, θt=(n+1)α,θt1=nα而不是 θ t = n α θ_t = nα θt=nα, θ t − 1 = ( n − 1 ) α θ_{t-1} = (n-1)α θt1=n1α,是因为Δt是两脉冲之间的时间间隔, θ t − 1 θ_{t-1} θt1的脉冲数n最小也应该等于1,所以在n为正整数的情况下,采用 θ t = ( n + 1 ) α θ_t = (n+1) α θt=(n+1)α, θ t − 1 = n α θ_{t-1} = nα θt1=nα更符合实际情况。

4、 求第1个周期内计数器的值

第1个周期内计数器的值,即电机匀加速运动时的初始值,加速初始PWM频率。
根据公式(5)和(6)可求得:
C 0 = Δ t 0 t t = 2 α ω ˊ ( n + 1 − n ) / t t \begin{aligned} C_0 &= {Δt_0\over{t_t}} \\ &= \sqrt{2α\over{ώ}}(\sqrt{n+1} - \sqrt{n})/t_t \end{aligned} C0=ttΔt0=ωˊ2α (n+1 n )/tt
由上得出:

C 0 = 2 α ω ˊ t t (7) \begin{aligned} \boxed{C_0 = {\sqrt{2α\over{ώ}}\over{t_t}}}\tag{7} \end{aligned} C0=ttωˊ2α (7)

用公式(7)求第1个周期内计数器的值

求第n个周期内计数器的值:
C n = Δ t n t t = 2 α ω ˊ ( n + 1 − n ) / t t \begin{aligned} C_n &= {Δt_n\over{t_t}} \\ &= \sqrt{2α\over{ώ}}(\sqrt{n+1} - \sqrt{n})/t_t \end{aligned} Cn=ttΔtn=ωˊ2α (n+1 n )/tt
由上得出:
C n = Δ t n t t = 2 α ω ˊ ( n + 1 − n ) / t t = 2 α ω ˊ t t ( n + 1 − n ) \begin{aligned} Cn &= {Δt_n\over{t_t}}\\ &= \sqrt{2α\over{ώ}}(\sqrt{n+1} - \sqrt{n})/t_t\\ &={\sqrt{2α\over{ώ}}\over{t_t}}(\sqrt{n+1} - \sqrt{n}) \end{aligned} Cn=ttΔtn=ωˊ2α (n+1 n )/tt=ttωˊ2α (n+1 n )
其中根据公式(7) 2 α ω ˊ / t t = C 0 {\sqrt{2α\over{ώ}}/t_t} = C_0 ωˊ2α /tt=C0 可得出:

C n = C 0 ( n + 1 − n ) (8) \begin{aligned} \boxed{C_n =C_0({\sqrt{n+1}-\sqrt{n}})}\tag{8} \end{aligned} Cn=C0(n+1 n )(8)

由于计算的过程中需要进行开方运算,微控制器的计算能力有限,因此在此使用泰勒公式进行泰勒级数逐级逼近的方法。在这里主要是用的是泰勒公式的特例——麦克劳林公式;具体如下:
1 ± 1 n = 1 ± 1 2 n − 1 8 n 2 + o 1 n 3 \sqrt{1±{1\over{n}}} = 1 ± {1\over{2n}} - {1\over{8n^2}}+o{1\over{n^3}} 1±n1 =1±2n18n21+on31
为构造与麦克劳林相同的公式将 n-1 ,并且与公式 (9) 做比值处理,并进行化简计算,具体如下图 所示:
在这里插入图片描述

公式推导一共分为以下 5 个步骤推导:
A. 将 C n C_n Cn C n − 1 C_{n-1} Cn1 利用公式8求比值;
B. 分子分母提出 C 0 C_0 C0 和$ \sqrt{n}$, 并将其约掉;
C. 整理化简根号下的内容;
D. 将麦克劳林公式带入;
E. 忽略无穷下余项,化简求得; 将其化简为关于 C n C_n Cn 的式子如下:
c n c n − 1 = 4 n − 1 4 n + 1 C n = c n − 1 ( 4 n + 1 − 2 ) 4 n + 1 \begin{aligned} {c_n\over{c_{n-1}}} &= {{4n-1}\over{4n+1}}\\ C_n &= {c_{n-1} (4n+1-2)\over{4n+1}}\\ \end{aligned} cn1cnCn=4n+14n1=4n+1cn1(4n+12)
化简后得出:

C n = C n − 1 − 2 ∗ C n − 1 4 n + 1 (9) \begin{aligned} \boxed{C_n = C_{n-1} - 2*{C_{n-1}\over{4n+1}} } \tag{9} \end{aligned} Cn=Cn124n+1Cn1(9)

通过公式(7)和公式(9),即可推到出每个周期内的计时器的值,及每步的频率。经过化简的公式(9)有一定的误差,其得出的结果比公式(8)快。所以我们对公式(7)乘以0.676加以校正。

C 0 = 0.676 ∗ 2 α ω ˊ t t (10) \begin{aligned} \boxed{C_0= 0.676 *{\sqrt{2α\over{ώ}}\over{t_t}}} \tag{10} \end{aligned} C0=0.676ttωˊ2α (10)
通过公式(9)和公式(10)我们可以求出:

  • 加速初始PWM频率,即我们要求的ARR寄存器的值 C 0 C_0 C0
  • 电机加速阶段每一步的PWM频率,即ARR寄存器的值C

知道寄存器ARR的值后,我们就可以控制电机加速了,但是我们不知道电机应该加速到什么时候,即电机加速多少步以后开始匀速运行,多少步以后开始减速运行,接下来我们继续推导以上变量。

5、 推导脉冲数和加速度成反比。

在电机由速度零匀加速或匀减速到速度零的运动情况下,由 θ = 1 / 2 ω ˊ t n 2 θ=1/2 ώt_n^2 θ=1/2ωˊtn2 θ = n α θ=nα θ=nα可推出:
n α = 1 2 ω ˊ t n 2 nα = {1\over2} ώt_n^2 nα=21ωˊtn2
由速度 ω n = ω ˊ t n ω_n = ώt_n ωn=ωˊtn带入上式可得:
n α = 1 2 ω ˊ ( ω n ω ˊ ) 2 nα = {1\over2} ώ({ω_n \over{ώ}})^2 nα=21ωˊ(ωˊωn)2
转化一下后:

n ω ˊ = ω n 2 2 α (11) \begin{aligned} \boxed{n ώ = {ω_n^2\over{2α}} } \tag{11} \end{aligned} nωˊ=2αωn2(11)

公式(11)中,ω_n为最大速度,α为步距角,由此看出在最大速度和步距角不变的情况下,脉冲与加速度成反比。

6、在一个电机匀加速到一定速度,再匀减速的情况下,如下图:

在这里插入图片描述

由公式(11)可得:

n 1 ω ˊ 1 = n 2 ω ˊ 2 (12) \begin{aligned} \boxed{n_1 ώ_1 = n_2 ώ_2} \tag{12} \end{aligned} n1ωˊ1=n2ωˊ2(12)

两边同时加 n 1 ω ˊ 2 n_1ώ_2 n1ωˊ2得:
n 1 ω ˊ 1 + n 1 ω ˊ 2 = n 2 ω ˊ 2 + n 1 ω ˊ 2 n 1 ( ω ˊ 1 + ω ˊ 2 ) = ω ˊ 2 ( n 2 + n 1 ) \begin{aligned} n_1 ώ_1 + n_1 ώ_2 &= n_2 ώ_2 + n_1 ώ_2\\ n_1(ώ_1 + ώ_2)&= ώ_2 (n_2 + n_1 ) \end{aligned} n1ωˊ1+n1ωˊ2n1ωˊ1+ωˊ2=n2ωˊ2+n1ωˊ2=ωˊ2n2+n1
化简得出:

n 1 = ω ˊ 2 n 1 + n 2 ω ˊ 1 + ω ˊ 2 (13) \begin{aligned} \boxed{{n_1 = ώ_2 {n_1 + n_2\over{ώ_1 + ώ_2}} } }\tag{13} \end{aligned} n1=ωˊ2ωˊ1+ωˊ2n1+n2(13)

7、求加减速步数

对于步进电机加减速阶段来说,由于已经设定好了步进电机加速度、减速度、最大速度和总运行步数,所以说一共分为2种情况:

(1)电机能够加速到给定的最大速度,匀速运行一段时间后,再减速到0

在这里插入图片描述

S = ν t 2 – ν 0 2 2 a S = {ν_t^2 –ν_0^2\over{2a}} S=2aνt2ν02得到加速阶段的步数:

a c c e l _ s t e p = s p e e d 2 2 ω ˊ 1 ∗ α (14) \begin{aligned} \boxed{accel\_step={speed^2\over{2ώ_1 * α}}}\tag{14} \end{aligned} accel_step=2ωˊ1αspeed2(14)

A. 由公式(13)得到:

a c c e l _ l i m = n 1 = ω ˊ 2 ∗ t o t a l _ s t e p ω ˊ 1 + ω ˊ 2 (15) \begin{aligned} \boxed{accel\_lim = n_1 = ώ_2*{ total\_step\over{ώ_1+ ώ_2}}}\tag{15} \end{aligned} accel_lim=n1=ωˊ2ωˊ1+ωˊ2total_step(15)

B. 由公式(12)得出

d e c e l s t e p = − a c c e l _ s t e p ∗ ω ˊ 1 ω ˊ 2 (16) \boxed{decel_step = - accel\_step*{ώ_1\over{ώ_2}}}\tag{16} decelstep=accel_stepωˊ2ωˊ1(16)

负号是因为减速过程,带入公式(9)时用。带入公式(9)时, n 0 n_0 n0应为decel_step,其后每一步加1,直到停止。

(2)由于运动距离过短,电机无法加速到最大速度即开始减速:

在这里插入图片描述
加速阶段的步数由公式(15)计算,减速步数如下:

d e c e l s t e p = − ( t o t a l s t e p − a c c e l l i m ) (17) \boxed{decel_step = - ( total_step - accel_lim)}\tag{17} decelstep=(totalstepaccellim)(17)

负号是因为减速过程,带入公式(9)时用

通过以上推导,我们求出了梯形算法要求的所有变量。

六、 算法优化

由于算法在计算过程中涉及到一些浮点型运算,大量的浮点型运算会使得效率大大降低,为了使得计算速度得到更好的优化,我们做如下优化:

  1. 对于加减速的每一步来说,都需要重新计算下一步的时间,计算的过程中可能会出现除不尽的项式,为了更有利的加减速,可以采用加速向上取整,减速向下取整的原则来做运算,也可以采用余数累计的方法,在这里使用的是将余数累计的方法来提高间隔时间的精度和准确性。

    C n = C n − 1 − 2 C n − 1 + R e s t 4 n + 1 (18) \begin{aligned} \boxed{C_n = C_{n-1}-{2C_{n-1} + Rest\over{4n+1}}}\tag{18} \\ \end{aligned} Cn=Cn14n+12Cn1+Rest(18)

    余数公式:

    N e w _ R e s t = ( 2 C n − 1 + R e s t ) ( m o d ( 4 ∗ n + 1 ) ) (19) \begin{aligned} \boxed{New\_Rest =(2C_{n-1}+ Rest)(mod(4* n +1))} \tag{19} \end{aligned} New_Rest=(2Cn1+Rest)(mod(4n+1))(19)

    上式中,mod就是取余数的意思,即C语言中的%。
  2. 令:速度扩大100倍
    加速度扩大100倍
    扩大后的速度和加速度还用原来的字母表示
    则$C_0 = 0.676f_t\sqrt{2α/ώ} $ 加速度扩大100倍以后,变为:
    C 0 = 0.676 ∗ f t ∗ ( 2 ∗ 1 0 2 ∗ α ) / ω ˊ = 0.676 ∗ f t ∗ 1 0 − 2 ∗ 2 α ∗ 1 0 10 ω ˊ ∗ 1 0 − 2 \begin{aligned} C_0 &= 0.676*f_t*\sqrt{(2*10^2*α)/ώ}\\ &= 0.676 *f_t*10^{-2}*\sqrt{{2α*10^{10}\over{ώ}}}*10^{-2} \end{aligned} C0=0.676ft(2102α)/ωˊ =0.676ft102ωˊ2α1010 102
    令:
    T 1 _ F Q E Q = 0.676 ∗ f t ∗ 1 0 − 2 A _ S Q = 2 α ∗ 1 0 10 \begin{aligned} T1\_FQEQ &=0.676 *f_t*10^{-2}\\ A\_SQ &= 2α*10^{10} \end{aligned} T1_FQEQA_SQ=0.676ft102=2α1010
    则:

    C 0 = T 1 _ F Q E Q A _ S Q ω ˊ / 100 (20) \begin{aligned} \boxed{C_0 = T1\_FQEQ\sqrt{A\_SQ\over{ώ}}/100}\tag{20} \end{aligned} C0=T1_FQEQωˊA_SQ /100(20)

    公式(14)中,速度和加速度扩大100后,变化为:

    A c c e l _ s t e p = s p e e d 2 200 ω ˊ 1 α (21) \begin{aligned} \boxed{Accel\_step = {speed^2\over{200ώ_1 α}}}\tag{21} \end{aligned} Accel_step=200ωˊ1αspeed2(21)

    其他公式的加速度和速度相应放大100倍后,公式不发生变化

七、总结

在给定步距角α、定时器频率 f t f_t ft、加速度 ω ˊ 1 ώ_1 ωˊ1、减速度 ω ˊ 2 ώ_2 ωˊ2和最大速度speed以及总步数total_step的情况下,电机的加减速计算步骤如下:

1、 令:速度扩大100倍

加、减速度扩大100倍,
T 1 _ F Q E Q = 0.676 ∗ f t ∗ 1 0 − 2 A _ S Q = 2 α ∗ 1 0 10 \begin{aligned} T1\_FQEQ &=0.676 *f_t*10^{-2}\\ A\_SQ &= 2α*10^{10} \end{aligned} T1_FQEQA_SQ=0.676ft102=2α1010

2、计算Accel_step、accel_lim和decal_step:

下列公式分别计算:
a c c e l _ s t e p = s p e e d 2 200 ω ˊ 1 α a c c e l _ l i m = ω ˊ 2 ∗ t o t a l _ s t e p ω ˊ 1 + ω ˊ 2 \begin{aligned} accel\_step &= {speed^2\over{200ώ_1 α}}\\ accel\_lim &= ώ_2*{ total\_step\over{ώ_1+ ώ_2}}\\ \end{aligned} accel_stepaccel_lim=200ωˊ1αspeed2=ωˊ2ωˊ1+ωˊ2total_step
如果计算出的accel_step < accel_lim,则
d e c e l _ s t e p = − a c c e l _ s t e p ∗ ω ˊ 1 ω ˊ 2 \begin{aligned} decel\_step &= - accel\_step*{ώ_1\over{ώ_2}} \end{aligned} decel_step=accel_stepωˊ2ωˊ1

否则
d e c e l _ s t e p = − ( t o t a l _ s t e p − a c c e l _ l i m ) \begin{aligned} decel\_step &= - ( total\_step - accel\_lim) \end{aligned} decel_step=(total_stepaccel_lim)

3、 求出加速阶段的第一步的计时器的值:

由公式(20)
C 0 = T 1 _ F Q E Q A _ S Q ω ˊ / 100 \begin{aligned} C_0 = T1\_FQEQ\sqrt{A\_SQ\over{ώ}}/100 \end{aligned} C0=T1_FQEQωˊA_SQ /100
求出电机加速阶段的第一步的计时器的值。

4、求计数器的值

(1)加速阶段:

C n = C n − 1 − 2 C n − 1 + R e s t 4 n + 1 N e w _ R e s t = ( 2 C n − 1 + R e s t ) ( m o d ( 4 ∗ n + 1 ) ) \begin{aligned} C_n &= C_{n-1}-{2C_{n-1} + Rest\over{4n+1}}\\ New\_Rest &=(2C_{n-1}+ Rest)(mod(4* n +1)) \end{aligned} CnNew_Rest=Cn14n+12Cn1+Rest=(2Cn1+Rest)(mod(4n+1))
求出每步的计时器的计数值

(2) 匀速阶段:

已加速阶段的最大速度匀速运行

(3)减速阶段:

C n = C n − 1 − 2 C n − 1 + R e s t 4 n + 1 N e w R e s t = ( 2 C n − 1 + R e s t ) ( m o d ( 4 ∗ n + 1 ) ) \begin{aligned} C_n &= C_{n-1}-{2C_{n-1} + Rest\over{4n+1}}\\ New_Rest &=(2C_{n-1}+ Rest)(mod(4* n +1)) \end{aligned} CnNewRest=Cn14n+12Cn1+Rest=(2Cn1+Rest)(mod(4n+1))
求出每步的计时器的计数值,其中n的值decal_step,其值为负值。其后每一步计算Cn, decal_step加1,直到为0。

  • 38
    点赞
  • 203
    收藏
    觉得还不错? 一键收藏
  • 28
    评论
### 回答1: keil步进电机梯形减速算法代码是控制步进电机进行速和减速运动的一种算法。实现该算法的代码如下: 1. 定义必要的变量,包括步进电机的速度、速度和减速度。 2. 初始化步进电机速度为初始速度,速度为初始速度,减速度为初始减速度。 3. 进入循环,进行控制步进电机的运动。 4. 判断是否已达到目标速度,如果已达到则保持该速度不变,否则进行速运动。 5. 判断是否需要开始减速运动,如果需要则进入减速运动。 6. 当步进电机运动到目标位置时,停止运动。 7. 结束循环,完成步进电机梯形减速运动。 该代码可以用于控制步进电机在系统中进行精准定位和控制运动速度,使得步进电机运动更平稳和稳定。通过调整初始速度、速度和减速度等参数,可以实现不同的运动需求。 ### 回答2: Keil 是一款嵌入式开发工具,用于编写和调试嵌入式系统的代码。步进电机梯形减速算法可以使步进电机在启动、速、匀速、减速和停止等阶段运行平稳,避免产生震动或其他不稳定现象。 以下是一个示例的 Keil 步进电机梯形减速算法代码: ``` #include <reg52.h> sbit coil_A1=P2^0; // 步进电机相位1 sbit coil_A2=P2^1; // 步进电机相位2 sbit coil_B1=P2^2; // 步进电机相位3 sbit coil_B2=P2^3; // 步进电机相位4 void Delay(unsigned int i) //延时函数 { while(i--); } void main() { unsigned char i, j; unsigned char speed = 10; // 设置步进电机速度,值越小速度越快 unsigned char step[8] = {0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09}; // 步进电机顺时针转动步进序列 while(1) { for(i=0; i<8; i++) { for(j=0; j<speed; j++) { coil_A1 = step[i] & 0x01; coil_A2 = (step[i]>>1) & 0x01; coil_B1 = (step[i]>>2) & 0x01; coil_B2 = (step[i]>>3) & 0x01; Delay(500); } } } } ``` 以上代码使用 P2 口控制步进电机的相位,通过循环遍历步进序列来实现电机转动。speed 变量用于控制电机速度,具体数值可以根据实际情况进行调整。 在循环中,代码会通过设置相位的值来控制电机的转动,通过适当的延时时间来控制电机的速度。这样,步进电机就能按照梯形减速算法运行,实现平稳的转动。 ### 回答3: 以下是一个示例的Keil步进电机梯形减速算法代码: ```c #include <reg51.h> #define M1 P2.0 #define M2 P2.1 #define M3 P2.2 #define M4 P2.3 void delay(unsigned int count) { unsigned int i, j; for(i = 0; i < count; i++) { for(j = 0; j < 1275; j++); } } void main() { unsigned char step = 0; unsigned int delay_cnt = 1000; // 初始延时计数器 unsigned char full_step[4] = {0x09, 0x03, 0x06, 0x0C}; // 步进电机全步相序 while(1) { // 设置步进电机相序 M1 = (full_step[step] & 0x01) >> 0; M2 = (full_step[step] & 0x02) >> 1; M3 = (full_step[step] & 0x04) >> 2; M4 = (full_step[step] & 0x08) >> 3; // 延时 delay(delay_cnt); // 更新步进电机相序 step++; step %= 4; // 延时计数器减速 if(delay_cnt > 200) delay_cnt -= 10; else if(delay_cnt > 100) delay_cnt -= 5; else if(delay_cnt > 50) delay_cnt -= 2; else delay_cnt = 50; // 最快速度限制 } } ``` 以上代码使用Keil开发环境,基于8051单片机,控制了一个4相2线的步进电机。代码中使用了一个步进电机的全步相序数组,通过循环依次设置电机四个控制引脚,来控制电机的转向。在每个相序设置后,都有一个延时函数来控制转速。延时函数的延时时间在每次循环中递减,实现了梯形减速的效果。当延时计数器小于一定值时,延时时间不再减少,从而实现了最快速度的限制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值