scu319hy 发表于 2024-1-30 17:48:29

DIY“低成本”的野路子“闭环”步进电机

本帖最后由 scu319hy 于 2024-1-30 17:49 编辑

10年前玩3D打印机的时候,一直有心上“闭环”步进电机。看到网上有人自己DIY,于是乎也想有样学样的自己搞。不过那些年要搞的东西太多,一直没能启动这个项目。

这个想法一直拖着,直到5年前才决定启动DIY闭环步进电机的项目。各种材料准备了一堆,PCB打了两版样。折腾了好几周,因为纠结于嵌入式开发环境太过垃圾,以及板子中的各种设计失误而夭折了。仅仅是把步进电机转进来而已。

最近终于给我的编辑器加上了嵌入式平台开发的相关能力。在翻找实验板的时候,突然看到了躺在桌子上5年的步进电机。于是乎,决定重启这个项目,一方面是验证编辑的嵌入式开发相关功能,另一方面是真心想把悬在心头数年之久的一块大石给卸下来(心头悬的大石太多,卸下这块估计还有五百块在等着我 )

先看运行效果,如下:

运行效果视频

和专业的当然不能比,但总算是基本功能实现了。

板子还是用的5年前打的样,之前打了几十块(实在不是我要打这么多,被强行买一送N了...),虽然设计的漏洞百出,但总算是勉强能用。还是决定咬牙把它跑起来,哪怕多飞几根线也行。一口气焊了5块,还有一堆真空包装没开封的...


简jian洁lou”的PCB设计,手工雕刻的工程板过于先进就不展示了

不知道是因为运气还是因为东西太简单了,几处改造都比较简单,正面一共才8个件,都不用动,其它不相关的件一个都不用焊

核心只有三样:

MCU是STM32F030F4

电机驱动是DRV8870/AT4950

角度传感器是TLE5012 E1000

板子有了,就是撸代码时间。经过几天艰苦卓绝的瞎折腾,烧了四块电机驱动芯片之后,深刻认识到了之前的设计失败之处。经过反复的软硬件补丁之后,终于有了前面视频的效果。

关于控制精度

如下图:在1.8度二手42步进电机上16细分每一步都有0.1度左右的变化。正反转的回差有0.2~0.3度。


16细分,单步约0.1度

总结

目前看下来,之前的设计失误有以下几点:

1. 脑子抽风了,用了检波电路来滤波PWM。搞得电流控制参考电压是非线性的。

2. 电流采样电阻过小。总想着电机驱动电流要大点更好,总想冲着DRV8870标称的"峰值"3.5安来搞。结合问题1,自然就是芯片冒烟的结果...

3. TLE5012 E1000 的接口有SPI和增量两种方式,为了响应快,使用了增量输出的接口。但在高速+震动的情况下,这个接口的输出总会有累计误差(当然,应该是我使用不当)。最后改用SPI读绝对值,效果就好多了。

4. 没用硬件SPI,用软件读数据需要花8~9微秒。这会影响控制精度。不过,由于STM32F030的性能也就这样,用硬件方式中断开销又是另一个头疼的事。

5. 想当然的把电压控制当成了电流控制。这导致最开始跑起来的版本,细分效果很差。在特定转速下,振动得像拖拉机。原本我都想放弃这个板子,重新选型搞新版本了。在和DRV8825的运行效果对比之后,终于意识到了控制电压不是控制电流。好在运气不错,原有的电流控制电路拆分成两路,STM32F030还空了一个可用的定时器输出脚,刚好就在原有的电流控制电路边上有引线,飞线解决。

6. STM32F030引脚不够了,电流控制做不到"闭环",500rpm以上电机特别无力。好在,一是步进电机通常不用跑这么快;二是电流变化和电机转速强相关,用速度来控制电流也是可以行得通的"补丁"。

7. STM32F030性能似乎不足以支撑更高转速的精细控制。仅是步进输入信号的中断处理就会对高速运行产生较显著的影响了。32细分,64细分在中低速时震动会更小些,但性能不足,细分高了跑不快。

8. 板子布局极其不合理,对散热非常不利。

疑问

最初我以为能靠角度传感器精细控制换相,以求最高精度的角度控制,最短的换相时间。但操作下来,似乎很难达到。角度传感器有延迟和误差,电机转动时会有震动。乱七八糟加一起,不知道应该相信谁。一个步进角才1.8度,误差下来电机完全没法正常工作了。

现在的实现则变成自由换向,角度传感器仅用做速度和角度测量,再用测量出的结果来修正换相的速度和角度误差。这大概就是所谓的速度环和角度环?再加上闭环的电流控制,就是所谓的“三环控制”了?

我没用过其它的闭环步进电机,只是在网上看过图片和视频而已。电机控制理论更是没学过,纯靠中学水平的数学/物理知识加上我几十年的编程经验胡乱操作一番。不知道这样算是个什么水平,欢迎各路大神指点迷津。

最后来个全家福



