打印
[STM32F1]

展示几张PID方式控制的步进电机运动控制波形

[复制链接]
13033|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ColeYao|  楼主 | 2024-7-17 09:18 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ColeYao 于 2024-7-17 19:25 编辑

    附图展示了几个较完美S曲线的速度曲线图:控制步进电机加减速时,要在一定时间内运动到指定的位置,此时速度为0无振荡,有一定的难度,此前已经实现,这次在此基础上,进一步实现了较完美的速度曲线,对于运动控制而言,已经是不错了!
   对于以指定的最大速度运动到指定位置,可以有各种策略:
    1)分几档速度加速,快到指定位置时镜像减速,特点是能用简单,但有顿挫感;  
    2)计算一个S曲线速度的数据表格,按表格加速,快到指定位置时镜像减速,特点是平滑,缺点是要求一个最大速度对应一个数组,通用性差,比较费flash空间;        3)以PID实时计算生成速度S曲线,快到指定位置时镜像减速,特点是较平滑,对单片机算力要求不高,对速度的适应范围很广,但同样比较费flash空间;   
    4)以PID实时计算生成速度S曲线,快到指定位置时按规定的递减函数减速(如平方根),特点是对单片机算力要求不高,对速度的适应范围很广,而且不费flash空间,缺点是速度波形较差;
  以上从1)到4)都是在我的项目中实际用过的,这次想出了一个新的策略,在4)的基础上,极大改善了速度波形,以上!

PID_SCurve.png (114.09 KB )

PID_SCurve.png

PID_SCurveA.png (116.22 KB )

PID_SCurveA.png

PID_SCurveB.png (117.59 KB )

PID_SCurveB.png

使用特权

评论回复
来自 2楼
ColeYao|  楼主 | 2024-8-6 15:55 | 只看该作者
本帖最后由 ColeYao 于 2024-8-8 10:28 编辑

   最新的仿真波形如图,橙色标线所在位置的位移目标值和当前值一致,表明运动无偏差(黄色为目标位置,绿色为步进电机实时位置,紫色为速度曲线)!
   最后一张图红色曲线是加速度曲线,由图可知,加速度较平滑,加速度最大最小值较小!

使用特权

评论回复
板凳
ColeYao|  楼主 | 2024-7-17 19:35 | 只看该作者
本帖最后由 ColeYao 于 2024-8-25 07:38 编辑

之前的4)的步进电机控制的速度曲线图详见之前的帖子:

https://bbs.21ic.com/icview-3282010-1-1.html        步进电机运行使用PID加减速控制方式的策略讨论

https://bbs.21ic.com/icview-3345978-1-1.html    [技术讨论]  [size=1em]步进电机运动控制(PID控制)效果图分享

本帖中较完美步进电机PID控制速度波形图的生成策略请参考另一个帖子: http://www.51hei.com/bbs/dpj-236875-1.html    展示两个较完美S曲线的速度曲线图



使用特权

评论回复
地板
suncat0504| | 2024-7-17 22:29 | 只看该作者
好!学习了。谢谢分享。

使用特权

评论回复
5
dukedz| | 2024-7-18 09:19 | 只看该作者
本帖最后由 dukedz 于 2024-7-18 09:30 编辑

我的做法是下图,用户设置的目标位置先经过速度规划(或者理解成插补),然后再用 pid 追,梯形速度曲线经过 pid 柔和之后有点 s 曲线的感觉。
因为有速度规划,所以 pid 导致的位置超出很小,因为这套做法和 foc 伺服器一致,更高级的 foc 都做不到绝对的不超位置,为何要求步进一点都不超?



其它步进电机控制器往往会考虑精准输出指定数量的 STEP 脉冲,而我们不是,我们把步进电机当作普通有刷或无刷电机,譬如参见 CDFOC 的框图,开头的模块是相同的,只是精简很多。

我们使用位置环 PID 来让当前位置追随目标位置,PID 输出的速度值直接控制 pwm 输出的频率,pwm 输出的脉冲数会通过另一个 timer 记录下来,当作编码器读到的真实位置。

如果发多了一些脉冲出去,位置环 PID 会自动控制电机反转,直到当前位置等于目标位置。
更高级的 FOC 等伺服驱动器,也没法做到走到目标位置后,一点都不超,步进电机完全可以按照 FOC 伺服方式来控制,不用担心性能问题。

使用 PID 追随位置,虽然使用的是梯形加减速,但是被 PID 柔和之后,实际波形比较接近 S 型加减速,这样就同时拥有 T 型的简单、快速和 S 型柔和的优点。

