找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 28343|回复: 70
打印 上一主题 下一主题
收起左侧

STM32步进电机S加减速程序源码与详细分析

  [复制链接]
跳转到指定楼层
楼主
基于STM32步进电机s型加减速控制


一个物体从起点运动到终点,要经历加速,匀速,减速的过程,把整个过程中速度随时间变化关系画出来,就是速度曲线.
S型加减速就是指速度曲线中加减速阶段的曲线呈现一个英文字母'S'型.
S型加减速相对于梯形加减速更加平稳,对电机和传动系统的冲击更小.
S型加减速的曲线并没有限定是什么曲线,所以可以是指数曲线,可以是正弦曲线.这里分析的S型加减速是基于加速度匀速变化的曲线.
S型加减速的优点就是启动和停止都很平滑,不会有很大的冲击,但缺点就是启动和停止的时间比较长.
具体的加减速的速度曲线看背景图….

右图就是S型加速曲线和对应的加速度曲线示意图
在加速过程中,前半部分由于加速度是匀速递增的,
这段曲线我们称为加加速段曲线(后面称它为IncAccel),后半部分是加速度匀速递减的,称为减加速段(DeAccel).
加加速段是加速度关于时间的斜率为正的直线,减
加速则是加速度关于时间的斜率为负的直线.
加速度从0开始变化,到了最大值开始减小,最后为0,
由于加速度的斜率是相同的,所以加加速度和减加速度
所用的时间是一样.这两段曲线是关于加速度最大值的对应的速度中心对称的.





单片机源程序如下:
  1. #include "Speed.h"
  2. //函数名称: CalculateSpeedTab
  3. //函数功能:计算加减速表
  4. //参数参数:Speed 速度结构体
  5. //             V0;                //初速度,单位:step/s
  6. //             Vt;                //末速度,单位:step/s
  7. //             S;                 //路程,单位:step
  8. //             t;                 //加速时间,单位:s
  9. //             time;              //加速次数    单位:次
  10. //             *SpeedTab;         //加速速度表,速度单位:step/s
  11. //             SecSpeedPoint;     //减速点 单位:step
  12. //返回输出:速度结构体
  13. static Speed_t CalculateSpeedTab(Speed_t Speed)
  14. {
  15.     int i;                        
  16.     double aa;                    //加加速
  17.     int DeltaV;                   //速度变化量
  18.     int tempVt;
  19.     //如果速度记录表的指针为空,说明没有分配内存
  20.     RT_ASSERT(Speed->SpeedTab != RT_NULL);
  21.     //各参数是否超范围
  22.     RT_ASSERT(IS_SPEED(Speed->V0, Speed->Vt));
  23.     RT_ASSERT(IS_SPACE(Speed->S));
  24.     RT_ASSERT(IS_ADDTIMING(Speed->t));
  25.     RT_ASSERT(IS_ADDTIME(Speed->time));
  26.     //根据加速法则计算末速度
  27.     tempVt = LASTVELOCITY(Speed->S / SPEEDPRINCIPLE, Speed->V0, Speed->t);
  28.     Speed->Vt = (tempVt > Speed->Vt) ? Speed->Vt : tempVt;                                                   
  29.     Speed->SecSpeedPoint = ACCELERATESPACE(Speed->V0, Speed->Vt, Speed->t);        //计算减速点位置,剩余路程为该值时开始减速
  30.     aa = (double)((Speed->Vt - Speed->V0) / 2)      //加速度变化拐点时的速度值                           a|   /|\            
  31.         * 2                                         //知道直角三角形面积,逆推三角型高度时将面积*2        |  / | \面积为DeltaV
  32.         / (Speed->time / 2)                         //除以底边                                            | /  |  \            
  33.         / (Speed->time / 2);                        //再除以底边,得到斜率,即加加速                      |/___|___\__time   
  34.     //开始速度计算
  35.     for(i = 0; i < ((Speed->time / 2) + 1); i++)
  36.     {
  37.         DeltaV = (aa * i * i) / 2;                                     //V = V0 + a * t / 2;  a = aa * t;
  38.         *(Speed->SpeedTab + i) = Speed->V0 + DeltaV;                   //当前点的速度
  39.         *(Speed->SpeedTab + Speed->time - i) = Speed->Vt - DeltaV;     //对称点的速度
  40.     }
  41.     return Speed;
  42. }
  43. //函数名称:TestSpeed
  44. //函数功能:测试速度表计算函数
  45. //函数参数:V0      初速度,单位:转/min
  46. //          Vt      末速度,单位:转/min
  47. //          S       路程,单位:mm
  48. //          time    加速次数
  49. //函数返回:无
  50. void TestSpeed(int V0, int Vt, int S, int time)
  51. {
  52.     int i;
  53.     Speed_t Speed = (Speed_t)rt_malloc(sizeof(struct SPEED));
  54.     Speed->V0 = STEPSPEED(V0);    //起速
  55.     Speed->Vt = STEPSPEED(Vt);    //末速
  56.     Speed->S = TOTALSTEP(S);      //路程
  57.     Speed->t = 0.2;               //加速时间设为0.2秒
  58.     Speed->time = time;           //加速次数
  59.     Speed->SpeedTab = (int *)rt_malloc(sizeof(int) * (Speed->time + 1)); //根据加速次数申请表格内存,加1,以防用的时候超界
  60.     CalculateSpeedTab(Speed);       //开始计算
  61.     for(i = 0; i < Speed->time; i++)
  62.     {
  63.         rt_kprintf("SpeedTab[%d] = %d, Acceleration = %d\n"
  64.                   , i
  65.                   , *(Speed->SpeedTab + i)
  66.                   , *(Speed->SpeedTab + i + 1) - *(Speed->SpeedTab + i));
  67.     }
  68.     rt_kprintf("SpeedTab[%d] = %d\n", i, *(Speed->SpeedTab + i));
  69.     rt_free(Speed->SpeedTab);              
  70.     rt_free(Speed);                    
  71. }

  72. FINSH_FUNCTION_EXPORT(TestSpeed, Test Speed table calculate);

