搜索
bottom↓
回复: 56

伺服电机控制算法疑问

  [复制链接]

出0入49汤圆

发表于 2016-9-19 18:03:57 | 显示全部楼层 |阅读模式
我本人是从事单片机程序开发的,以前从来没有接触过运动控制这一块领域。目前,公司有一个项目要用到伺服电机,驱动器的电路和代码都有,领导让我从代码里 研究一下驱动器的算法,看了几天,看到头晕晕的,还没有一个大概的概念。被一个函数卡了好几天还是没想明白,我贴一下代码出来,希望多多指教。
/**
        * @param  dis: the distant to move.
        * @param  t: the given time to move.
        * @param  acc: accerlation
  * @retval 0 for no error. 1 for time to short or acc to small;      
  */
u8 setTPath(int64_t dis,int64_t t,int acc)
{
        int64_t temp,t_destin,treferencepos;
        int dec;
        vel=AV*10;//AV为两次电机转过的角度差(脉冲数量表示)
        treferencepos=getPosition();//电机实际转过的角度,也是脉冲数量表示
       
        t_destin=dis;               
        dis=1000*(dis-treferencepos);
       
        t=10*t;
        if(vel>0)
        {
                        dec=-acc;
                        if(vel*t-vel*vel/acc/2>dis)
                        {
                                  if(vel*vel/acc/2>dis)
                                        dec=acc;                                                                       
                                  acc=-acc;                               
                        }
        }
        else
        {
                        dec=acc;
                        if(vel*t+vel*vel/acc/2>dis)
                        {
                                 acc=-acc;
                        }
                        else
                        {
                                  if(vel*vel/acc/2<dis)
                                        dec=-acc;
                        }
                       
        }
        if(dec/acc==-1)
        {
                        temp=t*t+2*vel*t/acc-4*dis/acc+3*vel*vel/acc/acc;

                        if(temp<0)
                                return 1;
                        temp=sqrt(temp);
                        acctime=(t-vel/acc-temp)/2;
                        dectime=t-(acctime+vel/acc);
                       
                        if(acctime>0&&dectime>acctime&&dectime<t)
                                ;
                        else
                        {
                                acctime=(t-vel/acc+temp)/2;                       
                                dectime=t-(acctime+vel/acc);
                                if(acctime>0&&dectime>acctime&&dectime<t)
                                        ;
                                else
                                        return 2;
                        }
        }
        else
        {
                        acctime=(dis-vel*t-vel*vel/2/acc)/(vel+acc*t);
                        dectime=t+vel/acc+acctime;
        }
        destin=t_destin;
        accelerate=acc;
        decelerate=dec;
        maxvel=vel+acc*acctime;
        endtime=t;
        distant=dis;
        referencepos=treferencepos;
        return 0;
}

该算法的核心应该就是位置控制算法,代码中的公式temp=t*t+2*vel*t/acc-4*dis/acc+3*vel*vel/acc/acc;代表什么意义,怎样推导出来的,算来算去都不行,梯形算法还是S型算法我都推导不出来,麻烦了解的大侠给我指导一下

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2016-9-19 18:20:58 来自手机 | 显示全部楼层
我做过运动控制,回头看看你的程序

出0入0汤圆

发表于 2016-9-19 19:38:30 | 显示全部楼层
想看看运动控制程序,看你贴出的程序不明白。

出0入0汤圆

发表于 2016-9-19 19:50:14 | 显示全部楼层
是DSP 程序么???

出0入49汤圆

 楼主| 发表于 2016-9-20 08:53:27 | 显示全部楼层
wkman 发表于 2016-9-19 19:50
是DSP 程序么???

不是DSP,是stm32的程序

出0入49汤圆

 楼主| 发表于 2016-9-20 08:54:18 | 显示全部楼层
霸气侧漏 发表于 2016-9-19 18:20
我做过运动控制,回头看看你的程序

有空麻烦帮我看看,有什么不明白直接说

出190入0汤圆

发表于 2016-9-20 09:11:43 来自手机 | 显示全部楼层
我觉得先不要深入代码,先把原理搞清楚。这个应该是T型速度规划吧,根据速度,时间,距离公式换算,只不过这里面距离可能由伺服旋转角度之类的作了替换,意思都是一样。

出0入49汤圆

 楼主| 发表于 2016-9-20 09:17:38 | 显示全部楼层
knight_sh 发表于 2016-9-20 09:11
我觉得先不要深入代码,先把原理搞清楚。这个应该是T型速度规划吧,根据速度,时间,距离公式换算,只不过 ...

恩,我现在就是研究这个算法的原来,这个算法大概是这样的:先给定位移,时间,然后去算加速时间,匀速时间和减速时间。把参数算出来之后就开始运动。但是中间有些公式不知道怎么得来的。这些参数最后都是以脉冲数量去表示,编码器是1000线的。

出100入85汤圆

发表于 2016-9-20 09:58:03 | 显示全部楼层
huali8412 发表于 2016-9-20 09:17
恩,我现在就是研究这个算法的原来,这个算法大概是这样的:先给定位移,时间,然后去算加速时间,匀速时 ...

有时间帮你看看。
可以换个思路,从已知推结果不好直接推的话。

你可以,找几个测试点,看下函数的输出是什么样的,然后自己绘制下图形。大概就能明白了。

出0入49汤圆

 楼主| 发表于 2016-9-20 10:24:11 | 显示全部楼层
whatcanitbe 发表于 2016-9-20 09:58
有时间帮你看看。
可以换个思路,从已知推结果不好直接推的话。

整个工程涉及很多参数,这算法里面带有PID算法,位置环->速度环->电流环,然后在电流环输出互补的PWM。工程还有一个表格数组,存放一组数据,暂且定义DATA[720],数据大小为720,这个应该是电角度,以为电机的极数是2对,数据的规律前半部分是从0增大到1000然后从1000减到0,后半部分从0一直到-1000然后从-1000到0,我猜这跟编码器有关系,因为编码器的线数是1000线的。因为我以前从来没有接触过伺服电机,没法从这些分散的数据找出联系。

出0入49汤圆

 楼主| 发表于 2016-9-20 10:29:11 | 显示全部楼层
霸气侧漏 发表于 2016-9-19 18:20
我做过运动控制,回头看看你的程序

算法可能是增量PID算法,然后里面包含S曲线的平滑处理,可是始终不知道公式怎么来的,有相关资料可以提供一下吗?谢谢

出10入23汤圆

发表于 2016-9-20 10:31:24 | 显示全部楼层
楼主,你该怎么谢我?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2016-9-20 10:35:04 | 显示全部楼层
zouzhichao 发表于 2016-9-20 10:31
楼主,你该怎么谢我?

我先谢谢你,正在做STM32运动控制这块,这个正好用得上。。。。

出0入49汤圆

 楼主| 发表于 2016-9-20 10:45:10 | 显示全部楼层
zouzhichao 发表于 2016-9-20 10:31
楼主,你该怎么谢我?

一下子茅塞顿开,想了好几天了,真的是非常感谢你的解疑,我还有好几个小疑问想请教你,可以加你QQ吗?

出10入23汤圆

发表于 2016-9-20 11:13:16 来自手机 | 显示全部楼层
C1060825815 发表于 2016-9-20 10:35
我先谢谢你,正在做STM32运动控制这块,这个正好用得上。。。。

哈哈,有人用得上就算没白费功夫

出190入0汤圆

发表于 2016-9-20 11:43:07 | 显示全部楼层
zouzhichao 发表于 2016-9-20 10:31
楼主,你该怎么谢我?

哈哈,我正要画图...

出10入23汤圆

发表于 2016-9-20 11:48:21 来自手机 | 显示全部楼层
knight_sh 发表于 2016-9-20 11:43
哈哈,我正要画图...

哈哈,握个爪…

出10入23汤圆

发表于 2016-9-20 11:59:22 来自手机 | 显示全部楼层
knight_sh 发表于 2016-9-20 11:43
哈哈,我正要画图...

跟你的思路是一样的
1,有个sqrt函数,首先想到这是一个一元二次方程求解
2,没有出现别的复杂函数,说明这肯定不是s加速,基本是梯形/三角形的,因为匀加速s = v0*t+0.5*a*t*t,换位思考,如果是我去做,我会去解决什么样的问题,我肯定先猜测梯形运动规划,毕竟这个在伺服中应用太广了,结果按照梯形图推导,和楼主的公式一模一样,至此一目了然