如果我们需要增加真实的编码器做闭环,代码改起来会很容易,改为把编码器读到的位置信息喂给位置环 PID 即可。

这样,无论是有刷、无刷六步换相、无刷 FOC、步进电机,都是使用相同的控制架构,更加简单灵活。

我的代码(wiki 页面有中文说明):
https://github.com/dukelec/cdstep

打不开可试试临时使用代理:
https://kkgithub.com/dukelec/cdstep

使用特权

评论回复
评论
临暗 2024-8-28 15:39 回复TA
@dukedz :以细分为论,没有编码器实际达不到细分的精度 
dukedz 2024-8-24 09:26 回复TA
@Prry :为啥不可靠?只要没有失大步,就不会不可靠。步进可能走了99步,那记录的脉冲数就是 99,离 pid 给定的目标 100 有差距,那么 pid 就会加大输出速度,让步进走到 100 步,如果走多了,pid 也会让步进往回走,必须走到 100 才消停。 
Prry 2024-8-23 23:58 回复TA
没有编码器反馈,纯靠记录控制脉冲数作为反馈,显然不可靠,给100个脉冲,步进可能走了99步。 
6
ColeYao|  楼主 | 2024-7-18 09:29 | 只看该作者
本帖最后由 ColeYao 于 2024-7-18 09:32 编辑
dukedz 发表于 2024-7-18 09:19
我的做法是下图,用户设置的目标位置先经过速度规划,然后再用 pid 追,梯形速度曲线经过 pid 柔和之后有点 ...

  步进电机不允许停的时候有轻微偏差,这是机器使用场合决定的,我这边一台设备,每几分钟走一次位移,每次位移偏差1-2个脉冲的时候,12小时左右运行是正常的,如果是运行24小时以上则会出现最终位置有几毫米的偏差,可能导致最终运行不正常,最终方案是加了编码器校正(如果步进电机没有走步偏差的话就可以省掉这个编码器,之所以加这个编码器是因为这个步进电机驱动是10多年前写的,没有加减速,因此很慢的时候就有失步现象,如果是现在写的话,应该可以省去编码器)。

使用特权

评论回复
7
dukedz| | 2024-7-18 09:34 | 只看该作者
本帖最后由 dukedz 于 2024-7-18 09:39 编辑
ColeYao 发表于 2024-7-18 09:29
步进电机不允许停的时候有轻微偏差,这是机器使用场合决定的,我这边一台设备,每几分钟走一次位移,每 ...

我上面的方案停的时候没有任何偏差,一个脉冲误差都不会有。
只要有误差,pid 就会调整到没有误差,速度规划会结束,但 pid 始终在工作。
我这里的 pid 是正常的常规位置环 pid,不是拿 pid 当作位置规划等取巧用法。

使用特权

评论回复
8
ColeYao|  楼主 | 2024-7-18 09:57 | 只看该作者
本帖最后由 ColeYao 于 2024-7-18 10:33 编辑
dukedz 发表于 2024-7-18 09:34
我上面的方案停的时候没有任何偏差,一个脉冲误差都不会有。
只要有误差,pid 就会调整到没有误差,速度规 ...

考虑过使用PID位置环和速度环,起步时正常(经过适当调参数和修正可以做到比较理想的速度S曲线),主要是停的时候既要准确停在指定位置,又要恰好减速为0比较不好把握(简单粗暴的办法是1)到指定位置了,但速度不为零,直接让速度指定为0;2)还没到指定位置,速度已经为0了,再使用一个低速走到指定位置,这两个办法能实现目的,但给人的观感会较差),因此需要通过一定的策略来调整,最常见的就是仿生学,绝大多数人骑车或开车停在红绿灯前的停止线附近都停的很好,理论上单片机如果理解了其中的原理也能做到,并且比人做得更精准!

使用特权

评论回复
9
dukedz| | 2024-7-18 10:33 | 只看该作者
ColeYao 发表于 2024-7-18 09:57
考虑过使用PID位置环和速度环,起步时正常(经过适当调参数和修正可以做到比较理想的速度S曲线),主要是 ...

可以看一下我的 T 型速度规划函数:

梯形加减速规划的函数为 t_curve_compute, 它的思路为:

任意时刻,我们计算从当前位置减速停到目标位置,所需要的减速度为多少。

如果算出来的减速度比用户设置的目标减速度弱,那么表示当前还不着急开始减速,当前要么保持匀速,要么加速运行(如果当前速度小于目标速度)。