复制代码

头文件:
  1. #ifndef __SPEED_H__
  2. #define __SPEED_H__
  3. #include "rtthread.h"
  4. #include "finsh.h"
  5. /*  三分之一加减速法则:
  6. 加速路程不超过三分之一总路程,
  7. 这样做的目的是给减速留有足够的时间去检测减速点,
  8. 进而实现平稳的将速度减到初速度,
  9. 如果在处理速度够快的情况下,
  10. 可以选择二分之一加减速
  11. */
  12. //加减速法则,2分之一法则或3分之一法则
  13. #define SPEEDPRINCIPLE              3
  14. //电机最大转速,单位转/min
  15. #define MOTOMAXSPEED                1500   
  16. //电机每转对应的传动距离,单位:mm
  17. #define MOTOROUNDLENGTH             36
  18. //电机最大初速度,初速度超过该值会对电机造成伤害,单位转/min
  19. #define MOTOMAXSTART                200
  20. //驱动器细分数
  21. #define DRIVERSFRACTION             1
  22. //电机细分数
  23. #define MOTOFRACTION                200
  24. //根据初速度,末速度,以及时间,计算加速路程
  25. #define ACCELERATESPACE(V0,Vt,t)    (((V0) + (Vt)) * (t) / 2)
  26. //根据加速路程,初速度,以及时间,计算末速度
  27. #define LASTVELOCITY(S,V0,t)        (2 * (S) / (t) - (V0))
  28. //根据电机转速(转/min),计算电机步速度(step/s)
  29. #define STEPSPEED(RV)               ((RV) * MOTOFRACTION * DRIVERSFRACTION / 60)
  30. //根据长度计算电机所需走的步数,S的单位为mm
  31. #define TOTALSTEP(S)                S * MOTOFRACTION * DRIVERSFRACTION / MOTOROUNDLENGTH
  32. struct SPEED
  33. {
  34.     int         V0;                 //初速度,单位:step/s
  35.     int         Vt;                 //末速度,单位:step/s
  36.     long long   S;                  //路程,单位:step
  37.     double      t;                  //加速时间,单位:s
  38.     int         time;               //加速次数    单位:次
  39.     int         *SpeedTab;          //加速速度表,速度单位:step/s
  40.     int         SecSpeedPoint;      //减速点 单位:step(在电机运动过程中,如果剩余路程小于等于该值,那么电机开始减速)
  41. };
  42. typedef struct SPEED * Speed_t;


  43. //各参数范围值,可以在此设置参数范围
  44. //初速度大于0小于电机最高起速,末速度大于初速度,小于电机最高转速
  45. #define IS_SPEED(V0,Vt)     (((V0) >= 0) && ((V0) <= STEPSPEED(MOTOMAXSTART))  \
  46.                             && ((Vt) >= (V0)) && ((Vt) <= STEPSPEED(MOTOMAXSPEED)))                           
  47. #define IS_SPACE(S)         ((S) > 0)
  48. #define IS_ADDTIMING(t)     ((t) > 0)            
  49. #define IS_ADDTIME(time)     ((time) >= 32)        //让加速次数必须大于等于32,否则计算表格就没什么意义

  50. #endif
复制代码


所有资料51hei提供下载:
S型加减速分析.rar (2.64 MB, 下载次数: 1132)



S型加减速.png (121.42 KB, 下载次数: 142)

S型加减速.png

S型加减速和梯形加减速.png (127.74 KB, 下载次数: 149)

S型加减速和梯形加减速.png

加速度曲线图.png (113.87 KB, 下载次数: 131)

加速度曲线图.png

实际计算得到的S型曲线图.png (112.19 KB, 下载次数: 125)

实际计算得到的S型曲线图.png

评分

参与人数 2黑币 +13 收起 理由
AnthonyYMH + 5 共享资料的黑币奖励!
supermcu8 + 8 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏33 分享淘帖 顶5 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表