闭环步进电机驱动
m24h2023/09/29原创 极客DIY IP:上海

已开源 XXXXXXXXXXXXXXXXXX/m24h/hyStepper

------------------------------------------------------

长假不想出门扎堆 就打算研究一下步进电机的闭环驱动 大抵最初的是受网上便宜的从口罩机上查下来的闭环套件的刺激 但是全换掉又对旧物感觉不平 何况尚有余虑 不一定适合我现在的CNC系统

现在流行的步进闭环驱动应该都是FOC系统 加上电流环 速度环 位置环的PID控制 眼下DIY流行使用如MT6816之类的磁编码器 自带电流环的A4950之类的电机驱动 成品板约50元 实际造价只有10几 几套下来 实在莫如自制

但此类DIY通常为3D打印设计 而我因为入手了光敏树脂打印机 就不太考虑其他3D打印了 毕竟大尺寸东西不如买现成的 但凡有个民用构思 网上早有许多成品 

考虑几种步进驱动适用场景:

  1. 3D打印 特点是控制复杂 代码说上万行只怕都说小 需要长时间工作 噪声 发热 失步都是关键问题 而且一般皮带驱动 步距大 转速低 而且负荷低且平稳

  2. 厂房工业驱动 控制代码简单 无论是皮带还是丝杆驱动 都有转速大 负荷大的需要 一般简单地来回 过程要求转速稳定 启停平滑

  3. CNC系统 代码量中等 一般丝杆驱动 步距小 转速快 各轴转向频繁 负荷变化激烈 对位置要求精准 噪声和发热对个人而言并不太重要 但仍需避免失步

再考虑FOC+PID方案的优缺点:

  1. 驱动力矩大 始终驱动力都在Q轴上 每一步都能达最大牛米数 而开环的一旦细分 比如16步细分 细分扭矩只能达到最大牛米数的sin(90度/16)=0.1倍 这也是为什么闭环不发热 因为它只需要付出原本电流的1/10

  2. 精度高 因为有反馈机制 它可以在每一细步上用尽电流数 而开环需要付出临时错步的代价 比如错了90度 这时候能给出同样的扭矩 在模5丝杆上 就会有25um的误差 精度就下来了

  3. 低负荷时候 PID可能会过冲振荡 而开环可以自动锁定位置 PID也很难适应需要频繁转向 频繁改速的场景

  4. 闭环可以弥补失步问题 可以设置警戒阈值 不至于超过加工精度要求还不知道

  5. 闭环要工作优良 需要调整许多参数 适应范围较窄 需要经验和耐心

再考察目前的DIY方案 应该也是我的项目意向 磁编码器性能应该满足精度要求 即便AS5600 也能有4096级 应能做到1024级 在模为5mm的丝杆上 等于一步5um 要知道这已经达到高精度机床标准了 比大多数国内加工中心强了 如果用MT6816 可以做到1.25um就是超高精度了 瓶颈不在于此

关键是电机驱动 无论A4950 TB67H450 还是几种国内仿制的 斩波死区时间都25us (受到电机电感量影响 这个也委实很难减少 即便自己打造斩波驱动)这意味着控制频率只能是10kHz级别 2环PID至少10个周期达标的话 转速得低于每秒1圈 模5丝杆就是5mm 对于铣雕还勉强 钻孔就未免移动太慢了 而且还得考虑负荷太变化激烈 PID很难平稳下来 会过冲会振荡 影响最终精度

我注意到有些闭环驱动 如HDB-ISD880 有个开关 可以选择“频繁转向”还“长时间平稳”两种工作模式 我怀疑其实前者就是开环模式

所以我打算先进行仿真 想办法解决一些问题 或者自动混合开环和闭环的方法 如果不行 看看能不能纯粹搞一个寄生在开环系统上 仅仅进行失步补偿和告警的简单系统

关于环境目标和一些有关物理参数

  1. 模5滚珠丝杆(我在用 也常用)

  2. 57步进电机 额定电流3A (再大的话A4950就驱动不了了) 扭矩2Nm(200RPM内) 转动惯量5*10^-5kg·m^2 相电感约2mH(小于3mH) 相电阻小于2欧 (使用A4950其实不用太考虑这两项 除非启停期间 电感自然有续流 而控制板会在启停时候减速)

  3. 传动机构质量 未知 最大的X轴估计小于30kg 最小的Z轴估计小于10kg

  4. 机械效率毛估估决定就是0.8了

  5. 弹性联轴器弹性系数取 50Nm/rad

  6. 导轨和滚珠丝杠摩擦系数取 0.01


