目录

  • 1 前言
  • 2 理论分析
    • 2.1 选择曲线
    • 2.2 计算函数方程
    • 2.3 单位分析
    • 2.4 模拟验证
  • 3 两种代码实现
    • 3.1 速度与时间关系
      • 3.1.1 原理
      • 3.1.2 优点
      • 3.1.3 缺点
    • 3.2 速度与位移关系
      • 3.2.1 原理
      • 3.2.2 优点
      • 3.2.3 缺点
  • 4 测试验证
  • 5 参考文献

1 前言

手上有个42步进电机,可是要么龟爬要么光叫不跑,百度了才知道要有个加速过程,而各种加速中又属S形加速最棒,那我当然要一步到位啦。 以下图片可以很好的展示S形加速的特点:

网图侵删。
更新了实机演示视频:

https://www.bilibili.com/video/BV1Zm4y1h7Bp/

2 理论分析

2.1 选择曲线

加速曲线有很多,梯形、余弦、多项式、7段S型、7段修正S型、15段S型、31段S型等。

其中很多分段函数一看就很复杂,需要的参数也很多,我们选一种简单的,仅需要一个表达式就能确定的加速曲线:

2.2 计算函数方程

首先确定三个输入参数,也就是函数中的常量:
起始速度 V 0 − − 目标速度 V 1 − − 加速时间 T 起始速度V_0 -- 目标速度V_1-- 加速时间T 起始速度V0​−−目标速度V1​−−加速时间T
由图可知加速度为二次函数,且极值点 t = T 2 t=\frac{T}{2} t=2T​,所以 a − t a-t a−t表达式为:
a ( t ) = k ( t − T 2 ) 2 + n a(t)=k(t-\frac{T}{2})^2+n a(t)=k(t−2T​)2+n
因为函数图像过原点,所以带入 a = 0 , t = 0 a=0,t=0 a=0,t=0可得:
n = − k T 2 4 n=\frac{-kT^2}{4} n=4−kT2​
所以 加速度公式 为:
a ( t ) = k t 2 − k T t a(t)=kt^2-kTt a(t)=kt2−kTt
对时间一次积分获得速度:
v ( t ) = 1 3 k t 3 − 1 2 k T t 2 + C 1 v(t)=\frac{1}{3}kt^3-\frac{1}{2}kTt^2+C_1 v(t)=31​kt3−21​kTt2+C1​
二次积分获得位移:
s ( t ) = 1 12 k t 4 − 1 6 k T t 3 + C 1 t + C 2 s(t)=\frac{1}{12}kt^4-\frac{1}{6}kTt^3+C_1t+C_2 s(t)=121​kt4−61​kTt3+C1​t+C2​
将三个常量带入速度表达式,可得:
{ V 0 = C 1 V 1 = 1 3 k T 3 − 1 2 k T ∗ T 2 + C 1 \left\{ \begin{array}{ll} V_0=C_1 \\ V_1=\frac{1}{3}kT^3-\frac{1}{2}kT*T^2+C_1 \end{array} \right. {V0​=C1​V1​=31​kT3−21​kT∗T2+C1​​
解之可得系数 k k k:
k = 6 ( V 0 − V 1 ) T 3 k=\frac{6(V_0-V_1)}{T^3} k=T36(V0​−V1​)​
以及 速度公式
v ( t ) = 1 3 k t 3 − 1 2 k T t 2 + V 0 v(t)=\frac{1}{3}kt^3-\frac{1}{2}kTt^2+V_0 v(t)=31​kt3−21​kTt2+V0​
又因为时间为0时位移为0,所以可以获得 位移公式
s ( t ) = 1 12 k t 4 − 1 6 k T t 3 + V 0 t s(t)=\frac{1}{12}kt^4-\frac{1}{6}kTt^3+V_0t s(t)=121​kt4−61​kTt3+V0​t

2.3 单位分析

因为使用场景是单片机控制步进电机,所以常规的速度单位 m / s m/s m/s用在这里不太合适。

在没有细分的情况下,单片机每发1个脉冲,电机前进1步,对于步距角1.8°的步进电机来说,就是旋转 1 200 \frac{1}{200} 2001​圈。所以速度单位选择"个每秒",也就是Hz。

加速过程秒级显然是我们不可接受的,微秒级的话步进电机也受不了,所以加速的时间单位选择ms。

综上:
加速度 a a a的单位为(Hz/ms)
速度v的单位为(Hz)
位移s的单位为(1000个)

显然位移单位不合常理,我们将位移单位化为(个),可得 位移公式2
s ( t ) = 1 12000 k t 4 − 1 6000 k T t 3 + 1 1000 V 0 t s(t)=\frac{1}{12000}kt^4-\frac{1}{6000}kTt^3+\frac{1}{1000}V_0t s(t)=120001​kt4−60001​kTt3+10001​V0​t

2.4 模拟验证

假设,起始速度60rpm,目标速度4500rpm,800脉冲转一圈,加速时间50ms,换算可得:
V 0 = 800 H z V 1 = 60000 H z T = 50 m s V_0=800 Hz\\ V_1=60000Hz\\ T=50ms V0​=800HzV1​=60000HzT=50ms
通过Excel仿真计算可得曲线:

3 两种代码实现

通过速度与时间关系以及速度与位移关系,给出在stm32的两种实现方法,代码在我的Gitee。

3.1 速度与时间关系

3.1.1 原理

对于给定的时间T,将0到T之间的每一ms带入到速度公式,计算出加速度表。使用两个定时器,一个提供1ms定时,另一个提供PWM输出,开更新中断,在1ms中断中修改PWM的频率实现速度曲线,在更新中断中记录脉冲次数。

3.1.2 优点

1.计算速度相对快很多,且不受细分以及速度差影响,实测计算不到2ms。
2.占用内存少,速度表仅需要开T个浮点数。

3.1.3 缺点

绝大部分情况下,达到目标速度时脉宽小于1ms,导致并不能准点进入减速,所以实际上的减速曲线是如下两种情况:

要么不能完成完整的减速流程,要么多余几十个脉冲以 V 0 V_0 V0​走完。

3.2 速度与位移关系

3.2.1 原理

将给定的时间T,带入距离公式,得到总加速脉冲数量 S 0 S_0 S0​,将0到 S 0 S_0 S0​之间所有整数带入位移公式,解一元四次方程,对于每一个s,取唯一一个 V 0 V_0 V0​到 V 1 V_1 V1​之间的实根,即每一个脉冲对应的速度,获得速度表。在PWM更新中断中修改下一次脉冲的速度,同时记录脉冲次数。

3.2.2 优点

1.加减速流程能够完整完成。
2.仅使用一个定时器。

3.2.3 缺点

计算非常非常耗时间,在stm32f207实测记录如下:
1.使用double类型计算60转加速到4500转,细分x4,时间50ms,用时800ms。
2.将解方程用的double也全都换成float,用时670ms。
3.继续把所有sqrt换成百度的高效sqrt。用时620ms。
4.改成两个脉冲改变一次频率。计算用时320ms。
5.改成5个脉冲改一次。计算用时124ms。
6.将计算速度时的三次方和平方调用pow处理,发现速度还更慢了。计算用时165ms。
7.回到步骤3,将目标速度改为300.计算用时50ms。
8.细分再改成x1。计算用时14ms。
可见计算速度受速度差以及细分影响很大。

另外速度越快,细分越高,所需要的内存越多。

一种解决方式:如果每次的起始速度和目标速度都一样,仅前进距离不同,那么就可以在程序开始时直接算出这个表,后续电机动作不必要再次计算,直接读表即可。

4 测试验证

测试未发现问题,第一种方法问题也不大。

5 参考文献

1.摆线/三次多项式过渡的匀加速度轨迹
2.速度规划(梯形、余弦、多项式、7段S型、7段修正S型、15段S型、31段S型)(文章已被原作者删除)
3.步进电机S型曲线加减速算法与实现
4.动态加速度信号的时频域积分方法
5.《电机应用开发实战指南—基于STM32》----野火

【C语言】STM32控制步进电机——一种S形加减速曲线的推导与实现相关推荐

  1. 51单片机+L298N控制步进电机【T型】加减速

    本文介绍另一种常见的步进电机[T型]加减速方法 关于L298N模块的使用介绍.以及S型加减速可以上一篇文章,传送门如下: 51单片机+L298N控制步进电机S曲线加减速 1. 与S曲线加减速对比 1. ...

  2. 步进电机c语言源代码 stm32,STM32控制步进电机源代码

    单片机源程序如下: #include "stm32f10x.h" #include "stm32f10x_rcc.h" #include "misc. ...

  3. 利用stm32控制步进电机 速度加速度控制

    因为想申请 CSDN 博客认证需要一定的粉丝量,而我写了五年博客才 700 多粉丝,本文开启关注才可阅读全文,很抱歉影响您的阅读体验 利用stm32控制步进电机 尝试用42系步进电机做倒立摆,总结步进 ...

  4. STM32控制步进电机:基于定时器中断的ULN2003驱动器/步进电机驱动程序

    STM32控制步进电机:基于定时器中断的ULN2003驱动器/步进电机驱动程序 一.ULN2003驱动器 1.工作原理 2.步距角以及一圈所需步数的计算 二.硬件连接 三.STM32F103定时器中断 ...

  5. STM32控制步进电机:工作原理及库函数(标准库) / HAL库控制程序(不定期更新)

    STM32控制步进电机:工作原理并附带库函数/HAL库程序 一.步进电机的基本工作原理 1.步进电机工作原理 2.混合式步进电机工作原理 二.步进电机参数解析(后续学习会继续补充此处内容

  6. STM32控制步进电机:基于HAL库定时器中断的闭环步进电机驱动+精准控制脉冲数

    STM32控制步进电机:基于HAL库定时器中断的闭环步进电机驱动+精准控制脉冲数 一.步进电机闭环驱动器 二.CubeMx配置 1.Clock Configuration 2.脉冲端 定时器配置 3. ...

  7. 【电机应用控制】——步进电机控制原理(四相五线/两相四线/细分驱动)驱动器梯形/S形加减速算法直线/圆弧插补

    目录 一.步进电机简介 二.步进电机控制原理 1.四相五线 2.两相四线 3.细分驱动 三.步进电机驱动器 四.梯形加减速算法 五.S形加减速算法 六.直线插补 七.圆弧插补 八.步进电机闭环系统(位 ...

  8. STM32:F407步进电机S形加减速算法的实现

    本文主要实现S形加减速算法. 更新(22-06-18) 正点原子官6月17日新上线了<电机控制专题例程>,可以免费下载和观看,正点原子STM32点击应用控制系列教程. 我已经详细地看了一遍 ...

  9. matlab生成s加减速曲线,一种基于移动平均算法的S曲线加减速控制方法与流程

    本发明属于运动控制领域,具体涉及一种基于移动平均算法的S曲线加减速控制方法. 背景技术: 加减速技术是数控系统的关键技术之一,算法的优劣直接决定着加工效率和加工精度.一种优秀的加减速算法既可以保证机床 ...

最新文章

  1. 不说12306你会Die啊?当然不会,但会憋死
  2. python做啥用-你都用 Python 来做什么?
  3. 如何用ASP.NET加密Cookie数据过程分析
  4. 怎么解决线上CPU100%的问题
  5. Elastic Search 上市了,Slack上市了,我也要写个软件,走上人生巅峰
  6. 洛谷精选 - 字符串合集
  7. Elasticsearch 节点发现
  8. 《JavaScript高级程序设计》阅读笔记(五):ECMAScript中的运算符(一)
  9. 学python后做什么工作好_学习完Python课程后可以做什么工作?
  10. C语言库函数大全及应用实例四
  11. php记一笔在线记账管理系统源码
  12. 要显示的8个字符已存放在以BUF开始的存储区单元中(称为显示缓冲区),依次送到LED显示器中显示。CPU通过P0口和P2口控制8位LED显示器,LED为共阴极显示器。
  13. AndroidStudio实用快捷键组合
  14. io流不关闭会怎么样_关闭IO流,你确定不试试trywithresources?
  15. php使用redis实例,php中使用redis队列操作实例代码
  16. AI语音红外遥控配网教程
  17. vue valley_12个无剧透的Stardew Valley秘诀和技巧,助您入门
  18. 云服务器显示异地登录,云服务器异地登录异常
  19. Android Studio 安装AVD (处理器为AMD)图文详解
  20. LiveNVR监控摄像头Onvif/RTSP视频流媒体服务平台概览负载信息实时展示取流中、播放中、录像中等使用数目说明

热门文章

  1. 百度推广的投放策略有哪些?
  2. Java-Day12 面向对象的三大特征之封装、继承,单例模式(饿汉式、懒汉式)、方法重写 (覆盖)、注解 (annotation)、super关键字、对象的创建流程超详细
  3. Babylongjs-光源,阴影
  4. Flutter Name source files using lowercase_with_underscores.dart
  5. 【Linux】什么是粘滞位
  6. 《从日薪五元到亿万身家》成杰“逆袭”励志畅销有声书即将上线啦
  7. js - - - - - 可选链操作符报错?可选链操作符 lodash
  8. 手机MTP模式连接电脑后文件夹显示不全 小米5s
  9. 论证:iOS安全性,为什么需要审核?
  10. Matlab路径文件pathdef.m可能为只读文件修改方法