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开发板(步进电机测试信号)
补充
因为是"野路子",代码、电路之类的就不拿出来献丑了。
前面已经讲了设计思路和总结的问题,这应该是其中稍稍有价值的内容,仅供大家围观
|