简介
说明:具体看正点原子电机例程文件
步进电机因其无需反馈就能对位置和速度进行控制而在工业自动化设备中的应用极为广泛,如下图所示,假设该装置使用步进电机实现物体 X 的移动,系统要求从 A 点出发,到 B点停止,移动的时间越短越好且系统稳定。
根据步进电机的特性,最大程度加大电机转速(提高脉冲频率),则到达 B 点的时间就越短,但是如果施加脉冲频率太高,超过了步进电机的最小启动频率,则会造成电机内部的反向电动势的阻尼作用,转子与定子之间的磁反应将跟随不上电信号的变化,导致堵转或者丢步,滑块连动都没动,非常尴尬!
所以要求在电机启动时需要一个低速,但为了实现系统要求,在启动之后慢慢的升高速度,实现一个加速的过程,那如果在达到终点前一直在加速,就又有另外一个问题,到达终点时速度太快就会导致刹不住,出现过冲现象,为了防止这个现象我们需要在达到终点前的一段距离提前减速,使得滑块到达终点时速度刚好为 0,即从最高速度一直减至停止。如果在加速的过程中,从启动速度到目标速度的加减速是以一定的比例进行加速/减速,则可以将这个过程描述为如下图所示:
⚫ 在 OA 加速过程中,由低于步进电机的启动频率开始启动(模型中由 0 启动),以固定的加速度增加速度到目标值;
⚫ 在 AB 匀速过程中,以最大速度匀速运动;
⚫ 在 BC 减速部分中,以加速度不变的速度递减到 0;
这种算法是一种在加速过程和减速过程中加速度不变的匀变速控制算法。
原理分析
那接着就是我们的重头戏了,如何实现梯形加减速算法?步进电机的速度由脉冲频率决定,在匀速运动的过程中,脉冲的频率是固定不变的,根据步进电机特性,每给一个脉冲,电机就会步进固定的距离(将角度转换为距离),知道了 A 点到 B 的距离,就可以知道步进电机需要走多少步,然后让控制器输出所需个数且固定频率的脉冲就行。
在加减速段的过程中,速度是不断的改变的,所以需改变脉冲的频率,让电机在加速时给高频率的脉冲,减速时给低频率脉冲。那具体下一个变化的脉冲的周期是多少?虽然从 A点到 B 点所需要的总步数(脉冲)不变,但在加速阶段时需要多少步数?多少步之后需要减速?减速阶段要步进多少步?所以接下来我们一个个解答这些疑问,前方高能,请做好心理准备
需要先明确要求解的未知量有哪些?
(1)加速阶段时需要多少脉冲数?使用 n1 进行表示
(2)减速阶段要步进多少脉冲数?使用 n2 进行表示
(3)下一个变化的脉冲的周期是多少?使用 T 进行表示
因为要实现加减速效果,所以输送给电机的脉冲的周期是变化的,只要确定下一个脉冲的周期,并且确定加速阶段和减速阶段需要提供多少个脉冲,然后让控制器一个一个把脉冲送出去即可。如下图所示:
在进行加减速前我们必须要确定的参数量有如下:
(1)电机需要步进的距离,使用 step 表示 ;
(2)加速度大小,使用 accel 表示 ;
(3)减速度大小,使用 decel 表示 ;
(4)最大速度,决定电机匀速时的速度值,用 Max_ω 表示 ;
这些参数在步进电机做加减速之前就要求用户来设置好,也就是我们的已知量。根据设置的参数不同,系统将有如下两种运动情况:
第一种设置情况
最大速度设置偏大,而加速度设置偏小,导致电机步进了很多步数依然没有达到最大速度,但此时距离终点 Step 可走的步速越来越少,再不减速将无法在终点时使速度降为 0。所以这种情况,其加速模型并不呈现梯形,加速不到最大速度将要被迫降速。
运动变化图形类似于三角形,上图全部有以下几个参数:
Max_w :用户设置的最大速度;
accel :加速度大小;
decel :减速度大小;
step :总步数;
这些都是已知量,不需要求解,接着看下需要求解的变量:
max_s_lim :速度从 0 加速到 Max_w 所需要的步数,也就是与最大速度的交点;
acc_lim :加速度曲线与减速度曲线的相交点;
decel :实际减速的步数;
此时 n1 = accel_lim,加速段延长线做数学模型,得出只要满足:acc_lim ≤ max_s_lim,运动变化状态就呈现三角形,首先我们通过求解 accel_lim 则可获知加速段的步数,不难看出,这里有一个等式条件:加速段的末速度 ω1 和开始减速的速度 ω2 是相等的,所以:
此时的 t1 为加速段步进消耗的时间,t2 则是减速段的时间,从上面的模型中可知,梯形加减速运动规律符合物理学中匀加速运动,既然我们的疑问是关于加速过程中走过的距离问题,想必大家都已经想到了经典的位移公式,根据这个公式我们就获知时间 t,然后将时间 t转换为我们想要的步数
没错,位移 S 就是步进电机的步进距离,等于步距角(a)和脉冲个数(n)的乘积,在初速度为 0 则有以下公式,其中加速度 a 为角加速度 w:
简单变换一下,将时间 t 转化为已知量可得:
结合[式 1-2]和[式 1-5],即可得出我们迫切想要求解的加速段的脉冲数 n1:
因为 n1 和 n2 都是未知的,但是 n1+n2=step 是可知的,所以这里还需要做一个技巧性处理,
由上求解出了加速段脉冲数 n1,已知总的脉冲数 step 不变,则可知减速段
其中负号是因为减速阶段的运动方向和减速度的方向是相反的。这就是第一种情况下的加减速阶段的脉冲个数求解方法,接着看下第二种情况。
第二种设置情况
最大速度设置偏小,而加速度设置偏大,步进电机很快就加速到了设置的最大速度,距离设置的终点 max_w 还有剩余很长的步数可以走,此时,电机以最大速度匀速步进,直到满足减速条件才开始减速,并刚好使得速度到终点时降至 0。
由上图得出只要满足:acc_lim >max_s_lim,运动变化状态就呈现梯形,那么此时加速段步数 n1=max_s_lim,由最大速度已知我们可以直接得到以下等式:
我们知道了加速段的步数,也知道总步数,但是减速度段不单单只总步数减去加速度段,因为,中间需要一个匀速步进段,但是从图中可以看出,减速前的速度等于最大速度的条件是依然不变的,我们同样可以使用前面 1–6 的公式,求解减速段的步数。
注意:decel_val 是减速段的步数,而不是开始减速的步数,开始减速的步数等于总步数减掉减速段的步数(实际减速段步数为负值,所以直接将总步数与减速段步数相加即可)。解决了加速和减速阶段时需要多少脉冲数的问题,接着还需要求出 accel_lim 的大小,以便在程序中比较 accel_lim 与 max_s_lim 的大小判断当前运动状态属于哪种情况。同样的交点满足速度相同所以:
实际上上述复杂的不需要理解透彻。看这个图片,已经列举的已知量和求解量,我们通过将角位移转化为了直线上的位移
接下来是重点,需要完成的:
第一个任务为:下次脉冲周期T求解
:也就是t1-t0,t2-t1······
同样的它也可以由计数值乘以计数周期(计一个数的时间)
这里加速时的初速度为0
一般情况下带根号比较难计算,做一些去掉根号的化简运算
这里单片机计算浮点数能力较弱,一般会放大来变为整数计算,提升运算效率。
c值再次复习下它是一个脉冲时间下的计数值
到这里回顾下有两种方式,一个是现在加速直接减速(最大速度设置的较大),另外是现在加速到达最大速度保持匀速再减速,所以主要取决于设置的最大速度的值。下面主要还是围绕梯形加减速。
加减速度与步数的关系( ②最大速度偏小,加速度偏大,max_s_lim < accel_lim )
③
④
结合③和④,得出加速段的步数结果:
accel就是w点,到这里我们求出来加速段的总步数n1
求解减速度步数以及accel_lim
由于加速段的末速度等于减速段的初速度:
所以减速段的步数:
这里用负号代表减速,在代码里会将负号加一直到减速到0运动停止下来移动到预定位置
接着就是求accel_lim如第一种情况一样 ,这里首先加速度和减速度一样的,同时他们的延长线虚线也满足速度相等
尽管n1和n2不在像三角模型一样n1+n2=step了,但延长后的是三角形模型,就可以当三角形模型的来推理。
定时器中断处理流程
定时器中断产生步脉冲并且只有在步进电机移动时进入,四个不同运动的状态,分别是stop——accel——run——decel——stop,如图:
当它的速度越大,c值会越小,因为速度越大一个脉冲周期时间越短,计数值c也越小
所以重点来了: 当c0也就是第一步的速度比cmin大,代表着速度是小于最大速度的,此时就可以进入匀加速状态。而如果当它小于等于cmin时,就进入匀速状态了。
那么什么时候进入减速状态:我们再用总步数step+n2,当现今完成的步数与这个值相等时,就进入减速状态(注意,前面加的n2,n2是一个负数)
什么时候电机减速停止:当进入减速状态时,同时让n2+1,负数加1到0时,也就是电机停止的时候
在定时器中断实现状态机功能:
再次总结我们所有要计算的未知量:
c0:
cmin:
max_s_lim:
accel_lim:
最后设置的如果是加速状态要设置比较值c0,匀速状态设置比较值cmin,每次完成一个脉冲进入中断都会更新c的值