DIY的开发环境 + DIY的步进电机控制器 + DIY的JLINK-OB STM32 + 格格不入的ESP32开发板(步进电机测试信号)

补充

因为是"野路子",代码、电路之类的就不拿出来献丑了。

前面已经讲了设计思路和总结的问题,这应该是其中稍稍有价值的内容,仅供大家围观

scu319hy 发表于 2024-3-6 12:00:54

黔驴一头 发表于 2024-3-6 02:46
能介绍一下您的开发环境吗

你是指哪方面?
我之前有发过软件相关的介绍
http://www.crystalradio.cn/forum.php?mod=viewthread&tid=2114558&extra=
在知乎上也发过一些
https://zhuanlan.zhihu.com/p/625446282
https://zhuanlan.zhihu.com/p/677133456
https://zhuanlan.zhihu.com/p/685395062

scu319hy 发表于 2024-1-31 00:20:59

箫音 发表于 2024-1-30 22:00
这么艰难????
我本来想做个绕线机,其实买一个才100元,
家里有根5毫米的轴,我想加个钻头夹做个手柄 ...

只用MCU发个指令控制步进电机旋转没啥难的,
难的是在高速下,通过角度传感器精确测量转子,并发出相应的控制指令来控制磁场, 以达到你想要的旋转速度与角度。

中断的时间要看你的MCU频率以及中断代码的逻辑
比如:10MHz的CPU,中断代码如果只要用10个周期,那理论上最多一秒可以跑100万次。
假设你的程序最大允许花1%的CPU时间来处理中断,一秒也能跑1万次了。
真实的中断肯定花的CPU时间会多得多,但随便一个什么MCU应该也都可以满足你的控制要求的
当然,如果要能流畅显示交互界面,那就是另外的事情了。

scu319hy 发表于 2024-1-30 21:16:17

aidn 发表于 2024-1-30 19:33
首先spi的硬件速度比你想当然的软spi 快,快没影了。f030有c8,g070,f403还是407也贵不了多少

我啥时候的想当然的觉得软件SPI快了?:L
而且,硬件SPI主要是能释放CPU来干其它事,真要说比软件快多少,那倒真还不一定呢。毕竟也要分场合。
对于这种只读一个16位数据的场合,有配置硬件SPI工夫,软件都把数据读回来了。
更为关键的是,传感器就只能跑8MHz,软件跑快了它都跟不上趟,就算硬件能跑80MHz也没有用不是?
这种场景下综合来看:
在使用硬件SPI时,除了等待数据的时间,还要花额外的时钟周期做配置/中断切换的事,就算是死等,也一样会有额外的等待时间;使用软件SPI则只有数据等待的时间。而数据等待的时间完全是受传感器的限制,无论硬件软件都几乎是一样的。
而且,我那个板子设计时根本就没考虑用SPI读数据,想硬件也用不成啊:L

scoopydoo 发表于 2024-1-30 18:23:58

赶脚 STM32F3 系列可能更适合电机应用

scu319hy 发表于 2024-1-30 18:58:06

scoopydoo 发表于 2024-1-30 18:23
赶脚 STM32F3 系列可能更适合电机应用

嗯,STM32F3官方说是适合用来做电机控制。就是不太符合我这个低成本的套路,一片芯片顶我这全套了。
目前我这一套方案的成本,用TAOBAO拆机件大概是8元,全新件立创现价大概是18元。
最近又买了一些STM32G030,只贵4毛,但稍微超频一点比F030的性能强一倍。换这个的性价比更好:lol 就是和F030的引脚不兼容。
如果还想跑得更快,我最近试了一下国产的air32f103,可以稳定跑到200MHz以上,只比F030贵了2块钱,性能强了3倍不止,RAM和FLASH也更富裕。


不过,为了搞这个东西,我花的冤枉钱应该不止几大百了。买现成的高性能闭环步进电机控制器都够做3D打印机了:'(

aidn 发表于 2024-1-30 19:33:40

首先spi的硬件速度比你想当然的软spi 快,快没影了。f030有c8,g070,f403还是407也贵不了多少

箫音 发表于 2024-1-30 22:00:17

这么艰难????
我本来想做个绕线机,其实买一个才100元,
家里有根5毫米的轴,我想加个钻头夹做个手柄也行,但要做计数,
家里有个42步进电机,于是就买了二块A4988驱动模块,想着用STM32
提供脉冲,再给个方向信号就行了。
看了楼主的帖子,心里有点凉了。
最后请教楼主:我准备就用180个脉冲一周,
为了计数,我准备用CTC加中断,如果每秒1转,
那每秒180个中断MCU忙得过来吗?
谢谢!

箫音 发表于 2024-1-30 22:03:12

箫音 发表于 2024-1-30 22:00
这么艰难????
我本来想做个绕线机,其实买一个才100元,
家里有根5毫米的轴,我想加个钻头夹做个手柄 ...

当然MCU还要显示和管理键盘(5、6个键),
这键盘也要用到中断。
而且我想的是半手动,就是手按前进或后退钮时电机才转,
这样行么?

量子隧道 发表于 2024-1-30 22:31:28

绝对角度探测得足够准,超过1.8度一个数量级以上的话,可以实现FOC算法,以最小的电流换得最大的扭矩,让步进(在低速区间)迸发出不亚于伺服电机的扭矩和效率。

scu319hy 发表于 2024-1-31 00:38:32

量子隧道 发表于 2024-1-30 22:31
绝对角度探测得足够准,超过1.8度一个数量级以上的话,可以实现FOC算法,以最小的电流换得最大的扭矩,让步 ...

你刚好说到了一个困扰我的工程问题,就是角度测量的准确度和及时性问题。
参见我的疑惑部分,我最初是想用传感器的角度直接来控制换相逻辑的,让换相角度始终超前转子一个固定角度。嗯,似乎这就是你说的FOC了吧?

但这个测量精度受装配的影响很大,比如:
磁铁的安装角度,同心度
与角度传感器之间的夹角,同心度等等
由于手上的步进电机并没有磁铁座,我只是用双面胶简单固定的,肉眼可见的各种偏差。
最后测量下来,一圈中最大的误差有正负1~2度之多。虽然添加了手工的误差修正,但至少还有0.2度左右的误差。

再一个是延迟的问题,受CPU性能及传感器性能的影响,读取的角度与真实角度会有一定的滞后,并且CPU几乎是跑满了,受中断等因素影响这个滞后还不那么稳定。

低速时也许可以参考一下传感器角度,高速的时候简直完全没法用:'(

量子隧道 发表于 2024-1-31 14:28:09

scu319hy 发表于 2024-1-31 00:38
你刚好说到了一个困扰我的工程问题,就是角度测量的准确度和及时性问题。
参见我的疑惑部分,我最初是想 ...

大概是让驱动保持提前于转子90度,并且在此相位位置上根据角度差和扭矩,以PID算法对定子电流进行调制,就算FOC了。但是前提是角度要能测准,否则会乱驱动。磁传感器可能不行,即使安装准确,也有积分非线性以及易受干扰的问题。应该得用联轴器连光编码器。

scu319hy 发表于 2024-1-31 15:17:16

量子隧道 发表于 2024-1-31 14:28
大概是让驱动保持提前于转子90度,并且在此相位位置上根据角度差和扭矩,以PID算法对定子电流进行调制, ...

昨天又测试了用传感器直接控制换相的逻辑。在对角度做了修正以后,精度勉强够。
但正反转有回差,修正的角度误差不同。表现在运行效果上就是超前角度不同,正反转的速度会不同,扭矩也不同。
另外就是速度跟不上,高速跑不起来,到250RPM就跑不上去了。
再就是由于缺少对电流的闭环控制,固定相位超前角度会在低速空转时产生很大的震动,高负载时则会好一些。因为空转时转子超速了。
但这样带来的好处也是显而易见的,扭矩明显会强很多,并且在做角度误差修正时会顺滑很多。

scu319hy 发表于 2024-1-31 21:05:12

箫音 发表于 2024-1-30 22:00
这么艰难????
我本来想做个绕线机,其实买一个才100元,
家里有根5毫米的轴,我想加个钻头夹做个手柄 ...

为啥我昨天给你的回复不见了?重新发一下

用现成控制器控制步进电机转动并不难
你的应用场景下,任何MCU的能力都可以满足。
中断处理完全不是个问题,只要处理过程足够快,一秒跑几十万次都不成问题,更不用说区区数百次。
如果需要处理显示相关的逻辑,会需要更强的性能和更大的内存。
如果是单色显示,320x240需要10K的内存当显存,如果是16位色则需要160K。
STM32的话需要比较高端的型号才有这么多内存。
可以考虑使用国产的IOT模块,性价比要高点。
比如:
ESP32-S3N8R16 有500多K的SRAM,8M的PSRAM,16M FLASH可用。
便宜点模块的才15块。现成的开发板也才25左右
能用Arduino开发,上手比较容易。

箫音 发表于 2024-1-31 21:12:14

scu319hy 发表于 2024-1-31 21:05
为啥我昨天给你的回复不见了?重新发一下

用现成控制器控制步进电机转动并不难


谢谢楼主指点!!!
不知道电机失步的情况是不是很多?
我本来想纯手动的,就是计数有些麻烦才想用MCU的,
如果只计脉冲,圈数误差不会很大吧?

箫音 发表于 2024-1-31 21:14:36

scu319hy 发表于 2024-1-31 00:38
你刚好说到了一个困扰我的工程问题,就是角度测量的准确度和及时性问题。
参见我的疑惑部分,我最初是想 ...

推荐使用旋转编码器计数,
以前的机床也是用这么办法的,
当然人家用的是链条链轮,编码器是光电的。
页: [1] 2 3
查看完整版本: DIY“低成本”的野路子“闭环”步进电机