目录
/********************************************************************************************************************************************************/
本文源于野火的电机教程,在学习中发现其中有几处错误,影响理解,故改正并添加自己的学习笔记。
/********************************************************************************************************************************************************/
算法特点
为了使得不出现丢步或者超步现象并且提高效率,需要使得步进电机先以固定的加速度达到目标速度,然后以这个速度运行,快到达目标步数时再减到最低速;整个过程是一个梯形的模型, 所以以它的数学模型命名的加减速算法。
从模型中即可反映出算法的特点,数学模型中一共分为三个阶段,OA 加速部分、AB 匀速部分和 BC 减速部分。
• 在 OA 加速过程中,由低于步进电机的启动频率开始启动(模型中由 0 启动),以固定的加 速度增加速度到目标值;
• 在 AB 匀速过程中,以最大速度匀速运动;
• 在 BC 减速部分中,以加速度不变的速度递减到 0;
这种算法是一种在加速过程和减速过程中加速度不变的匀变速控制算法,由于速度变化的曲线有折点,所以在启动、停止、匀速段中很容易产生冲击和振动。
算法基础概念及方程
步进电机的转动需要控制器发送脉冲,如果控制器以恒定速度发送脉冲,那么步进电机就以恒定速度转动;如果控制器以加速度运动,那么步进电机就以加速度运动;所以只要改变脉冲的频率就可以改变速度的变化,也就是说调整脉冲之间的时间间隔就可以改变速度。
上图为步进电机与时间的示意图,其中
• 表示脉冲发送的起始时刻
• 表示脉冲发送的第二个时刻
• 表示脉冲发送的第三个时刻
• 表示定时器的计数周期
• 表示定时器从 时刻的定时器计数值
• 表示定时器从 时刻的定时器计数值
• 表示两个脉冲之间的间隔时间
以 stm32 的高级定时器 8 为例,定时器 8 的时钟频率为 168MHZ, 如果将分频值设置为 5,那么定时器的时钟频率则为:, 相当于计数 28M 次正好为一秒,周期与频率为倒数关系,所以分频值为 5 的定时器 8 的计数周期为:;
基础公式:
两次间隔脉冲时间
步距角(spr为一圈的脉冲数)
位置(相当于n个步距角)
速度
其中:
• n 为步进电机所转的脉冲数
• s 为时间单位秒
• spr 为步进电机所转一圈的脉冲数
• rad 为弧度单位 (1rad = (180/π)° ≈ 57.3°) • rad/sec 弧度每秒;1 圈(revolutions)= 2 * 3.1415 弧度(rad);(1 rad/sec = 60*1/(2*3.1415) rev/min = 9.55 rpm);1 rad/sec=9.55 rpm;
直线加减速模型解析
模型阶段分析:
要使得步进电机平稳的启动和停止,则需要控制好步进电机的加速度和减速度,控制好加速度和减速度就可得到好的曲线模型,上图中一共是三个不同变量与时间的变化曲线,分别是加速度 与时间、速度与时间和位置与时间的曲线。
在三个模型中的跳变位置已经画上对应的虚线,分别为虚线 a、虚线 b、虚线 c 和虚线 d
1. 起始点 ~a:在这阶段中,速度、加速度、位置都没有变化;
2. a~b 阶段:从虚线 a 开始,在这阶段中加速度不变,速度与位置不断上升,并且速度是以恒定加速度上升,上升到最大速度也就是速度曲线与虚线 b 的交点;
3. b~c 阶段:在这阶段中,以不变的速度在运行,由于速度不变,则加速度为零,并且位置在 这阶段呈现一个一次函数的上升阶段;
4. c~d 阶段:在这阶段中,速度开始呈匀减速的状态,所以加速度为负值,但是位置依旧上 升,但上升曲线逐渐变慢;
笔记:三幅图之间是导数关系,位移(此处就是电机转过的角度)对时间求导就是速度(此处就是电机轴的角速度),对速度求时间的导数就是加速度(此处就是电机轴的角加速度)。
进一步理解:
在已经对模型的几个阶段有所了解后,下面对加速部分进一步讲解;
上图中分别是对 ω-t 和 θ-t 的变化图: 在 ω-t 图中是梯形加减速模型中的加速部分中,红色竖线表示的是脉冲发生的位置,由加速的方向看(从左到右),在图上两个相邻之间的脉冲之间的距离越来越近,根据 δt=ct 计数周期不变, 计数值越来越小也就意味着脉冲之间的间隔时间变短了,频率变快了,直接让步进电机转的更快了;所以说脉冲之间的定时器计数值是影响脉冲频率变化的重要因素。
在 θ-t 图中,脉冲每产生一次就对应着 θ 轴上的一小格,ω-t 图中工产生 6 次脉冲就对应 θ-t 中的 6 次位置的变化。
脉冲时间间隔的精确计算
脉冲间隔决定速率变化,所以对于脉冲的时间间隔计算就显得尤为重要。
时间间隔的计算由以下几个公式推导出来:
公式1
注:n 表示脉冲个数;α 表示步距角;
在第 n 个时刻的脉冲角度,所以 nα 就是 n 个脉冲实际旋转的角度;这里可以说是角度也可以说是位置,单纯说一个脉冲那就是一个步距角,那么电机与丝杆滑台联系到一起那最终作用到的就是滑台的位置移动了。
公式2
对于这个公式应该都不陌生,物理学中的匀加速运动的距离公式,在梯形加减速中加速部分就是匀加速运动。当 v0=0,并且将相关变量带入得:
公式3
注:S 表示位移; 表示加速度; 表示时间点
笔记:此处的S的位移,在电机上就表示的是电机的位移,也就是电机轴的角位移,即公式1。
将上述公式整理为:
公式4
可以将上述理解为两个时间点,那么相邻脉冲的时间点的差值就是脉冲的时间间隔;所以计数器的时间间隔公式为:
公式5
笔记:参考算法基础概念与方程小节的图片,注意公式中变量的下标。
公式6
公式7
将 n 与 n+1 带入公式 4 并且提出公因式即可得到公式 6,将公式 6 左右两侧除以 ,即可得到公式 7。
公式8
公式9
当 n=0 带入公式 7,括号内的数值为 1,并且算出第一次产生脉冲的计数值 C0;仔细观察公式 8 与公式 7,发现可以将公式 8 直接带入到公式 7,即可得到公式 9;此时第 n 次的脉冲间隔的计数值只与第一次的计数值和次数有关。
由于计算的过程中需要进行开方运算,微控制器的计算能力有限,因此在此使用泰勒公式进行泰勒级数逐级逼近的方法。在这里主要是用的是泰勒公式的特例——麦克劳林公式;具体如下图:
公式10
笔记:不用知道是什么,直接替换就可以,有兴趣的可以看高等数学中相关的部分。
为构造与麦克劳林相同的公式将 n-1 ,并且与公式 9 做比值处理,并进行化简计算,具体如下图所示:
公式推导一共分为以下 5 个步骤推导:
1. 步骤 1 是将 n 与 n-1 分别带入到公式 9;
2. 分子分母提出 C0 和根号 n, 并将其约掉;
3. 整理化简根号下的内容;
4. 将麦克劳林公式带入;
5. 忽略无穷下余项,化简求得;
将其化简为关于 Cn 的式子如下:
公式11
这样就避免了开方两次的问题,由于在化简时舍弃了无穷小余项,所以验证下化简前后的误差:
原式
化简后
当 n=1 时,分别带入以上两个式子,求得其结果,发现出现偏差,但是可以通过将化简后的 C0 乘以一个 0.69 的参数进行矫正这个误差。
加减速度与步数的关系
根据上一小节推导的公式可得:
(1)
(2)
(3)
(4)
(5)
1. 这是初速度为 0 的匀加速运动的基础方程,只不过其中一些变量是与具体参数有关的,具 体可以参考上一小节的公式;
2. 步距角与步数的乘积相当于旋转角度,或者位置;
3. 将 (1) 与 (2) 的关系式联系起来就是公式(3);
4. 根据 V=V0+at,初始速度为 0 得 V=at,再将其带入相关变量;
5. 将公式(4)带入公式(3)
笔记:将公式4化成关于tn的表达式,代入公式3中,经过化简后就得到了公式5。
在上述公式中有相关变量分别为:步数、加速度、速度和步距角四个变量,由于步距角是一个固定值,所以当速度设置为最大值时步数就与加速度成反比,也就是当加速度小的时候需要较多的 步数,当加速度大的时候需要较少的步数就可以到达目标速度。 由于步进电机加速到最大的时候速度与其刚开始减速时的速度一样,具体看下图:
根据上图,我们只要修改步数就可以修改加速度的数值,所以有以下公式:
公式12
笔记:可以理解为两个三角形共边,放在两个三角形内求共边的长度,加速度就相当于三角形的内角的tan值。
当初始速度和末速度都为 0 并且给定步数时,为了得到加速的步数,将公式 12 整理得:
(1)
(2)
(3)
(4)公式13
1. 将公式 12 写到这里;
2. 将等式两端分别加上同一项,保证等式;
3. 将等式两端分别提出公因式;
4. 将左侧除 n1 外多余的项移到右侧;即可得到公式 13;
算法理论实现
由于算法在计算过程中涉及到一些浮点型运算,大量的浮点型运算会使得效率大大降低为了使 在计算浮点型的速度得到更好的优化,所以这一小节主要讲解由算法到代码的一些变量参数的放大转换过程和一些相关算法的不同情况。
控制步进电机需要四个描述速度曲线的参数;速度曲线从零速度开始,加速到给定速度并持续到减速开始,并且最后减速至零给定步数的速度。
• step 需要移动的步数
• accel 加速度
• decel 减速度
• speed 最大速度
设计计算
最小间隔
根据前几小节可有一下公式:
在上式中最终得出的是间隔时间与速度的函数关系式;其中步距角与定时器的频率为定值,所以说速度与脉冲时间间隔成反比;
在这里将步距角与定时器的频率放大 100 倍,并将数值赋值给变量 A_T_x100 所以最小的时间间隔的公式就为 min_delay=A_T_x100/speed ;
笔记:此处的speed已经放大了100倍,所以最终结果保持不变。
C0
以下是加速度相关的参数:
笔记:公式中的100是为了保证经过放大后最终结果保持不变而引入的参数。
以上两个关于 C0 的是带入参数后的式子和原始的式子,在 step_delay 中参数T1_FREQ_148 矫正了误差并且将其缩小 10 的两次方倍,将 A_SQ 放大 10 十次方倍,由于放大倍数是在根号下放大的 10 的 10 次方,开根号后就是 5 次方,加速度也放大 10 的二次方倍,在除以 100,正好就是与原始相等;(具体运算如下图)
• 步骤(1)中是原始式子
• 步骤(2)矫正误差并且将放大的倍数分解
• 步骤(3)整理分解的倍数
• 步骤(4)最后的结果只与原始有误差矫正的区别
以上的整理说明,即使放大或者缩小了部分参数的倍数只要保证结果不变,会给计算带来很大的便利。
加减速情况分析
对于加减速的情况来说,由于已经设定好了步进电机加速度、减速度、最大速度和步数,所以说一共分为两种情况:
第一种情况:持续加速到最大速度然后再减速到 0
第二种情况:在没达到最大速度之前就需要开始减速到 0
第一种情况
根据上图可以很明显的看到 7 个参数,其中
• speed: 算法设置的最大速度;
• accel:加速度;
• decel:加速度;
• step :总步数;
以上的参数都是程序里面直接给出的,不需要求解。
• max_s_lim:速度从 0 加速到 speed 所需的步数;
• accel_lim:在忽略最大速度的情况下,开始减速之前的步数,也可以理解为加速度曲线与 减速度曲线的交点;
• decel_val:实际减速的步数;
以上的参数都是需要根据前面的计算推导求解的。
max_s_lim:
根据速度与路程的物理公式,所以有以下公式:
并将其图中相关参数带入,具体如下图:
笔记:speed 是扩大 100 倍后的数值,那么平方就是 10000 倍,分母的加速度也是扩大了100倍,所以分母需要乘以 100,才能保证结果不变。
accel_lim:
最大的加速步数公式推导可以参考加减速度与步数的关系章节;
如果 max_s_lim < accel_lim,则通过达到所需速度来限制加速度;所以减速度取决于此,在这种情况下,通过以下方法找到 decal_val:
笔记:标黄的话意思可以理解为:max_s_lim表示达到所需要的速度(speed)所需要的步数,accel_lim表示的是电机所能达到的最大速度所需要的步数,max_s_lim < accel_lim,就是在达到电机所能达到的最大速度(图中的折点)之前,达到了所需要的速度(speed)。
decel_val:
根据公式 12 可以直接推出 decel_val 的表达式;但是由于是减速度的步数,所以需要带上负号, 具体公式如下图:
第二种情况
这种情况是在还未达到最大速度时就已经开始减速了;其中 accel_lim、max_s_lim 不需要重复计算了;
当 max_s_lim > accel_lim 时,如上图加速受减速开始的限制,所以 decel_val 表达式为:
笔记1:标黄的话意思可以理解为:max_s_lim表示达到所需要的速度(speed)所需要的步数,accel_lim表示的是电机所能达到的最大速度所需要的步数,max_s_lim > accel_lim,就是在电机达到了所需要的速度(speed)之前,电机就已经达到了所能达到的最大速度,即在外界条件不改变的情况下,电机不能再转的更快了,如此表明程序所需要的速度(speed)太高了,电机达不到对应的转速。
笔记2:当max_s_lim = accel_lim,其情况和max_s_lim > accel_lim情况一样,所以处理办法也是一样的。
中断状态区分
上图表现的是速度在数学模型中的几个阶段性速度,具体看上图。
上图是这几个状态机之间切换的的关系图:
• 第一种情况:当步数为 1 时,毫无疑问直接进入到减速阶段然后到停止状态
• 第二种情况:当步数大于 1,并且会加到最大速度,会经过:加速状态-> 匀速状态-> 减速 状态-> 停止状态
• 第三种情况:当步数大于 1,并且不会加到最大速度,会经过:加速状态-> 减速状态-> 停 止状态
笔记:如果只让电机转一步的话,那么就直接进入减速状态,因为没有多余的步用来加速,想要有加速阶段,至少要有两步。
对于加减速的每一步来说,都需要重新计算下一步的时间,计算的过程中可能会出现除不尽的项式,为了更有利的加减速,可以采用加速向上取整,减速向下取整的原则来做运算,也可以采用 余数累计的方法,在这里使用的是将余数累计的方法来提高间隔时间的精度和准确性。 根据公式 11 可有: