步进电机驱动算法——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算法
相关文章:
步进电机驱动算法——S形加减速算法原理
1. 前言: 最近项目又用到了步进电机,为了在运动中加减速更加平稳决定研究一下S型加减速,原来用过野火的s型加减速程序,云里雾里的移植成功了,今天再翻来程序看一脸懵逼,重新学习了一下发现所有公式都能看懂…...
【图像去噪】论文复现:大道至简!ZS-N2N的Pytorch源码复现,跑通源码,获得指标计算结果,补充保存去噪结果图像代码,代码实现与论文理论对应!
请先看【专栏介绍文章】:【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中) 完整代码和训练好的模型权重文件下载链接见本文底…...
2024年中国新能源汽车用车发展怎么样 PaperGPT(一)
概述 在国家政策的强力扶持下,2024年中国新能源汽车市场迎来了新的发展机遇。本文将基于《中国新能源汽车用车报告(2024年)》的数据,对新能源汽车的市场发展和用车趋势概述。 新能源汽车市场发展 政策推动:国家和地…...
数据结构-排序思想
直接插入排序 将后面的无序区中的元素挨个向前面的有序区中插入。 1.将顺序表中R[0]用作哨兵,按索引i2...n的次序,将R[i]向有序区R[1...i-1]中执行插入操作。 2.插入操作可采取在有序区中从后向前的查找比较和移动的方法。 3.此操作中比较的次数与原序列…...
python 快速排序(Quick Sort)
快速排序(Quick Sort) 快速排序是一种高效的排序算法,采用分治法(Divide and Conquer)策略。它的基本思想是:选择一个基准元素(pivot),将数组分为两部分,使得…...
MySQL数据库——常见慢查询优化方式
本文详细介绍MySQL的慢查询相关概念,分析步骤及其优化方案等。 文章目录 什么是慢查询日志?慢查询日志的相关参数如何启用慢查询日志?方式一:修改配置文件方式二:通过命令动态启用 分析慢查询日志方式一:直…...
【AIGC篇】AIGC 引擎:点燃创作自动化的未来之火
:羑悻的小杀马特.-CSDN博客 未来都是惊喜。你生来本应为高山。并非草芥。 引言: 在当今数字化的时代,人工智能生成内容(AIGC)正以一种前所未有的力量改变着我们的创作领域。它就像一个神秘而强大的魔法师,…...
C语言性能优化:从基础到高级的全面指南
引言 C 语言以其高效、灵活和功能强大而著称,被广泛应用于系统编程、嵌入式开发、游戏开发等领域。然而,要写出高性能的 C 语言代码,需要对 C 语言的特性和底层硬件有深入的了解。本文将详细介绍 C 语言性能优化的背后技术,并通过…...
常用的公共 NTP(网络时间协议)服务器
公共 NTP 服务列表 以下是一些常用的公共 NTP(网络时间协议)服务器,供您参考: 中国地区公共 NTP 服务器 国家授时中心 NTP 服务器:ntp.ntsc.ac.cn中国 NTP 快速授时服务:cn.ntp.org.cn阿里云公共 NTP 服务…...
Kafka中的Topic和Partition有什么关系?
大家好,我是锋哥。今天分享关于【Kafka中的Topic和Partition有什么关系?】面试题。希望对大家有帮助; Kafka中的Topic和Partition有什么关系? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Apache Kafka 中&#…...
Unity 使用UGUI制作卷轴开启关闭效果
视频效果 代码 using UnityEngine.UI; using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using DG.Tweening.Core; using DG.Tweening.Plugins.Options;public class JuanZhou : MonoBehaviour {[SerializeField]private …...
MarkDown怎么转pdf;Mark Text怎么使用;
MarkDown怎么转pdf 目录 MarkDown怎么转pdf先用CSDN进行编辑,能双向看版式;标题最后直接导出pdfMark Text怎么使用一、界面介绍二、基本操作三、视图模式四、其他功能先用CSDN进行编辑,能双向看版式; 标题最后直接导出pdf Mark Text怎么使用 Mark Text是一款简洁的开源Mar…...
整合版canal ha搭建--基于1.1.4版本
开启MySql Binlog(1)修改MySql配置文件(2)重启MySql服务,查看配置是否生效(3)配置起效果后,创建canal用户,并赋予权限安装canal-admin(1)解压 canal.admin-1…...
QGIS移动图元功能
有时需要在QGIS里面移动一些矢量图层,比如图层的地理配准,网上搜了一些资料没有查看,后来仔细找了下,在编辑-编辑几何图形-移动要素里面,可以移动图层。 注意:移动前先要选择上要移动的图层,之…...
【模电刷题复习--填空】
如有错误,欢迎各位大佬在评论区批评指正 模电刷题 一、填空题1.本征半导体中,若掺入微量的__五__价元素,则形成___n___型半导体,其多数载流子是自由电子,若掺入微量的__三__价元素,则形成__p__型半导体。其…...
shardingsphere-jdbc-core-spring-boot-starter的性能问题(理论)
hardingSphere-JDBC-core-spring-boot-starter 是 ShardingSphere 提供的与 Spring Boot 集成的模块,用于实现数据库的分库分表等功能。在性能方面,它既有优势也存在一定的挑战,以下是具体分析: 优势方面 数据分片提升查询性能 通…...
Java Map 集合详解:基础用法、常见实现类与高频面试题解析
在 Java 集合框架中,Map 是用于存储键值对(Key-Value)的重要接口,广泛应用于开发中的各种场景。本文将详细讲解 Map 的基础概念、常见实现类及其特性,并结合代码示例和高频面试问题,帮助你深入理解 Map 的用…...
一款基于.Net方便、快捷的数据库文档查询、生成工具
项目介绍 SmartSQL 是一款方便、快捷的数据库文档查询、导出工具!从最初仅支持SqlServer数据库、CHM文档格式开始,通过不断地探索开发、集思广益和不断改进,又陆续支持Word、Excel、PDF、Html、Xml、Json、MarkDown等文档格式的导出。同时又…...
Linux平台下实现的小程序-进度条
目录 1.换行、回车概念 2.缓冲区 2.1缓冲区 2.2强制刷新 3.进度条程序 Makefile文件 ProgressBar.h ProgressBar.c Main.c 执行结果 1.换行、回车概念 /n:换行回车(\r:回车) 2.缓冲区 如下图在vim编辑器中的命令模式下…...
Ubuntu 22.04.5 修改IP
Ubuntu22.04.5使用的是netplan管理网络,因此需要在文件夹/etc/netplan下的01-network-manager-all.yaml中修改,需要权限,使用sudo vim或者其他编辑器,修改后的内容如下: # Let NetworkManager manage all devices on …...
别再死记硬背了!用打王者荣耀掉帧的例子,5分钟搞懂视频编码里的I/P/B帧
游戏卡顿背后的秘密:用王者荣耀掉帧理解视频编码中的I/P/B帧 当你正沉浸在王者荣耀的激烈团战中,手指在屏幕上飞速滑动,准备释放关键技能时,画面突然卡顿——右上角的FPS数值从60骤降到20。这种令人抓狂的体验背后,隐藏…...
金融项目实战:用sm-crypto为你的Vue/React前端和Node后端加上国密‘安全锁’
金融级数据安全实战:基于SM国密算法的前后端全链路加密方案 在金融科技和政务系统等对数据安全有严格要求的领域,国密算法(SM系列算法)正逐渐成为行业标配。不同于传统的AES、RSA等国际通用算法,国密算法针对中文环境进…...
对比直接购买与使用TaotokenTokenPlan的月度成本体感
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直接购买与使用Taotoken TokenPlan的月度成本体感 对于个人开发者或小型团队而言,在大模型应用开发过程中…...
初创公司如何借助Taotoken降低大模型API的试用与集成门槛
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初创公司如何借助Taotoken降低大模型API的试用与集成门槛 对于初创公司而言,技术选型阶段的效率与成本控制至关重要。在…...
Komanda代码嵌入功能详解:Gist、JSFiddle和Twitter无缝集成
Komanda代码嵌入功能详解:Gist、JSFiddle和Twitter无缝集成 【免费下载链接】komanda The IRC Client For Developers 项目地址: https://gitcode.com/gh_mirrors/ko/komanda Komanda作为一款面向开发者的IRC客户端,提供了强大的代码嵌入功能&…...
2025_NIPS_Team-PSRO for Learning Approximate TMECor in Large Team Games via Cooperative Reinforce...
文章核心总结与翻译 一、主要内容 本文聚焦双人零和团队博弈(如桥牌、足球),针对现有算法要么仅适用于小型博弈且有博弈论保证,要么能扩展到大型博弈但缺乏理论保证的问题,提出了两种基于策略空间响应预言机(PSRO)的改进算法,旨在高效学习近似团队协调最大最小均衡(…...
约瑟夫环问题C语言实现详解:从数组模拟到链表优化,新手避坑指南
约瑟夫环问题C语言实现详解:从数组模拟到链表优化,新手避坑指南 约瑟夫环问题是一个经典的算法挑战,它模拟了一个古老的历史场景:一群人围成一圈,按照特定规则逐个淘汰成员,直到最后一人幸存。对于C语言初学…...
温柔沟通术,稳住实习候选人的心w
为什么高冷的企业在校招中容易丢分? 在金融与科技企业的校招抢人大战中,HR常发现一个现象:有些各方面条件都极佳的应届生,在面试流程过半时突然“消失”了。深究其原因,往往不是因为薪资或岗位本身,而是因…...
别再混着用了!详解Nginx 1.25.1中独立的http2指令与listen指令的拆分逻辑
Nginx配置演进:从listen指令到独立http2指令的技术深析 当你在Nginx 1.25.1的日志中发现the "listen ... http2" directive is deprecated警告时,这不仅仅是一个简单的语法变更通知。它标志着Nginx在协议支持架构上的一次重要演进,…...
BIN文件操作指南:从字节视角到实战应用
1. 项目概述:为什么我们需要系统性地掌握BIN文件操作?在嵌入式开发、固件逆向、游戏修改乃至数据恢复这些领域里,我们经常会遇到一个后缀名为.bin的文件。很多新手朋友第一次接触时可能会有点懵,这既不是文本文件可以直接打开看&a…...
