wangpengcheng 发表于 2014-8-31 22:53:34

原创:很早以前在RTT上做的S型电机加减速表计算,欢迎拍砖

本帖最后由 wangpengcheng 于 2014-9-1 13:04 编辑

为了配合理解,我做了一个EXCEL的数学模型传上来:

EXCEL文件:

注释已经很详细了,呵呵,我就不多说了!在RTT平台上实现的,虽然跟飞思卡尔没关系,但是看到有很多做电机驱动的,就发出来给大家!
做这段代码的时候用到高中物理中的知识,发点感慨,人不知道什么时候学的东西就能用的上,呵呵!

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


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

#endif


#include "Speed.h"
//函数名称: CalculateSpeedTab
//函数功能:计算加减速表
//参数参数:Speed 速度结构体
//             V0;                //初速度,单位:step/s
//             Vt;                //末速度,单位:step/s
//             S;               //路程,单位:step
//             t;               //加速时间,单位:s
//             time;            //加速次数    单位:次
//             *SpeedTab;         //加速速度表,速度单位:step/s
//             SecSpeedPoint;   //减速点 单位:step
//返回输出:速度结构体
static Speed_t CalculateSpeedTab(Speed_t Speed)
{
    int i;                        
    double aa;                  //加加速
    int DeltaV;                   //速度变化量
    int tempVt;
    //如果速度记录表的指针为空,说明没有分配内存
    RT_ASSERT(Speed->SpeedTab != RT_NULL);
    //各参数是否超范围
    RT_ASSERT(IS_SPEED(Speed->V0, Speed->Vt));
    RT_ASSERT(IS_SPACE(Speed->S));
    RT_ASSERT(IS_ADDTIMING(Speed->t));
    RT_ASSERT(IS_ADDTIME(Speed->time));
    //根据加速法则计算末速度
    tempVt = LASTVELOCITY(Speed->S / SPEEDPRINCIPLE, Speed->V0, Speed->t);
    Speed->Vt = (tempVt > Speed->Vt) ? Speed->Vt : tempVt;                                                   
    Speed->SecSpeedPoint = ACCELERATESPACE(Speed->V0, Speed->Vt, Speed->t);      //计算减速点位置,剩余路程为该值时开始减速
    aa = (double)((Speed->Vt - Speed->V0) / 2)      //加速度变化拐点时的速度值                           a|   /|\            
      * 2                                       //知道直角三角形面积,逆推三角型高度时将面积*2      |/ | \面积为DeltaV
      / (Speed->time / 2)                         //除以底边                                          | /|\            
      / (Speed->time / 2);                        //再除以底边,得到斜率,即加加速                      |/___|___\__time   
    //开始速度计算
    for(i = 0; i < ((Speed->time / 2) + 1); i++)
    {
      DeltaV = (aa * i * i) / 2;                                     //V = V0 + a * t / 2;a = aa * t;
      *(Speed->SpeedTab + i) = Speed->V0 + DeltaV;                   //当前点的速度
      *(Speed->SpeedTab + Speed->time - i) = Speed->Vt - DeltaV;   //对称点的速度
    }
    return Speed;
}
//函数名称:TestSpeed
//函数功能:测试速度表计算函数
//函数参数:V0      初速度,单位:转/min
//          Vt      末速度,单位:转/min
//          S       路程,单位:mm
//          time    加速次数
//函数返回:无
void TestSpeed(int V0, int Vt, int S, int time)
{
    int i;
    Speed_t Speed = (Speed_t)rt_malloc(sizeof(struct SPEED));
    Speed->V0 = STEPSPEED(V0);    //起速
    Speed->Vt = STEPSPEED(Vt);    //末速
    Speed->S = TOTALSTEP(S);      //路程
    Speed->t = 0.2;               //加速时间设为0.2秒
    Speed->time = time;         //加速次数
    Speed->SpeedTab = (int *)rt_malloc(sizeof(int) * (Speed->time + 1)); //根据加速次数申请表格内存,加1,以防用的时候超界
    CalculateSpeedTab(Speed);       //开始计算
    for(i = 0; i < Speed->time; i++)
    {
      rt_kprintf("SpeedTab[%d] = %d, Acceleration = %d\n"
                  , i
                  , *(Speed->SpeedTab + i)
                  , *(Speed->SpeedTab + i + 1) - *(Speed->SpeedTab + i));
    }
    rt_kprintf("SpeedTab[%d] = %d\n", i, *(Speed->SpeedTab + i));
    rt_free(Speed->SpeedTab);            
    rt_free(Speed);                  
}