出0入49汤圆

 楼主| 发表于 2016-9-20 15:38:16 | 显示全部楼层
zouzhichao 发表于 2016-9-20 11:59
跟你的思路是一样的
1,有个sqrt函数,首先想到这是一个一元二次方程求解
2,没有出现别的复杂函数,说明 ...

这种梯形算法是不是要判断几种情况啊,我看函数体里面对输入的参数进行了好几次的判断,是不是判断有没有加速过程或者匀速过程?

出10入23汤圆

发表于 2016-9-20 15:58:54 来自手机 | 显示全部楼层
huali8412 发表于 2016-9-20 15:38
这种梯形算法是不是要判断几种情况啊,我看函数体里面对输入的参数进行了好几次的判断,是不是判断有没有 ...

实际上可能不需要判断那么多,多虑了

出0入49汤圆

 楼主| 发表于 2016-9-20 16:01:49 | 显示全部楼层
zouzhichao 发表于 2016-9-20 15:58
实际上可能不需要判断那么多,多虑了

是否只考虑正常情况就可以了,不需要判断额外的情况!因为真正应用的时候我们还要去调试参数的。不知道我的想法对不对!

出100入85汤圆

发表于 2016-9-21 09:24:01 | 显示全部楼层
zouzhichao 发表于 2016-9-20 10:31
楼主,你该怎么谢我?

大哥是人才啊

出0入0汤圆

发表于 2017-1-2 20:33:10 | 显示全部楼层
zouzhichao 发表于 2016-9-20 10:31
楼主,你该怎么谢我?

S1等式应该再加上X乘以V0

出0入0汤圆

发表于 2017-1-2 22:05:48 | 显示全部楼层
huali8412 发表于 2016-9-20 09:17
恩,我现在就是研究这个算法的原来,这个算法大概是这样的:先给定位移,时间,然后去算加速时间,匀速时 ...

所以看到 时间+位移,或时间+速度,这种类型基本都是T形加速。。。三角加速印象中不是这样子的。。。
一般来说无所谓就是3种:T型加速与其变种三角,还有一种是三角函数加速,还有一种是PID及各种变态PID。。。
实际上来说,真正应用中,应该是使用PID的。。。


出0入0汤圆

发表于 2017-1-2 22:06:02 | 显示全部楼层
zouzhichao  牛人

出10入23汤圆

发表于 2017-1-2 22:35:42 | 显示全部楼层
StephenCui 发表于 2017-1-2 20:33
S1等式应该再加上X乘以V0

我发的那个公式推导有些错误,后来又推导了一个,有时间再找出来

出10入23汤圆

发表于 2017-1-2 22:36:35 | 显示全部楼层
vc9181 发表于 2017-1-2 22:06
zouzhichao  牛人

惭愧,发了个有错误的

出0入0汤圆

发表于 2017-1-3 01:26:41 | 显示全部楼层
zouzhichao 发表于 2017-1-2 22:36
惭愧,发了个有错误的

最近也要搞伺服相关的产品,大师你发的那个公式推导我没看明白,有空能仔细讲讲吗?

出10入23汤圆

发表于 2017-1-3 09:35:00 | 显示全部楼层
FireHe 发表于 2017-1-3 01:26
最近也要搞伺服相关的产品,大师你发的那个公式推导我没看明白,有空能仔细讲讲吗?

...

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出10入23汤圆

发表于 2017-1-3 09:53:52 | 显示全部楼层
StephenCui 发表于 2017-1-2 20:33
S1等式应该再加上X乘以V0

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出10入23汤圆

发表于 2017-1-3 09:55:42 来自手机 | 显示全部楼层
故事重提,怕之前那个图误导大家,又把那个公式推倒了一遍,用了两种方法

出0入0汤圆

发表于 2017-1-3 09:57:11 | 显示全部楼层
多谢楼上的讲解。

出0入0汤圆

发表于 2017-1-3 13:41:07 | 显示全部楼层
zouzhichao 发表于 2017-1-3 09:55
故事重提,怕之前那个图误导大家,又把那个公式推倒了一遍,用了两种方法 ...

感谢赐教

出0入0汤圆

发表于 2017-1-3 15:06:56 | 显示全部楼层
呵呵 牛叉!!!!