[修改于 11个月28天前 - 2023/12/01 23:55:07]

+1  科创币    全桥整流    2023/11/09 🐮🐮🐮
+1  学术分    虎哥    2023/10/06 一个有示范意义的学习和研究过程。希望作者终于有一天能学会使用标点符号。
加载全文
来自:综合交流区 / 极客DIY
52
 
10
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
m24h 作者
1年0个月前 修改于 1年0个月前 IP:上海
927223

半开环算法基本已经稳定 趁还有点时间  开始写PID及其测试

PID算法是简单的 我这么说不是高兴的 而是无奈的 我曾经加了杂七杂八的东西 期待优化它 但是最后几乎都一一取消 

  1. 首先是系统复杂度和敏感性 远超理论 看MT6701的响应曲线就知道了 里面有太多杂质了 而且信号变化极快 比方说 转速16圈每秒的时候  50极电机一个周期 也只有20次采样和处理 和一般至少能给几百次采样处理机会的PID控制系统完全不同

  2. 死区设计:  取消 因为输入信号本身并不准确 死区设计为1-2步没有意义 甚至影响了系统精度

  3. 积分抗饱和: 还在 采用最简单的根据输出量进行分离 以及限幅 (实际上因为整数计算 许多步骤都会考虑限幅) 其实意义不算太大 因为积分系数是很小的 

  4. 不完全微分: 取消 没有效果 因为传感器信号并不是有噪声 相反是本身已经被过分滤波了 我在实测中 没有遇到一次突兀的噪声点 

  5. 大多数优化措施没有正面效果 相反 因为引入更多的非线性 在这个响应速度极高 本身信号又被污染的系统 带来的收益是负的

  6. Kp 假如开环的等效Kp是1的话 我测试下来 这里不能使用超过1的Kp 否则震荡是必然的 没震只是MCU还没睡醒 一般合适的Kp只能在0.1以下 0.2已经有点暴躁的迹象了 这导致PID算法的动态刚性只有开环的1/10 .....网上看到的扭电机看它恢复角度 有时候是种不得已 因为系统环路太复杂了 而对比之下 开环系统的磁链反馈几乎是及时性的 就这样也不能避免小的震荡

  7. Ti 需要很大 远比我在上面的各种理论分析和仿真要大得多 否则极可能导致震荡 我曾经想计算一个伯德图出来  但是看到传感器那复杂的动态曲线 已经觉得其他部件的相位延迟没有必要考虑太多了 Ti应该至少覆盖传感器带来的延迟 目前我这里测试下来 Ti应该是100个采样周期才能比较稳定(6-7ms) 50个的话 有震荡的迹象 实际上如果要消除过冲 Ti会需要更大 Ti的主要作用的提供很高的静态刚性 实测下来静态精度开环要高不少 数据看误差几乎都是0

  8. Td 对抑制震荡有一些好处 但是实测下来 影响并不明显 大概因为传感器延迟复杂 并不能在及时抑制有多少作用 而且会参数莫名奇妙的问题(下面有叙述) 主要作用是抑制较慢速度的过冲

  9. PID的响应时间是可以感觉到的 用手给它乱加力 用力大的话 会感觉到它拼命甚至颤抖的样子(应该是Ti的作用) 但是又比我预想的高速很多  可以说 用力不大的话 感觉不到它是在你加力时候 才从0开始加力对抗的 仿佛已经有抗力存在在那

  10. PID的主要好处是耗电极低 在静态时候几乎没有电流消耗  我本来打算在静态时候加个电流进行锁定的 现在放弃了 (但是可能在下一个混合算法实现) 这是骨子里对省电的执着吧 (比方说 有些半电流的电路 都是国人后加的 原始应用样例是没有的) ... 毕竟开环下 就算1/6满电流 发热也很大 而满电流 没多久就会到50度以上 让我不敢继续下去 .... 因此 这样纯PID的算法 是需要的

.......... TD ................

TD可以抑制过冲 然而 图形有点怪异

pid-td-error.png