FINSH_FUNCTION_EXPORT(TestSpeed, Test Speed table calculate);

cn_x 发表于 2014-8-31 23:10:38

好东西啊,先顶一下,明天细看

a105 发表于 2014-8-31 23:12:03

收藏         

wangpengcheng 发表于 2014-8-31 23:12:50

cn_x 发表于 2014-8-31 23:10
好东西啊,先顶一下,明天细看

以前因为公司限制了网络,只能上CSDN,所以在CSDN上建了个博,然后都放那上面,这是刚才才发现的,现在转过来{:titter:}

wangpengcheng 发表于 2014-8-31 23:13:32

a105 发表于 2014-8-31 23:12
收藏

谢谢支持哦!

sunnyqd 发表于 2014-8-31 23:14:30

楼主做了好多东西呢,很给力

a105 发表于 2014-8-31 23:16:07

wangpengcheng 发表于 2014-8-31 23:13
谢谢支持哦!

好东西我们都会支持的

wangpengcheng 发表于 2014-8-31 23:19:00

sunnyqd 发表于 2014-8-31 23:14
楼主做了好多东西呢,很给力

飞币上不去,呵呵,现在都开始翻老本了!

laotui 发表于 2014-8-31 23:20:39

好东西,收藏学习了。

aozima 发表于 2014-9-1 00:11:26

wangpengcheng 发表于 2014-8-31 23:12
以前因为公司限制了网络,只能上CSDN,所以在CSDN上建了个博,然后都放那上面,这是刚才才发现的,现在转 ...

据了解有几个公司把www.rt-thread.org 列入了白名单

wangpengcheng 发表于 2014-9-1 00:17:34

aozima 发表于 2014-9-1 00:11
据了解有几个公司把www.rt-thread.org 列入了白名单

rtt还是蛮不错的一个os,我挺喜欢用的

WEIZ666 发表于 2014-9-1 00:22:39

太晚了每天看   {:handshake:}                     

qwert1213131 发表于 2014-9-1 00:54:59

等明天有空了看,先收藏

xukaiming 发表于 2014-9-1 00:58:00

好东西得顶

fengyunyu 发表于 2014-9-1 06:23:51

这个适用于什么类型的电机?

kinsno 发表于 2014-9-1 08:24:36

aozima 发表于 2014-9-1 00:11
据了解有几个公司把www.rt-thread.org 列入了白名单

啥叫白名单? 就是指定要使用?

kinsno 发表于 2014-9-1 08:28:10

wangpengcheng 发表于 2014-8-31 23:13
谢谢支持哦!

楼主博客在哪?话说, 有使用例程和电机类型(步进电机吗?)

浪里白条 发表于 2014-9-1 09:10:11

哈,这个给力!赶紧给加精吧。

aozima 发表于 2014-9-1 09:16:06

kinsno 发表于 2014-9-1 08:24
啥叫白名单? 就是指定要使用?

大部分外网不能访问,只能访问白名单里面的内容。
一般要上外网查资料的话,有小网吧。

sunnyqd 发表于 2014-9-1 09:26:52

wangpengcheng 发表于 2014-8-31 23:19
飞币上不去,呵呵,现在都开始翻老本了!

是呢,莫大会不会来下一波精华

wangpengcheng 发表于 2014-9-1 09:40:54

fengyunyu 发表于 2014-9-1 06:23
这个适用于什么类型的电机?

适用于带驱动器的,用脉冲跟方向驱动的电机!

wangpengcheng 发表于 2014-9-1 09:41:47

kinsno 发表于 2014-9-1 08:28
楼主博客在哪?话说, 有使用例程和电机类型(步进电机吗?)

没有,呵呵!当时用的电机是步进电机,用驱动芯片进行驱动!

wangpengcheng 发表于 2014-9-1 09:47:57

sunnyqd 发表于 2014-9-1 09:26
是呢,莫大会不会来下一波精华

肯定会有吧,呵呵!

zhangchaoying 发表于 2014-9-1 10:42:16