出0入0汤圆

发表于 2017-1-3 15:10:37 | 显示全部楼层
zouzhichao 发表于 2016-9-20 10:31
楼主,你该怎么谢我?

呵呵呵  收藏!谢

出10入23汤圆

发表于 2017-1-3 15:14:23 来自手机 | 显示全部楼层
Xiyuhexuan 发表于 2017-1-3 15:10
呵呵呵  收藏!谢

12楼的是错的
后面更新的才是对的

出0入0汤圆

发表于 2017-1-3 15:29:50 | 显示全部楼层
zouzhichao 发表于 2017-1-3 15:14
12楼的是错的
后面更新的才是对的

嗯 看到了 看来您也是做这个行业的哈!

出10入23汤圆

发表于 2017-1-3 15:33:27 来自手机 | 显示全部楼层
Xiyuhexuan 发表于 2017-1-3 15:29
嗯 看到了 看来您也是做这个行业的哈!

我不是这个行业的,我layout民工一枚

出0入0汤圆

发表于 2017-1-3 15:36:54 | 显示全部楼层
zouzhichao 发表于 2017-1-3 15:33
我不是这个行业的,我layout民工一枚

哈哈 只能膜拜了!

出0入0汤圆

发表于 2017-1-3 17:33:05 | 显示全部楼层
zouzhichao  牛人

出0入4汤圆

发表于 2017-1-4 10:55:56 | 显示全部楼层
zouzhichao 发表于 2017-1-3 09:55
故事重提,怕之前那个图误导大家,又把那个公式推倒了一遍,用了两种方法 ...

点赞一下!

出0入0汤圆

发表于 2017-1-4 18:54:49 | 显示全部楼层
点赞一个,厉害

出0入85汤圆

发表于 2017-1-4 20:03:22 | 显示全部楼层
STM32哪个系列的?

出0入0汤圆

发表于 2017-3-19 21:23:39 | 显示全部楼层
不错啊,最近也在弄伺服电机

出0入0汤圆

发表于 2017-3-20 04:24:20 | 显示全部楼层
高人太多了,^_^,mark一下。

出0入0汤圆

发表于 2017-3-21 18:43:24 | 显示全部楼层
acctime=(dis-vel*t-vel*vel/2/acc)/(vel+acc*t);中acc*t是代表啥意思?t不是完成位移的总时间吗?

出0入0汤圆

发表于 2017-3-21 20:16:59 | 显示全部楼层
zouzhichao 发表于 2016-9-20 10:31
楼主,你该怎么谢我?

程序能执行这个算法吗???计算时间大概需要多少

出10入23汤圆

发表于 2017-3-21 20:46:28 来自手机 | 显示全部楼层
529063382 发表于 2017-3-21 20:16
程序能执行这个算法吗???计算时间大概需要多少

肯定能啊,如果m4带fpu的执行起来速度不会慢

出0入0汤圆

发表于 2017-3-21 20:51:41 | 显示全部楼层
zouzhichao 发表于 2017-3-21 20:46
肯定能啊,如果m4带fpu的执行起来速度不会慢

请教一下,acctime=(dis-vel*t-vel*vel/2/acc)/(vel+acc*t);中acc*t是代表啥意思?

出0入0汤圆

发表于 2019-4-21 15:24:54 | 显示全部楼层
不错,留存

出0入0汤圆

发表于 2019-4-22 08:48:02 | 显示全部楼层
@大家   

有没有这方面的书籍?

出0入0汤圆

发表于 2019-8-7 20:46:16 | 显示全部楼层
不错啊,最近也在弄伺服电机

出0入0汤圆

发表于 2019-8-7 23:26:47 | 显示全部楼层
学习了。。。~~

出0入0汤圆

发表于 2020-8-31 09:33:27 | 显示全部楼层
学习学习了

出0入0汤圆

发表于 2020-8-31 19:29:07 来自手机 | 显示全部楼层
能搞电机控制算法的都是牛人

出0入0汤圆

发表于 2020-8-31 23:20:15 来自手机 | 显示全部楼层
学习了     

出0入0汤圆

发表于 2020-9-1 14:00:19 来自手机 | 显示全部楼层
厉害了,我的坛友
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-15 07:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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