原创:很早以前在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
好东西啊,先顶一下,明天细看
以前因为公司限制了网络,只能上CSDN,所以在CSDN上建了个博,然后都放那上面,这是刚才才发现的,现在转过来{:titter:} a105 发表于 2014-8-31 23:12
收藏
谢谢支持哦! 楼主做了好多东西呢,很给力 wangpengcheng 发表于 2014-8-31 23:13
谢谢支持哦!
好东西我们都会支持的 sunnyqd 发表于 2014-8-31 23:14
楼主做了好多东西呢,很给力
飞币上不去,呵呵,现在都开始翻老本了! 好东西,收藏学习了。 wangpengcheng 发表于 2014-8-31 23:12
以前因为公司限制了网络,只能上CSDN,所以在CSDN上建了个博,然后都放那上面,这是刚才才发现的,现在转 ...
据了解有几个公司把www.rt-thread.org 列入了白名单 aozima 发表于 2014-9-1 00:11
据了解有几个公司把www.rt-thread.org 列入了白名单
rtt还是蛮不错的一个os,我挺喜欢用的 太晚了每天看 {:handshake:} 等明天有空了看,先收藏 好东西得顶 这个适用于什么类型的电机? aozima 发表于 2014-9-1 00:11
据了解有几个公司把www.rt-thread.org 列入了白名单
啥叫白名单? 就是指定要使用? wangpengcheng 发表于 2014-8-31 23:13
谢谢支持哦!
楼主博客在哪?话说, 有使用例程和电机类型(步进电机吗?) 哈,这个给力!赶紧给加精吧。 kinsno 发表于 2014-9-1 08:24
啥叫白名单? 就是指定要使用?
大部分外网不能访问,只能访问白名单里面的内容。
一般要上外网查资料的话,有小网吧。 wangpengcheng 发表于 2014-8-31 23:19
飞币上不去,呵呵,现在都开始翻老本了!
是呢,莫大会不会来下一波精华 fengyunyu 发表于 2014-9-1 06:23
这个适用于什么类型的电机?
适用于带驱动器的,用脉冲跟方向驱动的电机! kinsno 发表于 2014-9-1 08:28
楼主博客在哪?话说, 有使用例程和电机类型(步进电机吗?)
没有,呵呵!当时用的电机是步进电机,用驱动芯片进行驱动! sunnyqd 发表于 2014-9-1 09:26
是呢,莫大会不会来下一波精华
肯定会有吧,呵呵! wangpengcheng 发表于 2014-9-1 09:40
适用于带驱动器的,用脉冲跟方向驱动的电机!
看了很久,果然不错。
没看懂
zhangchaoying 发表于 2014-9-1 10:42
看了很久,果然不错。
没看懂
再看看,总共才130行,还有好多注释呢
可是,我也没看懂…… zhangchaoying 发表于 2014-9-1 10:42
看了很久,果然不错。
没看懂
呵呵,我用EXCEL表做了个模型,应该差不多了! javabean 发表于 2014-9-1 11:00
再看看,总共才130行,还有好多注释呢
可是,我也没看懂……
其实就是加速度跟加加速在算当前点的速度!高中物理有学过,现在再看看{:titter:} 好东西,果断收藏! 加减速很不错的东西 发现你真是土豪啊 7896飞币 我的乖乖 谢谢分享!!!!!!!!!!!!! 霸气侧漏 发表于 2014-9-1 15:19
发现你真是土豪啊 7896飞币 我的乖乖
看看那个白条的,比我多多了,呵呵! 霸气侧漏 发表于 2014-9-1 15:19
发现你真是土豪啊 7896飞币 我的乖乖
你的币呢?不至这么点吧?换了什么? 谢谢楼主,收藏先 wangpengcheng 发表于 2014-9-1 20:20
看看那个白条的,比我多多了,呵呵!
卧槽 一天就变成8千多 怎么做到的 霸气侧漏 发表于 2014-9-1 20:29
卧槽 一天就变成8千多 怎么做到的
回复啊!咱是很有礼貌的人,总会回别人的话{:titter:} wangpengcheng 发表于 2014-9-1 20:32
回复啊!咱是很有礼貌的人,总会回别人的话
好吧我也是有礼貌的孩子 霸气侧漏 发表于 2014-9-1 20:33
好吧我也是有礼貌的孩子
{:handshake:} wangpengcheng 发表于 2014-9-1 20:49
我关心的是你这个公式咋推来的,能把公式原型附上吗?要不从程序倒推公式,好痛苦啊,没准还错了呢?
我原来的步进是用的建表法,也还不错;但感觉吧,不咋智能;现在发现新东西了,就得改进,是不是,而且现在ARM也越来越快了,不在乎那点计算速度的; kinsno 发表于 2014-9-1 21:00
我关心的是你这个公式咋推来的,能把公式原型附上吗?要不从程序倒推公式,好痛苦啊,没准还错了呢?
我 ...
看到那个EXCEL图了吗?蓝色的直线是梯形加减速的速度,根据这个做出来的。都是高中物理的知识,加加速导出当前点加速度 a = aa * t / 2;再用加速度计算当前点的速度:V = V0 + a * t / 2,在纸上画一下就知道了,呵呵,不外乎就是算面积!梯形跟三角形的面积 本帖最后由 kinsno 于 2014-9-1 21:14 编辑
wangpengcheng 发表于 2014-9-1 21:07
看到那个EXCEL图了吗?蓝色的直线是梯形加减速的速度,根据这个做出来的。都是高中物理的知识,加加速导 ...
为啥是算面积呢?表面看是高中物理(好象我把高中物理都忘了,加速度和速度完全忘了)?但实事上,我是指如何把这个公式或你说的面积和这个S加减速关系起来?其实是我寻求理论的出入和推导;
如果只是为了用,把你这个扛走,然后也不求来源去处,稀里糊涂的搞呗,对不对!那样不好;
PS:我去百度了一下加速度和速度的关系,貌似有进展,估计不需要楼主的公式了;确实应该高中物理知识,可惜早忘光光了;这个丢人啊; kinsno 发表于 2014-9-1 21:12
为啥是算面积呢?表面看是高中物理(好象我把高中物理都忘了,加速度和速度完全忘了)?但实事上,我是指 ...
我也不知道怎么回答你了,呵呵,公式我那个注释里面有两个,一个是用加加速算加速度,一个是用加速度算当前点速度,加加速事实上是加速度与时间成正比的一个关系,我做的这个S型是把加速度按时间等分了,然后每次都给加速度加上个加加速! 正要整步进电机,来研究一下 cn_x 发表于 2014-9-1 21:23
正要整步进电机,来研究一下
分涨的很快啊!{:titter:} wangpengcheng 发表于 2014-9-1 21:25
分涨的很快啊!
没有精华,一点点在爬 cn_x 发表于 2014-9-1 21:27
没有精华,一点点在爬
做几个原创的上来,莫大肯定会给你精华的!{:lol:} wangpengcheng 发表于 2014-9-1 21:22
我也不知道怎么回答你了,呵呵,公式我那个注释里面有两个,一个是用加加速算加速度,一个是用加速度算当 ...
哈哈,估计你没看到我后面写的PS,我已经搞明白了,确实是高中公式,需要回头捡一下加速度和加加速度,然后就容易理解了; kinsno 发表于 2014-9-1 21:41
哈哈,估计你没看到我后面写的PS,我已经搞明白了,确实是高中公式,需要回头捡一下加速度和加加速度,然 ...
理解了就好,呵呵,祝你顺利! wangpengcheng 发表于 2014-9-1 21:44
理解了就好,呵呵,祝你顺利!
{:handshake:} {:handshake:} {:handshake:} wangpengcheng 发表于 2014-9-1 21:30
做几个原创的上来,莫大肯定会给你精华的!
原创也没见加啊,就像你这个帖子
无所谓了
本来300块的板子已经满足的
弄个飞币3倍+精华把目标推到了6000
转眼6000也达到了,再奔12000? 好累········
边学习边发贴吧,不刻意去折腾了,偶尔回复一些,赚点飞币吧 cn_x 发表于 2014-9-1 21:47
原创也没见加啊,就像你这个帖子
无所谓了
本来300块的板子已经满足的
审帖也要时间啊,我有几个帖子就是好久之后才加上的! wangpengcheng 发表于 2014-9-1 21:49
审帖也要时间啊,我有几个帖子就是好久之后才加上的!
慢慢来吧,对塔式开发板满是没啥感觉
不过感觉版主们没在管理这个社区,只是在埋头回答问题和做研究
阿莫一个人在审样的 cn_x 发表于 2014-9-1 21:53
慢慢来吧,对塔式开发板满是没啥感觉
不过感觉版主们没在管理这个社区,只是在埋头回答问题和做研究
阿莫 ...
呵呵,其实塔式板我也玩过,跑过例程,感觉还可以,一开始学MQX的时候就是在塔式板上跑的,上面资源不是很多,但可以扩展,好像有USB、串口、CAN、网络等等。优点是做实验的时候可以自己画个扩展板,直接插上就可以用!
至于版主的问题,估计分工不同吧! 对电机控制不懂,感谢楼主分享 收藏了,谢谢! lisingch 发表于 2014-9-1 23:14
收藏了,谢谢!
不客气 楼主这是要屠版的节奏啊,感谢分享 楼主有没有梯形加减速的资料?如梯形加减速的EXCEL表. 原来表中有包含梯形的了 soos 发表于 2014-9-2 09:15
原来表中有包含梯形的了
{:handshake:} 做的是伺服?还是步进电机? wanstrive 发表于 2014-9-2 12:52
做的是伺服?还是步进电机?
算出来的是加速点速度表,可以应用到伺服或者步进! 不错!先收着 L2=((D3-B3)/2)*2/(I3/2)/(I3/2),为什么要先除2再乘2? gginhouse 发表于 2014-9-2 20:44
L2=((D3-B3)/2)*2/(I3/2)/(I3/2),为什么要先除2再乘2?
为了将来自己好理解,每步都写清楚! 请问函数怎么调用 同求函数如何调用!楼主能不能解答一下!谢谢! mark一下。。。 好东东,马克 这个非常好的资料啊。感谢楼主分享 再用加速度计算当前点的速度:V = V0 + a * t / 2, 这个公式是不是错了 我记得是 V=V0+at
不错!先收着 标记下 收藏 明天上班研究一下,应该能学到东西,谢谢 mark 学些一下了 最近在想,使用查表方式实现的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;
} qq302011 发表于 2018-8-3 15:39
最近在想,使用查表方式实现的S加减速就只能控制速度,不能控制位置,能否实现一个查表,可以同个脉冲的位 ...
这是以前做的理想状态的情况,后来发现不是这样,一般加速表都根电机有关,正规的电机厂商会提供最适合的加速表! 学习一下
页:
[1]