wangpengcheng 发表于 2014-9-1 09:40
适用于带驱动器的,用脉冲跟方向驱动的电机!

          看了很久,果然不错。

         没看懂

javabean 发表于 2014-9-1 11:00:26

zhangchaoying 发表于 2014-9-1 10:42
看了很久,果然不错。

         没看懂

再看看,总共才130行,还有好多注释呢

可是,我也没看懂……

wangpengcheng 发表于 2014-9-1 13:07:55

zhangchaoying 发表于 2014-9-1 10:42
看了很久,果然不错。

         没看懂

呵呵,我用EXCEL表做了个模型,应该差不多了!

wangpengcheng 发表于 2014-9-1 13:08:42

javabean 发表于 2014-9-1 11:00
再看看,总共才130行,还有好多注释呢

可是,我也没看懂……

其实就是加速度跟加加速在算当前点的速度!高中物理有学过,现在再看看{:titter:}

ludikn 发表于 2014-9-1 13:25:19

好东西,果断收藏!

霸气侧漏 发表于 2014-9-1 15:14:32

加减速很不错的东西

霸气侧漏 发表于 2014-9-1 15:19:27

发现你真是土豪啊 7896飞币 我的乖乖

loyal248 发表于 2014-9-1 15:24:22

谢谢分享!!!!!!!!!!!!!

wangpengcheng 发表于 2014-9-1 20:20:52

霸气侧漏 发表于 2014-9-1 15:19
发现你真是土豪啊 7896飞币 我的乖乖

看看那个白条的,比我多多了,呵呵!

wangpengcheng 发表于 2014-9-1 20:21:21

霸气侧漏 发表于 2014-9-1 15:19
发现你真是土豪啊 7896飞币 我的乖乖

你的币呢?不至这么点吧?换了什么?

bluestone2012 发表于 2014-9-1 20:25:50

谢谢楼主,收藏先

霸气侧漏 发表于 2014-9-1 20:29:40

wangpengcheng 发表于 2014-9-1 20:20
看看那个白条的,比我多多了,呵呵!

卧槽 一天就变成8千多   怎么做到的

wangpengcheng 发表于 2014-9-1 20:32:11

霸气侧漏 发表于 2014-9-1 20:29
卧槽 一天就变成8千多   怎么做到的

回复啊!咱是很有礼貌的人,总会回别人的话{:titter:}

霸气侧漏 发表于 2014-9-1 20:33:02

wangpengcheng 发表于 2014-9-1 20:32
回复啊!咱是很有礼貌的人,总会回别人的话

好吧我也是有礼貌的孩子

wangpengcheng 发表于 2014-9-1 20:49:16

霸气侧漏 发表于 2014-9-1 20:33
好吧我也是有礼貌的孩子

{:handshake:}

kinsno 发表于 2014-9-1 21:00:44

wangpengcheng 发表于 2014-9-1 20:49


我关心的是你这个公式咋推来的,能把公式原型附上吗?要不从程序倒推公式,好痛苦啊,没准还错了呢?
我原来的步进是用的建表法,也还不错;但感觉吧,不咋智能;现在发现新东西了,就得改进,是不是,而且现在ARM也越来越快了,不在乎那点计算速度的;

wangpengcheng 发表于 2014-9-1 21:07:24

kinsno 发表于 2014-9-1 21:00
我关心的是你这个公式咋推来的,能把公式原型附上吗?要不从程序倒推公式,好痛苦啊,没准还错了呢?
我 ...

看到那个EXCEL图了吗?蓝色的直线是梯形加减速的速度,根据这个做出来的。都是高中物理的知识,加加速导出当前点加速度 a = aa * t / 2;再用加速度计算当前点的速度:V = V0 + a * t / 2,在纸上画一下就知道了,呵呵,不外乎就是算面积!梯形跟三角形的面积

kinsno 发表于 2014-9-1 21:12:30

本帖最后由 kinsno 于 2014-9-1 21:14 编辑

wangpengcheng 发表于 2014-9-1 21:07
看到那个EXCEL图了吗?蓝色的直线是梯形加减速的速度,根据这个做出来的。都是高中物理的知识,加加速导 ...