如果算出来的减速度比用户设置的目标减速度强,那么表示要开始减速了,再不减速要超过指定目标,没法停在指定目标。

由于我们是周期性运算,上一个周期计算出来不用减速,这一个周期计算出来需要减速,理论上是要在这两个周期之间的某个时间点就应该减速,我们推迟了一小会才开始减速, 说明我们用较高的速度已经移动了一段位移,如果此时按照用户设定的减速度开始减速,那么一定无法不超过目标位置。

这种离散计算带来的误差,我们通过适当放大用户设定的减速度来解决(代码中乘以 1.2 倍放大)。

最后,为了防止到目标位置停不下来,反复振荡,所以判断如果到达目标位置时,电机速度很慢,就直接停止。 (如果过快,要先超过再掉头,譬如用户临时修改目标位置到很近的位置。)


由于 T 型规划结尾处可能有点速度上的小跳动,由于最后还有一级 pid 可以起到平滑滤波的效果,所以没有不良影响。

使用特权

评论回复
10
ColeYao|  楼主 | 2024-7-18 11:15 | 只看该作者
dukedz 发表于 2024-7-18 10:33
可以看一下我的 T 型速度规划函数:

梯形加减速规划的函数为 t_curve_compute, 它的思路为:

其实简单粗暴的办法就是最开始提到的3)起步阶段PID模拟S曲线,过中点后使用镜像法减速到停止,这个办法的缺点是非常费RAM,因为要详细记录升速阶段的速度数据,最终在降速阶段还原。马达数量少,RAM空间充足的时候很好用,马达数量多,RAM空间不多的时候就有点伤脑筋了!

使用特权

评论回复
11
dukedz| | 2024-7-18 11:52 | 只看该作者
ColeYao 发表于 2024-7-18 11:15
其实简单粗暴的办法就是最开始提到的3)起步阶段PID模拟S曲线,过中点后使用镜像法减速到停止,这个办法 ...

这种方法不好,中途改目标位置和速度怎么办?

使用特权

评论回复
12
guijial511| | 2024-7-18 12:02 | 只看该作者
这个波形是算好还是不好呢?步进电机不是标准方波控制吗?

使用特权

评论回复
13
ColeYao|  楼主 | 2024-7-18 18:37 | 只看该作者
guijial511 发表于 2024-7-18 12:02
这个波形是算好还是不好呢?步进电机不是标准方波控制吗?

步进电机的方波那是驱动信号,接线圈的,我这个是速度控制信号,是接步进电机驱动器的,不是一个东西!

使用特权

评论回复
14
kqh11a| | 2024-7-29 14:30 | 只看该作者
在运动控制中,精确的加速和减速过程对于确保系统平稳运行和减少机械磨损非常重要。

使用特权

评论回复
15
申小林一号| | 2024-7-29 22:54 | 只看该作者
感谢分享

使用特权

评论回复
16
GlenX| | 2024-8-17 22:21 | 只看该作者
我认为楼主的说法很好,重点是兼顾CPU的速度、存储容量、运算量以及控制效果。
做到用更小的代价完成同样的认为是我们每个编程者的终极目标。
我也认为S曲线不是最佳,只是“加速度”比较柔和,对机械惯性和电流冲击好处最多,
但对于控制,还是由改进余地的。

使用特权

评论回复
17
suncat0504| | 2024-8-25 19:20 | 只看该作者
感觉在任何层面上的工作,往细致里做,就是工匠精神了。

使用特权

评论回复
18
suncat0504| | 2024-8-25 19:21 | 只看该作者
马达的精细控制,应用场景会越来越多了吧。在机器人控制方面是非常重要的。

使用特权

评论回复
19
ColeYao|  楼主 | 2024-8-25 20:24 | 只看该作者
suncat0504 发表于 2024-8-25 19:20
感觉在任何层面上的工作,往细致里做,就是工匠精神了。

   谈不上啥工匠精神,上次大学毕业20周年同学会上和一个同学见面后还相谈甚欢的,前几天他的朋友圈是他家属帮忙更新的,人已经走了,感觉心里空落落的!有些技术上的事,如果能对大家有帮助的,也不想藏着掖着,总之万一今后有个意外,也能留下点啥吧!

使用特权

评论回复
20
daichaodai| | 2024-8-26 07:40 | 只看该作者
人生无常啊,所以人一辈子有时候想想真没意思。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

383

帖子

5

粉丝