从图中看出 一开始TD=25时候 因为马达惯性 存在过冲 (此时Ki为0 不是由于积分引起) 于是我设置TD=50 从图上看出 过冲似乎被抑制住了 马达甚至没到达0位就停了下来 但是此时却反而出现了一个向上的平台 我分析认为 这是传感器输出问题导致的

从图上看 每个位置转折处 都有平台 不符合物理实际 从物理上说 这些地方应该是连续光滑的 可以自己脑补个正弦波形补上

从理论上说 TD可以随意增大来抑制过冲 然而实际上 这是不可能的 因为TD会放大各种噪声 非线性 传感器的错误等等  比方说 当TD为100时候 

pid-td-error2.png

所以 需要先确定系统的稳定局限在哪 从测试看 本系统的TD不宜超过50 如果仍然需要抑制过冲 只能减少Kp和Ki了

同时 TD也不能太小 太小等于系统缺乏阻尼 尤其是我现在马达并没有负载 实测TD为0  一样引起震荡 TD应该取10以上

从测试发现  过冲是基本存在的 所以TD往大里取  又不能太大 就定下来40吧

............. TI ....................

KP既然只合适取0.1左右 那么 就TI决定了最大的刚性多久能到达 这就需要在过冲和响应速度之间衡量了 此外 TD太小 没有覆盖系统总体延时 也会带来震荡 此处最需考虑的是传感器的延时 实测TD=30时候 等效时间1.9ms 系统正好不会震荡 所以 更安全的值 应该在TI=50以上

pid-ti-error.png

测试下来 TI=300的时候 到381*3*64us=73ms处还未到达精度 而TI=160 已经差不多可以达到精度 虽然TI=100时候 只需要40ms 但是过冲偏大  所以TI缺省值我会设为160  和TD=40缺省值正好4倍  像ZN整定致敬

 ............. KF....................

这个参数就有点尴尬了 在系统TD受限严重 本身无法避免过冲的时候 虽然KF=0时候 可以变为纯粹的微分先行  能减少输入变化带来的过冲 但是设为0恐怕会影响对输入响应的速度 这点在这个测试中不一定看得出来(被系统本身的过冲掩盖)  pid-kf-error.png

就以上参数 目前测试下来

  1. 稳定性: 稳定 没有震荡 用手施加扭矩 基本没有松动感 略微有反馈

  2. 计算负担(主循环速度): 空闲时 93次/ms 算法启动后 49次/ms 加上RS485满速率工作 38次/ms 

  3. 最高也是17转每秒

  4. 静态和跟踪测试如下图

pid-trace-error.png

当动态跟踪的时候 KF似乎有较大影响 尤其是听觉上  当KF=1.0时候 听起来马达有沙沙的声音 这应该是放大了指令流的存在 这时候跟踪误差也比KF=0要大  似乎 KF=0应该设为缺省值 就是完全微分先行 这时候没有指令流的声音 听起来很安静 ... 实测当KF为0.2 声音也几乎听不到 0.3时候  声音有点明显 算了 设为0.2吧

静态的跟踪就显然是细微误差不断积累 不断纠正的过程 这个周期很长 但是精度很高 (但我认为这个得靠传感器精度 在轻负载时候 精度还是得看开环的 毕竟传感器本身 就是在无负载下通过开环校正的)

至此 基本PID算法定型了

引用
评论
2
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
m24h作者
11个月28天前 修改于 11个月28天前 IP:上海
927404

尝试过多种其他算法 包括帖子中想到的种种 以及带前馈的做法 但是效果都不好 (这是我感到研究和实践差别最大的项目了) 目前不带反馈的 就半开环算法 带反馈的 实践稳定性和效率最佳还是FOC/PID

此外由于没有应用方向 个人也兴趣减退 目前高级运动命令(仿klipper MCU命令)和采样学习功能 虽然协议已经有所包括 但是我没实现 仅实现了管理功能 和两种步进命令 

所以  项目先告一段落  并上传开源(在首文) 除非等我需要步进控制 比如做个FDM打印机什么的 再继续吧

个人觉得就程序框架和风格而言  我的代码应该是易懂易改的 屎山很低 而且包括了许多测试功能 甚至还有一个小shell 很合适大家在此基础修改使用 且无须告知 

引用
评论
3
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
m24h
进士 学者 机友
文章
52
回复
895
学术分
1
2020/01/22注册,6分5秒前活动

个人开源项目: XXXXXXXXXXXXXX

主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:上海
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}