为啥是算面积呢?表面看是高中物理(好象我把高中物理都忘了,加速度和速度完全忘了)?但实事上,我是指如何把这个公式或你说的面积和这个S加减速关系起来?其实是我寻求理论的出入和推导;
如果只是为了用,把你这个扛走,然后也不求来源去处,稀里糊涂的搞呗,对不对!那样不好;
PS:我去百度了一下加速度和速度的关系,貌似有进展,估计不需要楼主的公式了;确实应该高中物理知识,可惜早忘光光了;这个丢人啊;

wangpengcheng 发表于 2014-9-1 21:22:37

kinsno 发表于 2014-9-1 21:12
为啥是算面积呢?表面看是高中物理(好象我把高中物理都忘了,加速度和速度完全忘了)?但实事上,我是指 ...

我也不知道怎么回答你了,呵呵,公式我那个注释里面有两个,一个是用加加速算加速度,一个是用加速度算当前点速度,加加速事实上是加速度与时间成正比的一个关系,我做的这个S型是把加速度按时间等分了,然后每次都给加速度加上个加加速!

cn_x 发表于 2014-9-1 21:23:47

正要整步进电机,来研究一下

wangpengcheng 发表于 2014-9-1 21:25:42

cn_x 发表于 2014-9-1 21:23
正要整步进电机,来研究一下

分涨的很快啊!{:titter:}

cn_x 发表于 2014-9-1 21:27:58

wangpengcheng 发表于 2014-9-1 21:25
分涨的很快啊!

没有精华,一点点在爬

wangpengcheng 发表于 2014-9-1 21:30:59

cn_x 发表于 2014-9-1 21:27
没有精华,一点点在爬

做几个原创的上来,莫大肯定会给你精华的!{:lol:}

kinsno 发表于 2014-9-1 21:41:14

wangpengcheng 发表于 2014-9-1 21:22
我也不知道怎么回答你了,呵呵,公式我那个注释里面有两个,一个是用加加速算加速度,一个是用加速度算当 ...

哈哈,估计你没看到我后面写的PS,我已经搞明白了,确实是高中公式,需要回头捡一下加速度和加加速度,然后就容易理解了;

wangpengcheng 发表于 2014-9-1 21:44:19

kinsno 发表于 2014-9-1 21:41
哈哈,估计你没看到我后面写的PS,我已经搞明白了,确实是高中公式,需要回头捡一下加速度和加加速度,然 ...

理解了就好,呵呵,祝你顺利!

kinsno 发表于 2014-9-1 21:46:02

wangpengcheng 发表于 2014-9-1 21:44
理解了就好,呵呵,祝你顺利!

{:handshake:} {:handshake:} {:handshake:}

cn_x 发表于 2014-9-1 21:47:49

wangpengcheng 发表于 2014-9-1 21:30
做几个原创的上来,莫大肯定会给你精华的!

原创也没见加啊,就像你这个帖子
无所谓了
本来300块的板子已经满足的
弄个飞币3倍+精华把目标推到了6000
转眼6000也达到了,再奔12000? 好累········
边学习边发贴吧,不刻意去折腾了,偶尔回复一些,赚点飞币吧

wangpengcheng 发表于 2014-9-1 21:49:25

cn_x 发表于 2014-9-1 21:47
原创也没见加啊,就像你这个帖子
无所谓了
本来300块的板子已经满足的


审帖也要时间啊,我有几个帖子就是好久之后才加上的!

cn_x 发表于 2014-9-1 21:53:50

wangpengcheng 发表于 2014-9-1 21:49
审帖也要时间啊,我有几个帖子就是好久之后才加上的!

慢慢来吧,对塔式开发板满是没啥感觉
不过感觉版主们没在管理这个社区,只是在埋头回答问题和做研究
阿莫一个人在审样的

wangpengcheng 发表于 2014-9-1 21:56:43

cn_x 发表于 2014-9-1 21:53
慢慢来吧,对塔式开发板满是没啥感觉
不过感觉版主们没在管理这个社区,只是在埋头回答问题和做研究
阿莫 ...

呵呵,其实塔式板我也玩过,跑过例程,感觉还可以,一开始学MQX的时候就是在塔式板上跑的,上面资源不是很多,但可以扩展,好像有USB、串口、CAN、网络等等。优点是做实验的时候可以自己画个扩展板,直接插上就可以用!

至于版主的问题,估计分工不同吧!

浪里白条 发表于 2014-9-1 22:36:55

