当前位置: 首页 > article >正文

步进电机驱动算法——S形加减速算法原理

1. 前言:

最近项目又用到了步进电机,为了在运动中加减速更加平稳决定研究一下S型加减速,原来用过野火的s型加减速程序,云里雾里的移植成功了,今天再翻来程序看一脸懵逼,重新学习了一下发现所有公式都能看懂了,连起来就看不懂了,决定好好研究一下顺便做个笔记记录一下,方便以后回顾。野火、正点、硬石三家的资料都看过了,讲的内容几乎都是一模一样(难道好的设计都是心有灵犀?狗头),当你单看一家资料时你会产生很多疑问,当你看完三家的资料之后你就会发现打开了新世界的大门,原来是可以这么理解啊!各有各自详细的讲解部分。我感觉带着问题去找答案不太好理解,不如带着答案去分析问题,以下内容大部分均来自正点原子教程。

2. S 形曲线加减速的简介

加减速的变化过程中速度曲线呈现一个英文字母“S”形的,我们称之为 S 形加减速算法。则上述将这个过程描述为如下图所示
在这里插入图片描述
可以获知 OA 段其实就是滑块的加速部分、 AB 则是匀速部分, BC 则是减速部分。
⚫ 在 OA 加速过程中,速度刚开始是缓慢增加,后来增加得越来越快,而在中点时刻,增加又有所放慢,但依然继续增加逼近设定的速度。实际这一阶段又分成了三个阶段
⚫ 在 AB 匀速过程中,加速到设定速度之后,以设定速度匀速步进;
⚫ 在 BC 减速部分中,以设定的速度开始按照加速度段的变化规律做减速变化,直到速度降至 0 后停止。
梯形加减速的缺点,梯形加减速在启动、停止和高速运动的过程中会产生很大的冲击力振动和噪声,所以多数会应用于简单的定长送料的应用场合中,例如常见的3D 打印机使用的就是梯形加减速算法; 但是相比较 S 形加减速在启动停止以及高速运动时的速度变化的比较慢,导致冲击力噪音就很小,但这也决定了他在启动停止时需要较长的时间,所以多数适用于精密的工件搬运与建造。

3.S 形曲线加减速的的原理分析

3.1 七段式S曲线加减速

实际上要实现 S 型可以采用的方法有很多,在传统的 S 形曲线加减速算法中,它包括七个
运动阶段: 加加速阶段, 恒加速阶段, 减加速阶段, 恒速阶段, 加减速阶段,恒定减速阶段和减减速阶段。
在这里插入图片描述虽然该算法具有平稳、精度高的特点,但是也可以感受到该算法的参数复杂, 大大降低到了工作效率,而且对硬件的要求也比较高。因此, 本文介绍的是一种五段 S 曲线加减速算法并通过查表的方式进行实现,这是一种简单但具有实时性和高精度的加减速控制算法,非常适合资源紧凑的小型嵌入式系统。

3.2 五段式S曲线加减速

在这里插入图片描述
在图 17.2.1 中 T1、 T2、 T3、 T4、 T5 分别代表加加速阶段、 减加速阶段、 恒速阶段、 加减速阶段和减减速阶段的时间。为了使该开始点和结束点的加加速度在减加速阶段为零,加加速阶段的时间必须等于减加速阶段的时间,即 T1=T2, T4=T5=T。
以加速段为例,第一部分为加加速段,这部分是加速度 a 从 0 增大到最大值 Amax,第二部分是减加速度段, Amax 从最大值减少至 0(注意是加速度的变化!在加速度段,速度是一直在增加的!)也就是说两部的划分是看加速度 a 的最大值,减速度段也同理,只不过加速度是相反变化的。

4.S型加减速的加速度段参数 Vo(初速度)Vt(末速度)t(加速时间)

看到这大体的s型加减速原理都能看明白,但似乎又什么都没明白,该怎么转化成程序呢?我们控制步进电机的转速一般是控制定时器为输出比较模式下的输出比较值,就是调整脉冲的周期,周期越短,频率越高,电机运动就越快。带着答案去分析问题,就是现在我们已经知道在s型加减速中加速度段传入的参数有Vo(初速度)Vt(末速度)t(加速时间),在设定速度时, Vt 的单位应该设置为 Step/s,表示 1 秒内可步进多少步数, 这样设置还有一个好处是,速度 v 的倒数 1/V(每一步对应的时间)直接对应要输出脉冲的周期,对速度积分就得到路程S就是为总步数了,就知道了整个s加速过程中的总步数,程序上就知道创建多长的数组来存放每一步的速度值了,于是乎就有点头绪了。
同梯形算法一样,无论速度怎么变化,给定的距离是不变的,只要知道加速度段的距离和减速段的距离,确定加速阶段和减速阶段需要提供多少个脉冲,然后让控制器一个一个把脉冲送出去即可。但是这里需要说明的是,因为本文采用五段 S 曲线加减速算法模型使用对称结构, 所以当我们知道了加速度段距离求解算法,同理就知道了减速度距离的求解算法,它俩算法一样,只是速度排序为倒序关系。 所以这里不用另外求解减速度段的距离,这也是五段式的优点,如下图所示:
在这里插入图片描述