对电机控制不懂,感谢楼主分享

lisingch 发表于 2014-9-1 23:14:03

收藏了,谢谢!

wangpengcheng 发表于 2014-9-2 00:15:28

lisingch 发表于 2014-9-1 23:14
收藏了,谢谢!

不客气         

rootxie 发表于 2014-9-2 08:06:46

楼主这是要屠版的节奏啊,感谢分享

soos 发表于 2014-9-2 09:11:37

楼主有没有梯形加减速的资料?如梯形加减速的EXCEL表.

soos 发表于 2014-9-2 09:15:33

原来表中有包含梯形的了

wangpengcheng 发表于 2014-9-2 12:27:41

soos 发表于 2014-9-2 09:15
原来表中有包含梯形的了

{:handshake:}

wanstrive 发表于 2014-9-2 12:52:18

做的是伺服?还是步进电机?

wangpengcheng 发表于 2014-9-2 12:55:02

wanstrive 发表于 2014-9-2 12:52
做的是伺服?还是步进电机?

算出来的是加速点速度表,可以应用到伺服或者步进!

our2008 发表于 2014-9-2 13:19:40

不错!先收着

gginhouse 发表于 2014-9-2 20:44:38

L2=((D3-B3)/2)*2/(I3/2)/(I3/2),为什么要先除2再乘2?

wangpengcheng 发表于 2014-9-2 20:46:48

gginhouse 发表于 2014-9-2 20:44
L2=((D3-B3)/2)*2/(I3/2)/(I3/2),为什么要先除2再乘2?

为了将来自己好理解,每步都写清楚!

ztrx 发表于 2015-9-22 09:24:54

请问函数怎么调用

阿豪博士 发表于 2015-10-19 16:10:07

同求函数如何调用!楼主能不能解答一下!谢谢!

Excellence 发表于 2015-10-22 13:22:13

mark一下。。。

jxyctwt 发表于 2015-10-25 18:35:39

好东东,马克

FireHe 发表于 2015-10-26 17:54:13

这个非常好的资料啊。感谢楼主分享

litiang 发表于 2015-11-6 10:14:41

再用加速度计算当前点的速度:V = V0 + a * t / 2, 这个公式是不是错了 我记得是 V=V0+at

yaonen 发表于 2017-6-4 19:11:11


不错!先收着

a515509429 发表于 2017-7-20 09:43:33

标记下 收藏

advarx21ic 发表于 2017-8-13 22:24:53

明天上班研究一下,应该能学到东西,谢谢

122402902 发表于 2017-8-14 11:43:18

mark 学些一下了

qq302011 发表于 2018-8-3 15:39:48

最近在想,使用查表方式实现的S加减速就只能控制速度,不能控制位置,能否实现一个查表,可以同个脉冲的位置查找当前的速度?
比方说提供一个函数 给定 开始速度 ,结束速度,总步数, 当前步数, 即可查找到 当前步数对应的速度?
抛砖引玉,请问各位如何做一个根据当前步数实时计算S加减速的速度的方法?
我做了一个S曲线的的表格,表格是根据当前步数查找当前的速度,使用一下函数可实现该功能,但是该表格只能应用于升速中:初速度为0 的情况或者降速中:末尾速度为0的情况。

const uint16_t sigmoid_speed = { 1,384,765,1145,1522,1897,2269,2640,3008,3375,3739,4101,4461,4818,5174,5528,5879,6228,6576,6921,7265,7606,7945,8283,8618,8952,9283,9613,9940,10266,10590,10912,11232,11550,11866,12181,12494,12804,13113,13421,13726,14030,14331,14632,14930,15226,15521,15814,16106,16396,16684,16970,17255,17538,17819,18099,18377,18653,18928,19201,19473,19743,20011,20278,20544,20807,21070,21330,21589,21847,22103,22358,22611,22863,23113,23362,23609,23855,24100,24343,24584,24824,25063,25300,25536,25771,26004,26236,26467,26696,26924,27150,27375,27599,27822,28043,28263,28482,28699,28915,29130,29344,29556,29767,29977,30186,30393,30600,30805,31008,31211,31413,31613,31812,32010,32207,32402,32597,32790,32983,33174,33364,33553,33740,33927,34113,34297,34481,34663,34844,35024,35204,35382,35559,35735,35910,36084,36257,36429,36600,36770,36939,37107,37274,37440,37605,37769,37932,38094,38256,38416,38575,38734,38891,39048,39204,39358,39512,39665,39817,39968,40119,40268,40417,40564,40711,40857,41002,41147,41290,41433,41574,41715,41855,41995,42133,42271,42408,42544,42679,42813,42947,43080,43212,43343,43474,43604,43733,43861,43989,44116,44242,44367,44492,44615,44739,44861,44983,45104,45224,45344,45463,45581,45698,45815,45931,46047,46161,46276,46389,46502,46614,46725,46836,46946,47056,47165,47273,47381,47488,47594,47700,47805,47910,48013,48117,48219,48322,48423,48524,48624,48724,48823,48922,49020,49117,49214,49310,49406,49501,49596,49690,49783,49876,49969,50061,50152,50243,50333,50423,50512,50601,50689,50777,50864,50950,51036,51122,51207,51292,51376,51460,51543,51626,51708,51789,51871,51951,52032,52112,52191,52270,52348,52426,52504,52581,52657,52734,52809,52885,52959,53034,53108,53181,53254,53327,53399,53471,53543,53614,53684,53754,53824,53894,53962,54031,54099,54167,54234,54301,54368,54434,54500,54565,54630,54695,54759,54823,54886,54950,55012,55075,55137,55199,55260,55321,55381,55442,55502,55561,55620,55679,55738,55796,55854,55911,55968,56025,56082,56138,56194,56249,56304,56359,56414,56468,56522,56576,56629,56682,56734,56787,56839,56891,56942,56993,57044,57095,57145,57195,57244,57294,57343,57392,57440,57488,57536,57584,57631,57678,57725,57772,57818,57864,57910,57955,58001,58046,58090,58135,58179,58223,58266,58310,58353,58396,58438,58481,58523,58565,58607,58648,58689,58730,58771,58811,58851,58891,58931,58971,59010,59049,59088,59126,59165,59203,59241,59279,59316,59353,59390,59427,59464,59500,59536,59572,59608,59644,59679,59714,59749,59784,59819,59853,59887,59921,59955,59988,60022,60055,60088,60120,60153,60185,60218,60250,60281,60313,60344,60376,60407,60438,60468,60499,60529,60559,60589,60619,60649,60678,60708,60737,60766,60795,60823,60852,60880,60908,60936,60964,60992,61019,61046,61073,61100,61127,61154,61181,61207,61233,61259,61285,61311,61336,61362,61387,61412,61437,61462,61487,61512,61536,61560,61585,61609,61632,61656,61680,61703,61727,61750,61773,61796,61818,61841,61864,61886,61908,61930,61952,61974,61996,62018,62039,62060,62082,62103,62124,62145,62165,62186,62206,62227,62247,62267,62287,62307,62327,62347,62366,62386,62405,62424,62443,62462,62481,62500,62519,62537,62556,62574,62592,62610,62628,62646,62664,62682,62699,62717,62734,62752,62769,62786,62803,62820,62837,62853,62870,62886,62903,62919,62935,62951,62968,62983,62999,63015,63031,63046,63062,63077,63092,63108,63123,63138,63153,63168,63182,63197,63212,63226,63241,63255,63269,63283,63297,63311,63325,63339,63353,63367,63380,63394,63407,63421,63434,63447,63460,63473,63486,63499,63512,63525,63537,63550,63563,63575,63587,63600,63612,63624,63636,63648,63660,63672,63684,63696,63707,63719,63730,63742,63753,63765,63776,63787,63798,63809,63820,63831,63842,63853,63864,63875,63885,63896,63906,63917,63927,63937,63948,63958,63968,63978,63988,63998,64008,64018,64028,64037,64047,64057,64066,64076,64085,64095,64104,64113,64123,64132,64141,64150,64159,64168,64177,64186,64195,64203,64212,64221,64229,64238,64246,64255,64263,64272,64280,64288,64296,64305,64313,64321,64329,64337,64345,64353,64361,64368,64376,64384,64391,64399,64407,64414,64422,64429,64436,64444,64451,64458,64466,64473,64480,64487,64494,64501,64508,64515,64522,64529,64536,64542,64549,64556,64562,64569,64576,64582,64589,64595,64602,64608,64614,64621,64627,64633,64639,64646,64652,64658,64664,64670,64676,64682,64688,64694,64699,64705,64711,64717,64722,64728,64734,64739,64745,64751,64756,64762,64767,64772,64778,64783,64789,64794,64799,64804,64810,64815,64820,64825,64830,64835,64840,64845,64850,64855,64860,64865,64870,64874,64879,64884,64889,64893,64898,64903,64907,64912,64917,64921,64926,64930,64935,64939,64943,64948,64952,64957,64961,64965,64969,64974,64978,64982,64986,64990,64995,64999,65003,65007,65011,65015,65019,65023,65027,65031,65034,65038,65042,65046,65050,65053,65057,65061,65065,65068,65072,65076,65079,65083,65086,65090,65094,65097,65101,65104,65107,65111,65114,65118,65121,65124,65128,65131,65134,65138,65141,65144,65147,65151,65154,65157,65160,65163,65166,65169,65172,65175,65179,65182,65185,65187,65190,65193,65196,65199,65202,65205,65208,65211,65214,65216,65219,65222,65225,65227,65230,65233,65236,65238,65241,65244,65246,65249,65251,65254,65257,65259,65262,65264,65267,65269,65272,65274,65277,65279,65282,65284,65286,65289,65291,65294,65296,65298,65301,65303,65305,65307,65310,65312,65314,65316,65319,65321,65323,65325,65327,65329,65332,65334,65336,65338,65340,65342,65344,65346,65348,65350,65352,65354,65356,65358,65360,65362,65364,65366,65368,65370,65372,65374,65376,65377,65379,65381,65383,65385,65387,65388,65390,65392,65394,65395,65397,65399,65401,65402,65404,65406,65408,65409,65411,65413,65414,65416,65417,65419,65421,65422,65424,65425,65427,65429,65430,65432,65433,65435,65436,65438,65439,65441,65442,65444,65445,65447,65448,65450,65451,65452,65454,65455,65457,65458,65459,65461,65462,65464,65465,65466,65468,65469,65470,65472,65473,65474,65475,65477,65478,65479,65481,65482,65483,65484,65485,65487,65488,65489,65490,65492,65493,65494,65495,65496,65497,65499,65500,65501,65502,65503,65504,65505,65506,65508,65509,65510,65511,65512,65513,65514,65515,65516,65517,65518,65519,65520,65521,65522,65523,65524,65525,65526,65527,65528,65529,65530,65531,65532
};