5.计算加速度段的位移S。

加速度段被分成了加加速度段和减加速度段,并且对应着两个不同的加速度,一个以加加速的方式逼近目标值,一个以减加速的方式逼近目标值,所以两部分所需要的步数也是不相同的,因为求解加速度段所需要的步数,可以通过求解加加速度段与减加速度段的和。

5.1 获取加加速度段的步数 S1

在这里插入图片描述
到这里我就好奇加速度a的变化量应该会影响s型加减速的曲线形状,那么怎么去确定那一个唯一的s型曲线呢?S型加减速的曲线并没有限定是什么曲线,可以是指数,也可以是正弦曲线,在这里分析的是s型加减速是基于加速度匀速变化的曲线,所以就可以确定一条s型曲线了。在这里插入图片描述

在这里插入图片描述

5.2 计算加加速度J1,即速度的变化率(jerk)

在这里插入图片描述而加速度在加速度段呈现两种变化,也就是在加速段有两种加速度斜率,我们知道在减加速度部段的加速斜率是以加加速度部段为基础反向变化的,所以只要知道加加速度段斜率就可知减加速度斜率。
在这里插入图片描述
由于 Vt 是用户设置的已知的,所以就可以求出 J1:
在这里插入图片描述需要注意的是:为了使 S1 的数值直接对应步数, 即 S1 的单位为 Step,(如 S1=2, 则为 2步,即需要两个脉冲),在设定速度时, Vm 的单位应该设置为 Step/s,表示 1 秒内可步进多少步数, 这样设置还有一个好处是,速度 v 的倒数 1/V(每一步对应的时间)直接对应要输出脉冲的周期。
那么知道了加加速度段的距离,再求解减加速度段的距离就能得到加速段的距离。

5.3 获取减加速度段的步数 S2

在这里插入图片描述

6. 确定下一个脉冲的周期

在这里插入图片描述
在这里插入图片描述
这里一开始稍微有点疑惑,速度一直是变化的,为什么对t1时刻这点的速度V倒数就是第二步脉冲的周期?
在硬石教程里面看到这样一句话,只要t变化足够小,那么速度变化就越平滑,得到的速度曲线就越接近目标曲线,这样的曲线实际上就以多段直线拟合成曲线,个人理解是每一步的脉冲周期都很小,可以近似看做该时刻的速度的倒数(如有不对,欢迎指正)。

7. 程序设计

程序方面就参考正点原子的例程,里面注释的还算详细,后面有空再补上。
整体流程
1.用户设置参数:vo:初速度;vt:末速度;AcTime:加速时间;DeTime:减速时间;step:要走的步数;;
2.求解未知量:根据已知量,求解中点速度、加速度、加加速段步数以及减加速段步数等;
3.生成速度表:设置s=1,计算第一步时间以及速度,求解出速度表;
4. 实现第一步:由速度表,求解第一步C值,设置定时器比较值以及开启脉冲输出,中断使能;
5.中断服务函数:由速度表得到每一步定时器计数值;判断当前运动状态,分别为加速段、匀速段、减速段和停止状态。

8. 扩展

#T梯形加减速算法 #SPTA算法 #七段S形加减速算法原理分析 #AVR446算法


http://www.kler.cn/a/459430.html

相关文章:

  • java class类对象 加载时机
  • springboot525基于MVC框架自习室管理和预约系统设计与实现(论文+源码)_kaic
  • Zynq PS端外设之GPIO
  • checked 溢出问题
  • AI知识库与用户行为分析:优化用户体验的深度洞察
  • 图像概念与分类
  • 面试经典150题——数组/字符串(二)
  • 开发运维基本功:无需复杂配置快速实现本地Nginx的公网远程访问
  • 【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(三)
  • 打破传统,手势验证码识别
  • DP协议:PHY层
  • JS - Array Api
  • 从零开始学架构——互联网架构的演进
  • C++ hashtable
  • No.3十六届蓝桥杯备战|数据类型长度|sizeof|typedef|练习(C++)
  • 线程-4-线程库与线程封装
  • 完整的 FFmpeg 命令使用教程
  • 【PyCharm】如何把本地整个项目同步到服务器?
  • 在web.xml中配置Servlet映射
  • 【Next.js】002-路由篇|App Router
  • 冒泡排序c语言
  • 百度PaddleSpeech识别大音频文件报错
  • vim/vi编辑器
  • 彩虹表的攻击与防御
  • 使用 IDE生成 Java Doc
  • C++基础:SGI STL二级空间配置器内存池