static double lookup_step = 1024;
static int32_t total_counts = 1024;
static int32_t v_start = 0;
static int32_t v_end = 1;
static int32_t v_half = 0;
static int64_t v_delta = 0;
static int32_t step_half = 0;
void   sigmoid_init(uint32_t vs, uint32_t ve, uint32_t step_event_count)
{
        v_start = vs;
        v_end = ve;
        v_half = (v_start + v_end) / 2;
        lookup_step = 1024.0f / step_event_count;
        v_delta = (int64_t)(v_end - v_start);
        step_half = (step_event_count + 1) / 2;
        total_counts = step_event_count;
}

uint32_t sigmoid_get_speed_by_dstance(uint32_t steps)
{



        if (steps >= total_counts) return v_end;
        if (steps == 0) return v_start;
        int32_t speed, st;
        if(v_delta>0)
        {

                st = steps * 1024 / (total_counts );
                speed = (v_delta*sigmoid_speed) >> 16;
                speed += v_start;
                if (speed < 0) speed = 0;
        }
        else
        {
                st = steps * 1024 / (total_counts);
                speed = (v_delta*sigmoid_speed) >> 16;
                speed = v_end- speed;
                if (speed < 0) speed = 0;

        }
        return   speed;
}

wangpengcheng 发表于 2018-8-18 11:17:38

qq302011 发表于 2018-8-3 15:39
最近在想,使用查表方式实现的S加减速就只能控制速度,不能控制位置,能否实现一个查表,可以同个脉冲的位 ...

这是以前做的理想状态的情况,后来发现不是这样,一般加速表都根电机有关,正规的电机厂商会提供最适合的加速表!

lcmdw 发表于 2018-8-18 13:34:22

学习一下
页: [1]
查看完整版本: 原创:很早以前在RTT上做的S型电机加减速表计算,欢迎拍砖