闭环步进电机驱动
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


[修改于 1年1个月前 - 2023/12/01 23:55:07]

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

终于把普通开环驱动的情况下的仿真做好了 当然 也是因为理想化和简化的 什么齿槽转矩 磁阻转矩都不考虑 就当一个理想50极200步的步进电机 通过一个弹性联轴器 模5的滚珠丝杆 连上一个20公斤的质量块 只考虑摩擦力阻尼 不考虑与润滑油之类相关的与速度有关的阻尼 仿真了在整步内进行45度转动的情况 此时并无铣雕负荷

motor.png

test.png

对比了有细分和没细分的结果 显然没有细分 电机发生比较严重的震荡 第一个曲线是电机位置(度数 黑色)和滑块折算的度数(绿色) 虽然最后也停在了0.9度 但是看第三个曲线的误差图 有0.5度的震荡 第二个曲线是扭矩变化

normal-non-subdivided.png

有细分(16细分)之后 明显精度提高了 误差只有0.1度 折算到滑块上 仅仅是1.4um 也就是不到一个细分步

normal-subdivided.png

6
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
RodTech
1年2个月前 IP:英国
925916
引用amo发表于18楼的内容
这个ID有点印象……难怪睚眦必报

是你的文化低的吓人,还喜欢指点人,并不是我暇疵必报,在你身上报复我可获取不了任何满足感。被怼得没话说就开始攻击我瑕疵必报是没意义的,可以捂着脸反思。

6
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
RodTech
1年2个月前 IP:美国
926023
引用amo发表于23楼的内容
步距角误差,那肯定是对于主贴提到的开环工况的。大概只有那种杠精才会拿这个说事。

不用尝试这么喊我杠精找回面子,丢光了就是丢光了捂着脸去谷歌学习就完了。

你见过谁开环步进折腾pid和rs485的。


步距角误差也不是你这么意淫出来煞有介事一个公式,稍微谷歌一下就知道你连概念都理解错了。


实在是不懂英语,这个问题百度文库一样有

XXXXXXXXXXXXXXXXXXXX/view/61fc494b346baf1ffc4ffe4733687e21af45fff5?_wkts_=1696718421663


至于所谓的加减速机,时间换精度,这种拍脑袋想当然的事情,不考虑成本的情况下,花高性能光编伺服的10倍价格买个无回差谐波减速机的精度我还真测过,比这个驱动轴自带的磁编伺服性能还要差一个量级。

IMG_3033.jpeg IMG_3256.jpeg IMG_3351.jpeg IMG_3234.jpeg


还是那句话,自己跟不上时代就不要到处装逼捏造公式和结论来误导别人,戳穿了就开始说人是杠精。

5
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
RodTech
1年3个月前 IP:美国
925687

磁编码器 虽然分辨率不低 一圈其实很不线性的,不能指望他代替真的光编。实际上还不如开环细分。。。再加上为了体验好,调参功能简化阉割,没有滤波器,多个轴惯量不一样延时也不一样 铣个圆都是奇形怪状的。不如坚守开环步进。。。


引用
评论
2
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
m24h作者
1年3个月前 IP:上海
925688
引用RodTech发表于1楼的内容
磁编码器 虽然分辨率不低 一圈其实很不线性的,不能指望他代替真的光编。实际上还不如开环细分。。。再加...

我也是是顾虑这点啊 foc比较软 铣方成圆我是有听说的 不过磁编码降级(14bit降12bit 听说内部ADC有18bit)再校正应该也算可以 。。。主要是闲的 早点东西研究一下

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
量子隧道
1年3个月前 修改于 1年3个月前 IP:广东
925702

可以用分辨率低的光学编码器,一圈一两千甚至只有600个脉冲的,比起伺服电机的动辄上万线虽然少了点,但是好在只有IQ相位,没有总线协议,对于只想聚焦精力在摆弄算法的DIYer来说挺友好。一两千分辨力看起来不多,其实带丝杠的话一圈走个2-4mm,也能分辨到1,2个微米,够了。所以,我就把我的汇川编码器卸了换了个某宝1000线的😝

不过,步进电机一圈驱动相位要走200个循环,这么分下来一个周期里只分配到了5个脉冲,太少,相位精度不行。可能1000线不太够。驱动步进还是要线数多点的。4000可能够了。

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
m24h作者
1年3个月前 IP:上海
925703
引用量子隧道发表于3楼的内容
可以用分辨率低的光学编码器,一圈一两千甚至只有600个脉冲的,比起伺服电机的动辄上万线虽然少了点,但...

I2C或者mt6701的SSI都很容易啊 尤其前者我已经写过软实现 后者几乎可以用几M速率查询 mt6701ACD也可以直接输出1000脉冲的ABZ信号 而且不到10元 关键是轻薄好改装啊 我已经被突起的电机撞过好多次了

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
量子隧道
1年3个月前 修改于 1年3个月前 IP:广东
925704
引用m24h发表于4楼的内容
I2C或者mt6701的SSI都很容易啊 尤其前者我已经写过软实现 后者几乎可以用几M速率查询 mt...

前边XN说的磁编码器线性的问题还是要重视起来。我觉得磁编码器线性不佳和易受干扰,带来的最大的问题是相位不准。而相位不准问题在普通伺服电机上只会扩大1,2,3倍,因为伺服的电相位一圈360或720度,而步进的电相位一圈是200*360度,相位不准会被扩大200倍。。。很可能你以为可以以某相位提前角驱动,实际的相位早不知跑哪去了,严重的话倒拖都有可能。。。

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
m24h作者
1年3个月前 IP:上海
925705
引用量子隧道发表于5楼的内容
前边XN说的磁编码器线性的问题还是要重视起来。我觉得磁编码器线性不佳和易受干扰,带来的最大的问题是相...

我这还是步进电机啊 不是伺服电机  ...

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
m24h作者
1年3个月前 IP:上海
925706

终于把普通开环驱动的情况下的仿真做好了 当然 也是因为理想化和简化的 什么齿槽转矩 磁阻转矩都不考虑 就当一个理想50极200步的步进电机 通过一个弹性联轴器 模5的滚珠丝杆 连上一个20公斤的质量块 只考虑摩擦力阻尼 不考虑与润滑油之类相关的与速度有关的阻尼 仿真了在整步内进行45度转动的情况 此时并无铣雕负荷

motor.png

test.png

对比了有细分和没细分的结果 显然没有细分 电机发生比较严重的震荡 第一个曲线是电机位置(度数 黑色)和滑块折算的度数(绿色) 虽然最后也停在了0.9度 但是看第三个曲线的误差图 有0.5度的震荡 第二个曲线是扭矩变化

normal-non-subdivided.png

有细分(16细分)之后 明显精度提高了 误差只有0.1度 折算到滑块上 仅仅是1.4um 也就是不到一个细分步

normal-subdivided.png

引用
评论
6
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
量子隧道
1年3个月前 IP:广东
925707

哦,原来是专业人士,那大佬您随意😀。不过,我觉得在步进上相位测量的误差会被放大50倍我觉得是这样的(前边说200倍,我错了,是50倍),不管是FOC驱动还是什么别的驱动,测量的相位误差应该会带来驱动相位的误差,而误差放大50倍导致驱动相位的误差放大50倍,这个我想应该是成立的。而磁编码器的相位不太准,容易被干扰这也是成立的

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
m24h作者
1年3个月前 IP:上海
925709
引用量子隧道发表于8楼的内容
哦,原来是专业人士,那大佬您随意😀。不过,我觉得在步进上相位测量的误差会被放大50倍我觉得是这样的...

我并非电机专业人士 只是想动手顺便学习 但是我还是不理解你误差放大的说法 我觉得这个误差是不会被积累的 而且是可以满足我精度要求的

虽然磁编码我也是头回 但是参考过网上其他人的经验 觉得是有可行性的 如果只是用于3D打印的场景 我觉得应该没有问题 毕竟成品和使用者都众多 我现在研究的只是在铣雕上的使用 

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
m24h作者
1年3个月前 IP:上海
925712

修改了模型 加入铣雕仿真 思路是碰到没有铣过的地方 则会遇到一个短程的较高刚性的阻力 如果该地方铣过 则没有阻力 模型过于简单 只是作为一种反应负荷轻重的定性和对比实验

结果仍然是有细分的时候会好很多 甚至当我参数设置到让无细分的过程崩溃溢出 有细分的仍然稳如狗 这当然也和我的模型有关 当缓缓铣进的时候 即便是高刚  也是具备弹性的 抗力就低 没有达到动力崩溃点 和无负荷竟然区别不大

motor.png normal-non-subdivided-heavy.png normal-subdivided-heavy.png


引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
3DA502
1年3个月前 IP:河南
925722

细分和闭环不冲突,细分是个理想,打哪指哪里,实际上根本跑不到正确位置,

简单设想一下,外部阻力变化了,你这固定电流固定细分扭矩要怎么应对呢,步进电机的巨大齿槽力只能保证误差不累加,齿槽之间的细分没有保障,400步的细分到800还行,再细分到1600就没步长精度的意义了

这个误差比磁场编码大多了,TLE5012就我测试情况看,非线性看不出来。

还有,那种用4个模拟输出的霍尔+单片机ADC做的磁编效果都很惊人。

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
m24h作者
1年3个月前 IP:上海
925737
引用3DA502发表于11楼的内容
细分和闭环不冲突,细分是个理想,打哪指哪里,实际上根本跑不到正确位置,简单设想一下,外部阻力变化了,...

有人做过测试 即使到16倍细分 位置精度是有保障的 

IMG_20230930_190545.jpg

当然在有强大外部阻力的情况下 位置必然有偏移 以产生扭矩来对抗外力 理想情况下 扭矩是最大扭矩的sin(偏移角度)倍 比如细分8倍 总1600步时 偏差一个细分位 有最大扭矩的0.2倍 这已经足够在一般用57电机的民用机床上造成500N以上的推力了 接近50kg产生的重力 一般人健身房还很难推出这个力度呢

这里得提醒 齿槽力一般专业指另一个概念 可以参考磁槽转矩 主要力矩应该称电磁力比较合理

磁场编码器其实网上也有测试结果 我看下来同意你的观点 精度应该问题不大

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
m24h作者
1年3个月前 IP:上海
925739

今天看了几套网上闭环开源方案在PID方面的源代码 总结下来是

  1. 最早期的代码直接单环位置控制

  2. 有的有位置控制和速度控制 但是并不形成双环 只是可以配置电机用在哪种场景

  3. 有的是把位置误差和速度误差直接相加 然后做单环PID

  4. 比较复杂的方案是位置差距较远时 双环位置速度控制 但是接近目标时切换到单环位置控制(但如果跟不上造成位置偏差大就是失败 跟上了又等于纯粹单环了 。。。感觉双环只在救失步时候用上)

  5. 面对复杂情况 有使用保守的 主要只用Kp的 有做了自整定的 还有及时重置控制参数的

可见闭环步进如果需要用到复杂场景上也并不容易 纯粹搬伺服电机的控制理论并不适用 虽然“用恰当的速度到达恰当的地方”听起来不错 但就现在一般运动控制器和步进电机的协议而言 还缺了“恰当的时间点”和“恰当的前瞻”的信息

算法的事情还需要考虑 但是忍不住布局了硬件规划

  1. MCU用AIR001 引脚恰恰够

  2. 驱动用A4950或兼容的

  3. 磁编码器用MT6701 

  4. 输入使用MCU的正交编码器 目前网上没有用STM32正交编码器 纯硬件计数“方向”“脉冲”的方案 因为那不是正交编码 但我想到了个绝妙的主意 利用STM32定时器异或功能先异或“方向”和“脉冲” 然后使用输入过滤器进行延时 延时后的信号和“方向”“脉冲”任一方就变成正交编码了 只是一次计数两倍

  5. 使用串口进行设置 不用什么按钮和OLED 并且尽量就不需要设置

引用
评论
4
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
m24h作者
1年3个月前 IP:上海
925798

今天修改了一些模型 重构了流程图 并比较了在同一种电机/机械系统/铣雕任务下 非细分细分和位置单环PID的效果

flow2.png

直接驱动效果如下 (第三个曲线是电机相电流)

dir-2.png

细分的效果如下

div8-2.png

位置单环PID(为省麻烦在连续域下做)效果如下

pid-2b.png

不得不说 参数调好的PID效果是惊人的 无震荡 快速到位 然而参数的校调并不容易 Kp要小于直接驱动时候等效的"转矩/夹角"比是关键的方法 其他参数也需要比较保守 不然甚至会产生激烈震荡的电机电流(在不停地纠正) 然而在非连续域可能会有别的结果

pid-2.png

其实直接开环驱动 也类似没有Ki/Kd的PID 而且Kp的线性关系 变成了正弦关系 于是我试着使用满电流的1/8去做开环驱动 也得到了近似无震荡的效果

dir-2b.png

但是显然 因为电流太小 并不合适实际应用 (而PID因为有积分项 遇到大阻力可以逐渐提高电流) 不过我想起Trinamic公司的几个开环驱动 也能做到类似静音之类的效果 我猜想大抵也和开环时候的电流控制有关 比如电流慢慢到位? 

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

今天有空 把双环PID也仿真了 说实在的 双环和单环 其实在数学上几乎就是等价的  因为位置是速度的积分  所以速度环的P 其实就是位置环的D 速度环的I 其实就是位置环的P 多出来的速度环的D 其实非常不好用 数值稍大 系统就不稳定了 ... 效果如下图 和单环PID区别不大 略增加速度环的D 会导致颤抖 再增加 就直接飞了

pid-p-pid-v.png

今天顺便仿真了滑膜控制 说起来 在这个场景中 滑膜控制有点类似PD无I的算法 但是其中的P变成了非线性 然后有一定收敛的条件 最传统的趋近律就是基于符号函数的 说白了就是相当非常大的Kp 特点就是拼命 然后抖 通过使用更平滑的趋近律 以及引入速度参量 使得它尽量不那么抖 下面就是仿真结果 可见及其迅猛 就是有点扑楞 (有意思的是 机械系统的滑块的质量平滑了抖动 但是可以预期的是 电机这时候应该在啸叫)

smc.png

话说纯粹步进电机本身 等于用了一个sin的趋近律 如果加上速度分量呢 效果竟然非常令人满意啊

smc-sin.png

这给出了一种变形的控制可能 就是在传统的步进电机基础上 假如不考虑最大效率(电磁力矩始终垂直磁链轴) 只需要根据速度差 来控制步进电机电流 就可以很好地改善振动 我似乎也听过什么xxxstep 没准就是这样实现的

基本上已经打消了使用FOC算法的设计 感觉确实不合适在铣雕这样的复杂高速场景 也平息了寻找更好的算法的想法  在大电流和相电感较大的情况下 所有可能需要大电流变换 甚至需要短时间剧烈更改电流方向的 都不可行 必然事实上虽然没有失步 但是仍然会造成跟不上复杂运动的误差 只有电机本身的sin趋近律最合适 只能在这基础上变化

然后 现在思考是否可以尽量减少电机引线 常规的高速光耦方案至少需要4根线 如果使用rs485可以减为两根 甚至可以4个电机并2根 需要2 byte 可惜就需要修改运动控制器 还有是通过10M以上的载波接到电源线上 但是没有廉价的芯片方案 MBus不合适这样的电流 带宽也太窄

附上现在用的电机模型 已经考虑了相电流不能突变的限制

motor2.png

引用
评论
3
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
amo
1年2个月前 IP:广东
925901
引用m24h发表于15楼的内容
今天有空 把双环PID也仿真了 说实在的 双环和单环 其实在数学上几乎就是等价的  因为位置是速度的...

数据传输和算法没啥关系,不易过多分散精力。近距离场景下,RS485速度超过1Mbps没问题(受限于隔离光耦速率。如果改为成本稍高的磁隔离器,速率还可以高很多倍),不存在瓶颈。只要软件协议合理分配时隙,可以做到位置同步时序确定,中间自由插入其他控制、查询指令。

另外,普通低成本步进电机,用于高精度场合貌似不合适。以前咨询过几个厂家,都说步距角精度5%……以常见1.8度步进为例,任意一个角度N,实际位置是N±(1.8*5%)=N±0.09度。需要用的话,可能得考虑加减速机构,时间换精度。


引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
RodTech
1年2个月前 IP:英国
925909
引用amo发表于16楼的内容
数据传输和算法没啥关系,不易过多分散精力。近距离场景下,RS485速度超过1Mbps没问题(受限于隔...

不懂就不要瞎指导人。

运动控制想便宜就canopen cia402,485多轴发编码器只存在于臆想中。

想多轴同步,算法还真就要自己写,最重要就是这个,并不能拍拍脑袋觉得发个485指令让执行器去哪就完事。知道什么光隔离磁隔离跑多快这种谷歌一下就知道的毫无技术含量信息对楼主毫无帮助。


步距角5%造成的误差也不是你想象的那么计算。楼主用的闭环方案,管你什么步距角精度,全由编码器精度决定,跟本不需要管。


给步进加减速机 换取的不是时间换精度,而是用人民币换脑袋里的水。步进的行星减速机,就算齿轮没有齿距误差,可以查查有多大回差。要想没有回差,可以查查谐波或摆线针轮减速机多少钱,是直接买一个进口伺服的多少倍。

引用
评论
1
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
amo
1年2个月前 IP:广东
925910
引用RodTech发表于17楼的内容
不懂就不要瞎指导人。运动控制想便宜就canopen cia402,485多轴发编码器只存在于臆想中。...

这个ID有点印象……难怪睚眦必报

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

都是有兴趣的人 说得都有道理 何必吵架呢

精度确实是由编码器决定的 而编码器的主要误差是中心定位带来的 这个可以通过矫正得到 而电机误差主要来源于齿槽转矩 这个也是可以矫正的

通常校正的算法是让电机左转一圈 右转一圈 取编码器位置和电角度的误差 左转右转取平均 可以消除采样时间误差和转速带来的影响 然后滤波 其中低频成分 一圈有一个大起伏 就是编码器的中心误差 而其中的高频 频率与电机极数一样 就是齿槽误差 去除就好 这样校正之后 至少已经超过民用要求了

即便不矫正 正常装配下 千分之一圈的误差 折射到机械输出端 也就几个微米 民用足够了

RS485的速率也是够的 民用的距离 2MHz是没有问题的(Sony镜头接口也是串口 一般是1.5MHz 据说新机身新镜头是3MHz)这时候折算到字节 已经200kHz了 MCU其实已经得飞起来了

代价也很低 串口是MCU都有的 无论高速光耦(其实用光耦已经和RS485无关了 就是纯UART)还是接口芯片(比如Max3485)都2块钱可以买到

不同应用场景是有不同需要的 一般工业用的标准和协议 并不合适民用要求 所以需要自己写接口的 最简单的协议我设想过 只需要一个字节

1个前导位 表明是轴信号 还是辅助指令

3位数 表明给哪个轴

3位数 表明指令需要后移多少时隙 与其他轴同步

1位数 表明前进 后退

辅助指令可以包括上电 下电 定期宣告每轴总步进数进行校正等等 并不对时间要求太严格的 可以插在空闲时隙里

大概工业会复杂很多 考虑反馈 告警等等 但是民用需要简单

可惜我现在运动控制器用得舒服 配套上位机软件功能也很好 大抵不会自己再去实现一套 如果是3D打印倒好 反正都开源 修改一下输出方法并不难 UART接收比较麻烦 硬件处理为佳 但是只发送 软件实现很简单 不怕控制器UART口不够用

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
RodTech
1年2个月前 IP:英国
925916
引用amo发表于18楼的内容
这个ID有点印象……难怪睚眦必报

是你的文化低的吓人,还喜欢指点人,并不是我暇疵必报,在你身上报复我可获取不了任何满足感。被怼得没话说就开始攻击我瑕疵必报是没意义的,可以捂着脸反思。

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

昨晚上把电路图和PCB都设计好了 用的是嘉立创的EDA 不得不说 因为太多库元件的加成 感觉比KiCAD还快多了 除了AIR001的资料它没有需要自己加 (但是它居然自动给我匹配了正确的TSSOP20封装 非常奇怪 就因为20个引脚么) 确实省了好多麻烦 而且领到了券 下了单 免费5张 这也是我不愿自己做板的原因  因为有可能一用就要3-4张

其实大概也就是验证 不会取代我的旧系统 所以做成42电机的规格 而且电路设计 和其他用STM32F030的开源设计区别不大 可能有区别的话 是我比其他人喜欢省料吧😊 没有用晶振 全靠MCU的校正数据来获得准确主频 也没有设计光耦接口的恒流电路 在下单前最后一刻才加的LDO 但是其实是打算短路直接用开关稳压3.3V的 (但是有些国产MCU抗干扰能力很差 所以以防万一) 

不过PWM输出电流基准采用了2阶RC滤波(有些方案才1阶) 也仿真过了 电机最多每秒10转 乘上磁极数就最多500Hz  而48M主频 256级或512级输出 频率会是100-200kHz 仿真下来有-70dB衰减 应该够用 我的数据设计得比较保守 有些方案虽然只用了一阶 其实它的转折频率点更低 (但降低了反应速度) 也可以得到不错的衰减效果

有意思的是引脚的选用 首先不多不少 其次接口虽然采用了传统的光耦 但是其中有USART2_RX 可以单用一个光耦跑一个只收的协议 (TX也在 但是电路没有给它输出的线路) 此外 还把TIM3划分到了编码器接口 这样可以直接使用MT6701AK/AC系列的ABZ信号 没有使用硬I2C 因为手册上说只支持400kHz的 软件实现还更快 也推荐几十ns级别的MT6701的SSI接口 电路设计上还考虑了和AS5600兼容

估计电路板会先到(据说3天) 很多元件可能假期后采购 不过可以先把MCU焊上去调试个框架出来 假期过后可能就慢更了 毕竟写程序也要花时间 


sch.png

pcb.png

匆忙之间 没注意PCB地线形成个大环路 应该到手切一下

。。。。。。。

发现 网上居然有更省料的 没有DC/DC 由3D打印机板供5V电 没有光耦 大概在小3D打印机问题不大

引用
评论(2)
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
量子隧道
1年2个月前 IP:广东
925935

等板子的时候不妨先做个实验,用步进驱动器开环驱动步进电机走200*2^N步,每一步从磁编码器读出角度,和驱动给出的预期角度做个差,画个图表。借此了解一下磁编码器的误差,以及可能的矫正公式。或许可以把这个实验做进你的软件的启动自检步骤里。

引用
评论(1)
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
amo
1年2个月前 IP:广东
925985
引用m24h发表于19楼的内容
都是有兴趣的人 说得都有道理 何必吵架呢精度确实是由编码器决定的 而编码器的主要误差是中心定位带来的...

步距角误差,那肯定是对于主贴提到的开环工况的。大概只有那种杠精才会拿这个说事。


引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
RodTech
1年2个月前 IP:美国
926023
引用amo发表于23楼的内容
步距角误差,那肯定是对于主贴提到的开环工况的。大概只有那种杠精才会拿这个说事。

不用尝试这么喊我杠精找回面子,丢光了就是丢光了捂着脸去谷歌学习就完了。

你见过谁开环步进折腾pid和rs485的。


步距角误差也不是你这么意淫出来煞有介事一个公式,稍微谷歌一下就知道你连概念都理解错了。


实在是不懂英语,这个问题百度文库一样有

XXXXXXXXXXXXXXXXXXXX/view/61fc494b346baf1ffc4ffe4733687e21af45fff5?_wkts_=1696718421663


至于所谓的加减速机,时间换精度,这种拍脑袋想当然的事情,不考虑成本的情况下,花高性能光编伺服的10倍价格买个无回差谐波减速机的精度我还真测过,比这个驱动轴自带的磁编伺服性能还要差一个量级。

IMG_3033.jpeg IMG_3256.jpeg IMG_3351.jpeg IMG_3234.jpeg


还是那句话,自己跟不上时代就不要到处装逼捏造公式和结论来误导别人,戳穿了就开始说人是杠精。

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

板子已到 也焊了个半成 就等螺丝钉好装配到电机上了

fotor_1697109180590.jpg

设计太匆忙 还有很多硬件缺陷 比如用DC/DC毫无必要 实在是误把A4950的电流算进去了 其实用78M05就可以了 电流取样电阻也不是0.1欧 那是57用的参数 也可以使用封装小点的 就不用把A4950放到背部去了 也不该使用通孔插座 全SMD 这样板子就可以贴住电机背 不用考虑使用垫片抬高了 一个大电容也应该分成两个的 甚至反正不打算跟别人抢市场 就该直接只用串口的

先用这个开发程序和实验吧 弄好了再重新设计电路

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

已经写好能让电机开环运转和读取磁编码器数据的代码 并进行了数据采集和分析

目前实验的是最便宜的AS5600 这玩意其实不合适用在闭环驱动里 原因主要不是它精度比MT6701少两位 而是它慢 非常慢  采样和稳定时间都是最快次毫秒级 而我预期的计算周期仅仅是几十微秒 但是它价格只有MT6701的几分之一 慢速低精度非FOC控制的可以用它

径向充磁的磁块我没有粘好 只是靠磁性吸附在电机上 很偏心 再加上AS5600的焊接装配也有误差 我曾想考虑这两个偏心的相对运动模型 但是感觉好难 有点三体的感觉 ..... 此外 我买的磁性不行 AS5600状态认为磁场太弱 我把磁块直接抵在芯片上也不行 还是被认为是个弱鸡磁块 不过还是有角度信息 

IMG_20231014_014558.jpg

我配置AS5600 关闭回滞 所有滤波降噪参数打到最低 让它工作在最快最不可靠的状态

再让电机以16细分方式工作 一圈分为3200步 每10毫秒前进一步 并采集磁编码器的结果 并对存下的3200点对应数据进行分析 结论如下:

  1. 如此低廉的芯片 恶劣的装配 弱鸡的磁块 几乎没有的滤波降噪 总误差在正负1.5度内 见下图左上

  2. 进行移动平均滤除高频误差 明显最大的误差来自编码器 但是并非噪声 而是重现性的 可校正的规律信号 估计主要来自偏心装配 (右上图) 说明装配后的校正必不可少 校正将提高闭环精度

  3. 剔除编码器误差后 剩下的误差在0.15度内 (左中图)  取其中512点分析其频谱 主要误差波长在512/32=16 除此之外 其他中频误差少到可以忽略 (右中图) 放大看明显主要是电机齿槽转矩带来的 (左下图) 其实这也是重现性的 可以校正的 校正可以提高开环的精度 

  4. 其他误差 如电流精度 (我使用8bit PWM) 数学运算精度(三角函数使用整数化的查表法) 驱动精度等等 都几乎无法与上面分析的误差相比 完全可以忽略


error.png

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
RodTech
1年2个月前 IP:英国
926235
引用m24h发表于26楼的内容
已经写好能让电机开环运转和读取磁编码器数据的代码 并进行了数据采集和分析目前实验的是最便宜的AS56...

步进太密了,Cogging越补越离谱,那种极数很少的无刷才适合补。。。整一个光编的二手伺服怼在轴上,一个个出厂给磁编校准,不知道温飘大不大,应该有所改良

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
m24h作者
1年2个月前 IP:上海
926237
引用RodTech发表于27楼的内容
步进太密了,Cogging越补越离谱,那种极数很少的无刷才适合补。。。整一个光编的二手伺服怼在轴上,...

0.15度 补不补其实问题不大 但是如果记录下来进行补偿 能简单提高一些开环精度 如果闭环 考虑进运动模型里面 可能也能提供一些信息 光编就是贵了麻烦了个头大了 现在很多厂出来都是用磁编了 我感觉就象薄膜键盘取代机械键盘一样

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
RodTech
1年2个月前 IP:英国
926238
引用m24h发表于28楼的内容
0.15度 补不补其实问题不大 但是如果记录下来进行补偿 能简单提高一些开环精度 如果闭环 考虑进运...

雷塞的高性能系列还在用尼康光编,别的大厂也没有磁编,取代是取代不了的,填补一下不需要精度的场合

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
m24h作者
1年2个月前 IP:上海
926239
引用RodTech发表于29楼的内容
雷塞的高性能系列还在用尼康光编,别的大厂也没有磁编,取代是取代不了的,填补一下不需要精度的场合

最近刷短视频 都能刷到这个 

我觉得取代是必然的 首先要知道 大多数的精度其实是实际上不需要的 大多数编码器也就用200线到1000线 对于大多数用户而言 光编是水桶里面太长的一块板 这一填补 可能就是90%上的

而且真要精度的地方 高精度编码器就不放在电机里头 而是放在最终端 电机里面的编码器 只需要对本电机磁链驱动提供依据 并满足实用精度 比方说误差比传动机构中的弹性挠性小就足够了

其次光编也有其缺点 毕竟是机械结构 体积也大 怕震动怕灰尘 要知道 即使传统“栅”类型的编码器 本身也有用磁的 用电容栅的 也是通过线性模拟量来传感的

Screenshot_2023-10-14-10-01-05-406_com.tencent.mm-edit.jpg

IMG_20231014_101003.jpg

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
RodTech
1年2个月前 IP:美国
926240
引用m24h发表于30楼的内容
最近刷短视频 都能刷到这个 我觉得取代是必然的 首先要知道 大多数的精度其实是实际上不需要的 大多数...

许多机床没有光栅尺 全靠光编


其实光编也有便宜的方案 不一定要像雷塞那样塞个尼康的密封编码器进去。。


某型带刹车伺服,配的海德汉光编。

IMG_6129.jpeg


某型美国产廉价一体伺服,面向机械爱好者定位,著名的tormach铣床用的就是他家的。低分辨率光编

D1485A49-B49B-4DA8-8A4F-837C09843C96.jpeg

可谓便宜到了极限了。


磁编转角不线性,会产生抖动进而浪费可用扭矩,大幅度损失刚性才能消抖,淘宝买的几个磁编伺服都有这毛病。。

引用
评论
1
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
m24h作者
1年2个月前 修改于 1年2个月前 IP:上海
926241
引用RodTech发表于31楼的内容
许多机床没有光栅尺 全靠光编其实光编也有便宜的方案 不一定要像雷塞那样塞个尼康的密封编码器进去。。某...

非线性是可以校准的 校准是磁编的一个问题 不能买来就用 如果是磁编直接当光编使用 沿用以往的算法 肯定不行啊 厂家手册里面都给出了非线性度 但是那都是轴对得非常准得情况 而且抖动的另一个可能是时间误差 光编几乎是立即响应 磁编里面需要采样时间 有滤波等计算 就会出现线性系统遇到容性滞后没有超前补偿的不稳定状态 实际上 开源的闭环驱动算法里面都有这个超前角补偿的 (有意思的是 我看到一段开源代码 直言这个地方是抄的 只知道用起来好 有种"屎山勿移 易崩塌"的感觉)

前面计算的电机误差看起来有点复杂(左上图) 但是其实是重复的 而且数据中充满了因为磁编的量化误差 所以我把它进行了分组平均 每个数据和所有增加1.8度的整数倍的数据平均  因为16细分 所以得到16点平均后的数据 (右上图) 看起来齿槽转矩的样子就准确多了  这是最终用来校正开环电流的数据 (实际上 处理完数据后 我才觉得 似乎用64点间隔 整个单极的一圈 才对 不过基本相差不大)

剩下的残差和其频谱(左下右下图) 表示 基本洗白了 没法处理了 但是从量级而言 只是比齿槽转矩误差略小 这大概就是系统精度能达到的最理想情况 与磁编量化级带来的误差接近 这大概是主要出于此了

error2.png

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

改版了 这个月还能再薅一次 也下单了 重新设计 PCB尺寸长宽各小了2mm 确定只采用rs485接口 稳压直接用稳压二极管第一次降压 再78l33稳压(用了两套是因为RS485发送时候可能产生较大电流 其实加起来没有比DC-DC省地方或者省钱 但是就赢在直接粗暴) 编码器采用MT6701 然后除了编码器 底板不放任何元件(调试排针非开发不需要上的 而且可以侧焊) 而且各接头考虑了直接焊线的可能 好处是:

  1. 包括电源 只用4根线 可以菊花链式连接(小功率情况下 电源线菊连应该可以) 省去难看难搭的一大堆线(其实想电源线上载波 无奈现在没有便宜的方案 最便宜也要20来块钱 才得200-500kbps)

  2. 可以向上位机传递编码信息 进行动作学习

  3. 一般个人系统距离两米内 即使按光速50%计算 来回一次就30ns 采用1Mbps传输的话 一个信号位1000ns 即使阻抗匹配不到位 影响也不大 而1M已经可以等效100kHz的脉冲频率了 实际20kHz已足够 (而且电机也处理不过来太快的)

  4. 采用译码本设计的话 极限5轴设计 其实一个轴也只有3种命令状态 总共3^5=243种 一个字节就放下 还剩下13种命令字可以用于带外控制 如果常规4轴设计 甚至可以剩下大半的带外带宽

  5. 甚至可以写套Mach3用的dll 再做个运动控制的驱动程序 可以直接驱动4轴系统 而不需要运动控制板 只需要一个TTL串口和转RS485(甚至不需要转RS485将B线拉到稳定电位 比如我的电路可以在B线串个电容到地就行) ... 但怎么看 不如改写halgrbl 用一块很小的ESP32板实现方便


sch.png

pcb.png

3d.png

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

在研究电机误差时候 发现一个怪现象 网上查不到相关的资料 毕竟我不是电机专业 也许有个名称 但是我不知道 强名其曰 "齿槽扭矩反常"

我测量不同驱动电流下的齿槽扭矩 1/8 1/4 1/2 电流下 (满电流1.5A) , 齿槽扭矩大致正常 变化不大 但是到满电流 扭矩居然反转了 (这意味着磁不吸铁了 反而排斥).... 我多次测量 检查数学和程序逻辑 然后确定这个现象存在 稳定复现 .... 然后我想是不是有个平衡点 在0.78倍满电流处找到4相中有一个相达到近乎没有齿槽扭矩的

这个电流是1.17A 虽然我不知道我那2手电机的规格 但是我觉得这个电流可能是个限制 超过这个电流 会不会因为电流磁场导致齿的诸如饱和 局部磁化之类 毕竟步进电机的磁极比较特殊 做成了很小的齿状 ...网上对电机限制电流的解释 多是通过热量 也没有找到与这个现象的关联

motor_error.png

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

新的板子已经焊好(左) 比旧的好看多了 也贴合电机外型 使用了MT6701 原生有14位精度 推荐使用12位精度

v2 vs v1.jpg

换了一个电机 可惜粘磁铁似乎 仍旧不够准和偏心 看来没有一个辅助工具 比方一个套筒 是不行的 靠校正吧 

motor-2.jpg

这里我用了铜嵌螺母加工一下 来作为电路板的抬生垫片 此时磁铁会距离芯片表面 0.7mm左右 这是一个灾难来源

残差怎么是这个样子 两段很明显的问题

err-mt6701-1.png

对比一下AS5600的残差

err-as5600.png

不难发现 AS5600的编码器反而比较准确  关键是线性度比较好 而MT6701的误差曲线居然是5个峰 毫无对称性 出现了大量的非线性

另外一个题外话 新电机的齿槽效应倒比较对称 至少具有明显的180度重复性 不过大电流下的反常依然存在 甚至最大电流时  电机发出了不正常的咔嗒声 显然当反常发生时 电机已经承受不住这样的电流了

回到MT6701 发现其残差上的两段反常 主要来自于正转反转时候的偏差 而且这个偏差完全是芯片的原因 出现在特定的芯片磁角度 0度和180度上 具有滞回的效果 而且此时我采样速度已经非常慢 一圈要10秒 而且这种对方向敏感的东西 完全缺乏静态重复定位的精度

err-mt6701-1a.png

于是我改变了磁铁离芯片的距离 拉远后变成这样

err-mt6701-2.png

直到找到一个适中的距离 这时候误差曲线4个峰 表现较好 剔除齿槽噪声 残差大致符合12位精度

err-mt6701-3.png

可见MT6701对磁场强度 磁铁距离非常敏感 远比AS5600敏感得多 这3种距离 其实相差也就2mm 适中的距离 大致只有0.3mm左右的宽裕度 实际上 这3种情况 MT6701都报告状态是 "磁场适中" 不弱也不强 我注意到AS5600有自动增益控制 并有寄存器可以观看当前的增益 而MT6701没有更多的状态报告 当然 MT6701的速度是AS5600的几十倍(5us 对 150us+0.2ms)

其次不光磁场大小的问题 在0度和180度 即使在适中情况 也能感觉到滞回(和手册的几个LSB的可控制滞回不是一回事)和非线性的存在 这大概是芯片本身的算法缺乏连续性光滑性 或者补偿数据(手册提到了这类数据的存在 但是不可自己修改 也不公开)存在一定的问题 不知道MT6816之类更贵 被普遍采用的芯片如何

我考虑过采用两种方向的补偿表 初始化时电机微动确定初始值 但是这给程序带来太多麻烦 不如保证一个准确的距离 (这根据磁铁会有不同) 接受芯片的bug 降低对它的期待

----------2023-11-3-------------

还发现MT6701另一个BUG

实验中发现 如果电压曾经下降到2V左右 再恢复 这时候MT6701似乎工作正常 但是实际会一直出现很大误差 平时1-2度误差会变大到10度左右 然后除非重新完全掉电 再重新供电 精度才会恢复正常 因为实际上它也没有什么重启的I2C命令 所以我原本代码是恢复供电就恢复运作 只能改成 一旦失电 就不会再运作 除非重新加电

----------2023-11-16--------------

关于MT6701的超前角补偿和磁滞

这两天差点被MT6701弄疯了 测试数据总是不完美 但是总算解决了

原因是CW和CCW的数据相差蛮大

mt6701-problem2.png

当正转时候 数据增长 但是超前增长 反转时候 数据减小  也超前减小 无论是SSI还是I2C读取都一样

有种运动角补偿的意味  但是测试 速度越块 反而补偿越小 速度越慢 反而补偿越大 所以 MT6701也不好意思宣传这个补偿吧

最终设置了4LSB的磁滞回 抵消了这个超前补偿 (原本我以为 这个参数只作用在ABZ PWM之类输出的 SSI得到是裸角度的)

mt6701-problem-HYST-4LSB.png

在研究过程中 有下面这张图

mt6701-problem.png

蓝色线是角度  橘色线是编码器输出 这是没有设置磁滞之前的 设置之后就没再测 (测起来比较复杂)

明显看出 MT6701输出有台阶现象  可能是内部ADC位数不同 或者中间计算精度缺乏导致

在旋转方向改变的时候 有个明显的滞回 然后又超前追赶

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

目前整个软件框架已经搭建完成 各种初始化 校正 驱动和维护代码占用了大半的代码空间 还剩下10k左右 可以用于指令识别和运动控制这些真正的核心功能 也是我犹豫好久 直到现在还在犯选择困难症的地方 

但是不好再拖了 我自己也没有能力弄出一种崭新的控制理论 只能根据要求 选择最合适的框架进行修改 这篇回复也是梳理的过程 可能有误 其实我经常把这里当开发笔记用 项目完成后保存网页就直接当开发记录了

既然要闭环控制 核心算法还是以PID控制为主 

首先确定一点 关于齿槽扭矩 我原先的想法原本是进行简单的补偿 使得输出函数更加线性化 减少执行噪声 目前看来是不可能的了

实际上 在小电流情况下 齿槽扭矩会有强大的非线性误差 其导数绝对值超过1 这意味着用线性方法弥补 反而会越补越差 (这其实从数学上解释了 为什么普通力度的手拧步进电机 其实不可能达到一个精确的位置 如果深究也挺好玩) 实在无法在有限的代码代价和时间代价下完成补偿

虽然不打算校正输出(或许以后再说) 不过通过以上观察 可以确定一点 如果保持一个最小电流的存在 可以减少执行函数的非线性

常规的FOC角度是90度 而电流大小根据PID输出变化 何妨改变一下 当电流需要小到一定程度的时候 以减少磁链夹角来达到同样的效果 从前面的测量看 我决定应该保证最小1/8满电流 其实这时候执行函数其实已经不能保证递增递减性了 理想的是至少1/4满电流

采用更小的磁链夹角的另一个好处是抑制过冲 电流也无须经常在正负90度间大方向切换 实际上这是一个数字控制系统 按20kHz频率 每次决策 至少执行50us 然后附加了一个实时控制系统 目标值为磁链夹角 通常运行中 这个夹角可能会偏离预期目标非常小 对高频干扰具有很好的抵抗性 这等于结合了部分开环和闭环的好处 当需要大扭矩高速运转时候 仍然可以输出90度的扭矩 但是也可以在误差增益较小时候 也达到较大的刚度

从控制系统的角度来看 FOC常规控制函数 类似 $\frac {I} {s ^ 2 +k*s}$  k是速度正比的阻力 如果采用电流恒定 完全通过磁链角度控制输出 在夹角小的时候近似$\frac {I} {s ^ 2 +k*s +1}$  后者不难看出更具稳定性 所以可以两者混合一下 

此外PID控制部分 我想采用双自由度PID 以兼顾排除干扰和稳定跟踪两者 而其中前置滤波型的变形 具有最简洁的数学形式 各参数独立性强  与旧PID参数具备继承性 其框架如下


2pid2.png  

传递函数为 $Y(s)=\frac {H(s) G(s) X(s)} {\frac {1} {P(s)}+G(s)} +\frac {N(s)} {\frac {1} {P(s)}+G(s)}$ 

这样 就等于在传统PID上增加了一个H(s)滤波器 G(s)就可以用传统PID算法和技巧 包括死区 微分先行 积分分离 抗积分饱和 消弱积分法 有效偏差法 不完全微分 增量式等等 因此三个传统参数 Kp Td Ti在此设定 既 G(s)应该具备 $ Kp ( 1 + Td *s + \frac {1} {Ti * s})$ 的形式 

为了后面的定性分析 对于P(s) 作为一个电机 完全有理由认为它具备 $ \frac {k_0} {s^2+k_1*s+k_2}$ 的形式 有两个极点 $\frac{ -k_1 \pm \sqrt{k_1^2-4k_2 } } {2}$

干扰项变为 $ \frac {k_0 * N(s)*s} {s^3+(k_1+k_0 K_p T_d)s^2 +(k_0 K_p+k_2)s+\frac{k_0 K_p}{T_i}} $ 上面的s表明干扰项没有稳态响应

响应项与常规PID算法相比 完全等于原输入乘于个H(s) 变为 $ \frac {k_0 K_p(T_d*s^2+s+\frac{1}{T_i}) H(s)X(s)} {s^3+(k_1+k_0 K_p T_d)s^2 +(k_0K_p+k_2)s+\frac{k_0K_p}{T_i}} $  显然其稳态响应与H(s)的稳态响应一致 因此H(s)稳态响应应该设计为1

对于以上电机模型 数学上居然有办法 让响应项变为一阶低通形式 $\frac {\omega_0} {s+\omega_0} $ 比如说 对于20kHz的采样控制过程 电机应该能有1kHz的响应速度 50极电机对应每秒20转 经过烦死人的推导 我得到一个精确解 

$  K_p=\frac {\omega_0k_1} {k_0} $

$ T_i=\frac {k_1} {k_2} =>K_i=\frac {\omega_0k_2} {k_0} $

$ T_d=\frac 1 {k_1} => K_d=\frac {\omega_0} {k_0} $

但是现实中 模型是不可能精确的 而且也缺少了许多方面的考虑 实现也是不可能完美的 参数也是得不到的 上面这个推导结论其实也是有趣才给出 有些参考价值 但是实际上并无大用

而且此时干扰项也变为$ N(s)(1-\frac {\omega_0} {s+\omega_0})  \frac {k_0} {(s^2+k_1*s+k2)} $  其意义是叠加一个反向的低通信号进行抗干扰 这个低通也与响应的低通是一样的 如果希望增强抗干扰性 那么$\omega_0$ 就需要加大 即加大Kp  而Ti Td主要看机械阻尼情况来决定  这就是PID三参数的整定思路 这个整定 大概只能逐渐摸索了 仿真是一个很好的手段 实操是最终的手段 网上虽然有出于各种思路 根据各种代价提供的手法 比如Ziegler-Nichols之类的经验手法 都只能作为参考

对于铣雕系统而言 如果对空载马达整定调试好了 就差不多了 因为较高的力量放大比 后端带来的影响不大 很直观的实验就是你如果试图推动机械来带动步进电机 是困难或者不可能的 阻尼也比较大 但是对于3D打印系统或者机械臂 可能要考虑在系统整定以获得最佳表现 不过大致来说 使用保守一些的参数 接受保守一点的效果 也可以免去过多的调试 毕竟比起许多需要建模的算法 PID本身就以鲁棒性和适应性见强

现实中 根据经验 可以想象当Kp加大 过冲超调就会越明显 除了Ti Td的参数调整 此时 对于响应项而言 这个过冲可以通过H(s)修饰来弥补 这就是二自由度PID的意义 实就是G(s)构成的PID系统 可以按抗干扰的目的设计 允许对干扰有较大的超调 而通过前置滤波H(s)来抵消响应上的超调 

观察响应传递函数 $\frac {H(s) } {\frac {1} {P(s)G(s)}+1} $ , 显然最好的H(s)是 $\frac {1} {P(s)G(s)}+1 $ , 这有点麻烦, G(s)是已知的 P(s)不是 如果搭P(s)模型 弄观察器什么的 就变成另一种控制方法了 要简化 忽略 接近 代入PID模型 变为

$\frac {H(s) } {\frac {s} {P(s) K_p T_d(s^2+\frac s {T_d}+\frac 1 {T_iT_d})}+1} $ ==(ZN整定)==> $\frac {H(s) } {\frac {s} {P(s) K_p T_d(s+\frac 1 {2T_d})^2}+1} $

忽略电机P(s)频谱 认为一直处于变换不大的范围 没有共振之类 纯粹只为了抵消PID 于是观察式子左下部分 有一个零点在稳态响应处 有两个PID控制带来的极点 $ \frac {-1 \pm \sqrt {1-4\frac {T_d} {T_i}}} {2T_d}$ 有意思的是 当采用Ziegler-Nichols的最佳整定策略时 $\frac{ T_i } {T_d} =4 $ 此时合并为一个极点 $-\frac 1 {2T_d}$ 然后估测其频谱 有个转折角频率是$\frac 1 {2T_d}$  既便不采用ZN整定 除非PID参数搞得一塌糊涂 否则也大致可以用两个极点中间的$\frac 1 {2T_d}$来简化分析的

那么可以看出 式子下左下的频谱大致是这样的 从角频率0响应0开始 以6dB每倍频上升 到达 $\frac 1 {2T_d}$时  值达到$\frac 1 {P(s)K_p}$ 之后以6dB每倍频下降 无穷大角频率处变回0 如果再加上稳态响应1  这应该是H(s)函数应该模拟的频谱形状 

一个附加分析是 如果H(s)是直通的 那么整个系统剔除电机影响后的响应 从角频率0响应1开始  逐渐下降 到达 $\frac 1 {2T_d}$时 达到低谷 之后又慢慢在无穷大角频率时候回到1

另一个附加的分析 干扰响应$\frac {1} {\frac {1} {P(s)}+G(s)}$ 代入PID模型 变成 

$\frac {s } {\frac {s} {P(s)} + K_p T_d(s^2+\frac s {T_d}+\frac 1 {T_i T_d})} $ ==(ZN整定)==> $\frac {s } {\frac {s} {P(s)} + K_p T_d(s+\frac 1 {2T_d})^2} $

大致也是个先升后的样子 大的KpTd可以减少干扰的峰值 

回到H(s)的构建 考虑为了减少不必要的输入噪声 比方说传输上的抖动 计算的误差 中断带来的延迟等等 实际上 有必要再给H(s)做一个低通 让它的响应在无穷大角频率时候不是1  而是0 于是H(s)最终表现为一个0频率处为1 无穷处为0  在$\frac 1 {2T_d}$有个峰值的滤波器 引入参数 Kf 一个简单的形式大概是

$\frac {K_f*s+1} {(2T_d*s+1)^2} $ 或者 $\frac {K_f*s+1} {(2T_d*s+1)(\frac 1 {\omega_1}s+1)} $ 其中${\omega_1}$是设计好的系统截止频率

其稳定响应为1 从角频率1/Kf开始以6dB每倍频上升直到角频率1/(2Td)后以6dB每倍频下降 无穷大角频率处为0

之所以不直接采用G(s) 一来是减少运算量 是因为无法避开P(s)的未知 即便采用了G(s)作为H(s)的部分 依然需要一个滤波器来涵盖P(s) 最终结果并不会造成更大阶数的效果 只会起起伏伏的波动 以上滤波器就能同时大致地涵盖P(s)和G(s)的影响 

下面是一个仿真

2pid3.png

当没有前置滤波时 PID抗干扰效果不错 但是超调明显

2pid4.png

加入滤波后 超调小了很多 但是抗干扰效果依然

2pid5.png

不过显然 滤波会带来一定的延时 以上都未对相位进行任何分析 一个最简单的办法 就是提高系统速度 降低对系统的期待 比如说 一个设计在1kHz响应上的系统 如果只用在500Hz 显然延时问题真少很多 一个最复杂的方法 就是对机械系统进行建模 用现代控制理论去控制它 但是又想适用性强 又想反应迅速 目前我没有找到什么更好的办法

------------------------2023.11.10------------------------

在应用微分先行算法时候发现 这时候 等效于X(s)中缺乏了微分项 于是有了类似

f-1.png

这其实已经实现了之前计划的 H(s) 的分母项 稳态响应为1  高频处趋于0 只是分子项在s的一阶系数上有区别 在思路上也很明确 将输入项的微分重新加个系数再注入 实现响应和输入微分方面的二自由度 这样得到了一个更简单更好实现的系统框图(此时Kf定义已经和上面不同 但是作用是一样的 作为第4个PID参数 当Kf等于1时 就和传统的PID一致)

2pid2-c.png


仿真表明 调整Kf 系统可用在过冲和缓和之间过渡 如果细心调整 可用得到理想的状态

介于用的单片机只是一个M0 (我看到AT有2块钱的M4 好像也是20脚) 算法应该足够简单 所以也不打算弄得太复杂 应该就按这个框图设计了 基本上整定的思路是

1 根据刚性要求确定Kp Kp的基准值应该是当单极上相差90度时 提供最大电流数 实际上为了比传统马达要好 应该在此基础上提高2-3倍

2 根据电机响应速度要求确定Td, 因为 $ 2 \pi f = \frac 1 {2*T_d}  =>  \frac {T_d} {T_s} = \frac {f_s} {4 \pi f}$ 实际上一般最大的f应该是fs(采样处理频率)的1/20左右 所以实际在数字计算中用的系数 $\frac{T_d}{T_s}$ 应该以 1.6为基准 然后推荐Ti是4倍Td 所以计算中用的系数 $\frac{T_i}{T_s}$ 应该以6.4为基准 设计响应频率变小 则调大两者 (但是两者不适合太小 会造成响应频率虚大 这时候会可能造成复杂的过冲 震荡的情况 这在仿真中也得到相同的结论)

3. 然后根据电机运转情况 是反应偏慢 还是过冲太大 调整Kf比例 Kf应该以1为基准  表明是这时候和普通PID一样

按照上面方法整定 应该具备较大的适应性 可用作为缺省值提供

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

今天考虑了RS485上的通讯协议 大致确定以下各点 (只是草案 但是已经感觉复杂了 可能我只会实现部分) .... 今晚又补充了那么多细节 暂时先按这个实现吧 我感觉主机都要交出总线 自我禁用了 ... 就一个一维的位置信息指定 搞出那么多花样 我自己也有点服了

  1. 最小信息传递单位是1byte 比特率缺省1Mbps(这里有个参数) 使用双绞线 

  2. 兼容RS485一主多从的通信协议 最高位为1 表明是地址码

  3. 普通从机地址码从1开始递增 虚拟组地址从126开始往下降 0和127保留 (可能分别给主机和外部系统)

  4. 主机进行总线控制 通过协议明式把控制权交给从机 从机应通过协议明式交换回主机或给其他从机 没有控制权的设备不允许发声 从机失去响应 超时没有发声(这里有个超时参数) 如果总线是1状态 主机可以主动发起新地址上的通信 抢夺回控制权 并且作废产生超时的通信中 部分已收到的回复

  5. 主机应该在发送时候同时监听总线 如果发送与监听的不一致  说明总线上产生了冲突 主机可以在延时一个随机短时间后 多次发送地址码夺回总线 如果一直失败 根据情况可以向上位机发送报告 发送紧急告警等

  6. 从机如果回复主机 进行一次简单问答 无须地址码 但是如果得到总线授权 也可以采用类似的主机的地址码加命令的方式 对其他从机进行控制

  7. 虚拟组地址不进行未在协议中声明的通信 保留所有未使用的信息位和地址 其他私有协议可以通过普通从机地址进行

  8. 设备编号ID:1-127 当出现ID0时候 表明对所有设备群发 此时主机不应该发送任何需要回应的命令 除非能够有新机制避免总线冲突

  9. 所有参数均高字节先发 高位先发 未知长度的参数 包括字符串和二进制串 采用先送 2字节长度 再送内容 字符串同时应该有0结尾 因为最高位不能用 所以一字节只能表示7位二进制 两字节表示14位数 如此类推 有符号数 最高位为符号标志

  10. 除了运动控制命令是流 没有长度限制 其他管理和非持续性控制类命令 再次进行时候 都需要重新发送地址位 每次通信只进行一次命令 每组命令应该尽量定长 或者可以在已经收到的定长的内容 推断出之后的信息长度 并且有方法判断整个命令已经传递完成 如果剩下不能定长的内容 通常应该是解释性 可选性和文字性的

  11. 从机出现严重错误 会影响整个系统 产生损失性危害时 可以在总线为1的时候 强行发布急停命令 可以定期重复发送 (但应考虑冲突 不能发送太快 不能占用超过1/100的总线时间 在这短时间内的总线冲突不会损害总线通信设备) 发送地址为126 

  12. 地址126 必须实施  是紧急告警通道 无论主机或者从机均可以短时间强行发送 可以只发送一个地址 也可以后跟一个字符串二进制串 所有设备应该在遇到这个地址时候立即采用能最大减少损失的措施 比如停止运行 释放压力 而相关安全设备可能反而需要紧急启动 提供压力

  13. 地址125 必须实施  是设备管理通道 

    1. 第一个字节是要通信的设备ID

    2. 如果ID为0群发  则任何命令 即使是原本需要回复的命令 无须回答 主机也默认已被成功执行

    3. 如果需要回复 从机先发一个字节的回复码 然后再跟具体内容(如果有的话) 回复码含义:

      1. 0: 成功 可能有回复内容也可能没有 但是这次通信已经完成

      2. 1: 成功 并跟回复内容 但是这次通信并未完成 后续还有其他内容 直到最后一个回复码为0 或者其他失败 如果最终失败 主机应该忽略已经收到的部分内容 保证事务性

      3. 2: 需要等待 并不跟后续内容 这个回复码会定期重复发送 防止主机认为软超时 (但是主机应该有硬超时设置 再等不到回答 会强行中断抢夺总线) 

      4. 3: 操作失败

      5. 4: 不支持

      6. 5. 协议理解失败 比如不支持其中的子协议

      7. 6: 协议内容理解 比如虽然支持 但是内容并未正确识别 或者校验码等错误

    4. 第二个字节是命令

      1. 0: 空操作 后续无它 无须回答 主机可以用此进行总线争夺之类的命令(需要检测总线冲突) 或者使用这个终止前面未传达完的命令 已传达完的命令 在等待回复期间 主机无法用这个来撤销前面的命令

      2. 1:禁用和复位设备 后续无它 设备应该回复 (如果不是群发) 设备之后将不再响应原本该响应的信号 并进行复位 清除所有历史信息和状态 直到重新被启用 如果是运动设备 应释放所有出力  不需要保持任何之前的运动状态 (也是运动设备缺省状态 而其他设备可以直接上线就运行) 

      3. 2:暂停设备 后续无它 设备应该回复 (如果不是群发) 设备之后将不再响应原本该响应的信号 并将状态转变为就绪 直到重新被启用 但是应该保存状态性信息 如果是运动设备 应释放所有出力 但需要保持任何之前的运动状态

      4. 3:屏蔽设备 后续无它 设备应该回复 (如果不是群发) 设备之后将不再响应原本该响应的信号 但是仅仅是等效于未收到指令 其他保持不变 直到重新被启用 如果是运动设备 将不再接受之后的运动指令 但是当前出力状态应该保持

      5. 4:启用设备 后续无它 设备应该回复 (如果不是群发)

      6. 5:设备ID赋予 后面跟随二进制串的字符串 具有该字符串内部码的设备(一般是由设备公布 并且固定 比如MAC码 MCU独特码等) 将获得协议中第一个字节的ID 并发送回复码. 而原有该ID的设备不需回应 但应该放弃原有编码 其编码丢失 并写入自身配置持续化下来  等同被屏蔽 除非再次获得ID 

      7. 6:同步标志 后面跟随4字节的时间码 一般群发 设备无须回复 时间码没有具体的时长标准 根据主机的定时计数决定 强名其单位为"刻" 

        时间码有循环时间 4字节只能提供实际无符号28位的信息 主机应该保证发送间隔不超过其一半的循环时间 如果一刻是1微秒 主机需要在130秒内再次发送 如果超过这个时间 前面的定时同步均失效 如果同步间隔太短 从机会太忙 而且同步精度会降低 建议0.1-1秒内同步一次 至少两次成功同步 从机才能建立基本的时间系统 后面需要时间参数的运动命令才能被执行 但是从机可以考虑通过更多的同步数据 获取更精密的时间标准 包括与主机的差距 比例 和抖动的程度等

      8.  7 同步失效 后面跟随4字节的时间码 一般群发 设备无须回复 后面跟随4字节的时间码 立即废止前面的时间参考 同时提供新参考的第一个同步时戳

      9. 8 同步时刻  后面跟随4字节的时间码 一般群发 设备无须回复 后面跟随4字节的时间码 在不改变时间比例的同时 立即宣布一个新时刻

      10. 9 精密同步(可选 该方案待定 不应实施) 不进行群发 设备必须回复 后跟随4字节的时间码 设备应立即回复回复码 跟4字节它之前收到的最后一个回复码 然后主机收到后再次发送一次4字节的更新的时间码 结束通信

      11. 10 总线授予/交回 不能群发 后续无须字节 如果ID不为0  是主机将总线授予对应ID的设备 然后主机保持沉默 等待总线交回 或者超时时间到 未收到总线任何信号 则可以发命令0收回总线 如果ID为0 是从机主动交回总线 主机可以立即使用总线

      12. 11 设备状态查询 不能群发 后续无它 设备返回一个字节回复码 再是一个字节的状态码

        1. 0 表明设备正常工作

        2. 1 设备出现控制性的致命性异常 无法正常控制

        3. 2 设备出现可恢复性的控制上的错误 

        4. 3 设备出现告警

        5. 4 设备正在初始化 

        6. 5 设备已经可接受部分指令 但是精度尚未到位 比如同步时基尚未建立或者发现较大抖动

        7. 6. 设备基本达标 但是未完全稳定 尚未到最佳 建议不要进行大应力操作

        8. 7. 设备环境出现不好的预期 比如冷却水温过高等

        9. 8 设备环境出现影响性问题

        10. 9 设备环境出现致命性问题

        11. 10 设备发生轻微堵转等细微的 可恢复的机械性问题

        12.  11 设备发生碰撞等影响有 但是不算大的机械故障

        13. 12 设备发生严重机械性损坏 比方说撞车了 轴歪了

        14. 127 设备触发预订信号1 比如位置检测 HOME 人为按下按钮等

        15. 126 设备触发预定信号2

        16. 125 .....


      13. 12 设备属性查询 不能群发 后跟查询地址2个字节 (有效14位) 从机先回复回复码 然后回复长度打头的二进制串 主机应该理解从机回复数据其含义 比如可能是1位的状态 16位的PWM设置 等等 不在本协议的范围内

      14. 13 设备属性设置 不应群发 除非主机已知设置地址的共通性 后跟设置地址2个字节 这个地址与查询地址应该有相通性 再跟主机理解的长度打头的二进制串 具体含义也不在本协议范围内

      15. 127 文本协议转发 后跟长度打头(0-16383不包括长度本身 )的二进制串 等待设备回复或者超时 设备回复位1字节的回复码 然后跟长度打头的二进制串 数据均为0-127的ASCII码 无须包装 注意一次收发结束后 需要再次进行 要重新从地址码开始

      16. 126 文本协议转发 后跟长度打头(0-16383不包括长度本身 )的二进制串 等待设备回复或者超时 设备回复位1字节的回复码 然后跟长度打头的二进制串 数据均为utf-8编码 然后进行8位转7位的串流包装 用8个字节包装7个字节 注意一次收发结束后 需要再次进行 要重新从地址码开始

      17. 125 MODBUS协议转发 同前面 数据流也是8位转7位的串流包装 

  14. 地址124-121 保留给使用者自定制的运动控制协议 以及以其他方为主的协议 比如klipper的MCU命令 系统如果使用该地址 必须自己了解该地址上的协议 之后的地址均为可选支持

  15. 地址120 字节流方式 是模拟传统DIR-PUL协议简单实现的虚拟地址 支持4轴系统的同步运动 和共16轴系统的异步运动 运动型设备支持的话 应该监听这个地址 要么全部忽略这个地址上的通信 通信的长度没有限制 直到下一个地址出现 重新进入这个地址将持续之前的状态 其通信字从0-127有以下含义

    1. 0-80 为4轴系统的同步步进和方向控制 以3进制编码 共4位对应运动设备(从低位往上对应ID为1..4的设备) 0表示不动 1表示前进一步 2表示后退一步

    2. 81 -104 为4轴外其他轴的异步步进和方向控制 81表明ID为5的运动设备前进一步 其他设备不动 82表明 ID为5的运动设备后退一步 83表明ID为6的运动设备前进一步 ... 如此类推 可以支持ID为5-16运动设备的异步运行

    3. 105-120 为运动设备的状态查询 同时这条命令之后 该地址上的字节流将暂停 设备返回查询结果后 105查询ID为1的设备  106查询ID为2的设备  .. 120查询ID为16的设备 设备收到命令 立即返回一个不带地址等数据的字节即可 主机收到回应 立即可以恢复字节流 如果超时 主机需要重新发送地址 夺回总线控制权 从机返回的内容不应该有运动的歧义 以免让其他运动设备误判 其含义如下:

      1. 121 表明设备正常

      2. 122 设备致命性异常

      3. 123 设备出现可恢复性错误 或者在初始化中 需要等待

      4. 124 设备触发预订信号 比如位置检测 HOME 人为按下按钮等

      5. 125 设备运动遇到下限

      6. 125 设备运动遇到上限

      7. 127 设备遇到更复杂情况 需要更复杂的通信协议 主机应该使用其他地址获得进一步信息

  16. 地址119 - 保留

  17. 地址118 多轴同步带纠错纯运动控制 字节流 

    1. 每个运动设备使用3个位 1个字节中 2个运动设备 分别使用bit0-2 bit3-5 ID小的使用低的位

    2. bit5为延续标准 如果该字节后还有其他轴的字节 则为1 这样1-2号运动设备使用字节1 2-4号用字节2 以此类推 直到最后一个字节 此时bit5应该为0 表明一组运动传输完毕

    3. 运动设备收到自己的控制码 并不立即进行运动 直到收到最后一个控制码 bit5为0  才同步进行运动

    4. 设备查询 本协议没有足够空间 可用采用地址120和125上的功能

    5. 每个设备的3位 采用3位格雷码进编码 比如从其中3变成4 是前进一步  7变成5是后退两步 7变成1却是前进两步 可用表示位置变化可用从-3到+3 编码利用率达到7/8 比2位法要高 即使轴数为奇数 少用了几乎半个字节 因此也相差不大 而轴数为偶数时 更是超过传统编码的速度 其纠错有两种

      1. 采用格雷码 即使错了一位 误差也仅一步

      2. 当需要更多纠错的时候 无须双方设置 只需要主机保证只使用-2到2或-1到1的位置位移 可用达到用带宽换可靠的效果 即使丢失整个字节 从机可以根据"采用位置变化绝对值最小的可能" 进行纠错 比如从3缺了4到5 从机显然会认是从3到5走两步 而不是反方向3210765走6步

  18. 地址117 本想采用Sigma-Delta等新式调制方法 利用其自纠错 可重采的特点 但是仿真看来不容易实现 而且也有许多性能问题 即使4阶亦不如人意 而且特别复杂 先打住 保留 以后留给更好的算法 

  19. 地址116是学习模式 主机控制运动设备返回位置变化信息 采用轮询方式获取信息 (目前还没投心思 仅作为想法保留)

    1. 第一个字节是要通信的运动设备ID 

    2. 第2个字节是命令字

      1. 0: 结束采样

      2. 1: 开始采样

      3. 2:要求运动设备返回采样结果 可以是多个采样结果 采样结果的编码根据采样设置而定

        1. 从机返回成功/失败码 采样结果数量 采样结果(包括采样时间) CRC32校验码

      4. 3: 采样设置协议未定 应包含采样策略 缓冲策略

        1. 采样策略包括定时采集 位置变化和其导数大时候采集 编码溢出采集

        2. 缓冲策略包括采集深度 绝对编码和相对编码选择等

  20. 从1开始为常规设备 与运动设备的编号并不需要一致 但是运动设备也可以使用这里的地址 兼容普通设备 进行私有协议的通信

引用
评论
1
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
warmonkey
1年2个月前 修改于 1年2个月前 IP:广东
926734
引用m24h发表于37楼的内容
今天考虑了RS485上的通讯协议 大致确定以下各点 (只是草案 但是已经感觉复杂了 可能我只会实现部...

太复杂了,建议看一下CDBUS。


运动控制也不需要多主机通信,应该是所有通信由主机轮询完成。多次通信不成功,设备进入急停。

广播地址用于发布多轴同步运动和急停指令,设备地址实现读写寄存器功能。

使用状态字(广播、非广播均可用)实现急停和故障报告,具体故障信息需要读取寄存器。

设备地址可以用广播命令修改。


引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
m24h作者
1年1个月前 IP:上海
926735
引用warmonkey发表于38楼的内容
太复杂了,建议看一下CDBUS。运动控制也不需要多主机通信,应该是所有通信由主机轮询完成。多次通信不...

我这主要是应用层的东西 简单不下来 因为这就是“功能”啊

你说的层面上对不上的 比方说 你还是得设计出具体的协议 用哪个位 哪个字节 代表什么信息 流程怎么样 从你说的层面看 我的这部分更简单 完全没有多余的包装

实际上 这种主对从的东西 光要底层简单的话 MCU就已经支持硬件地址识别 无需还弄更复杂的层

我提出的纠错也是实时性的 要是通过重传 那就来不及了

引用
评论(1)
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
warmonkey
1年1个月前 IP:广东
926743
引用m24h发表于39楼的内容
我这主要是应用层的东西 简单不下来 因为这就是“功能”啊你说的层面上对不上的 比方说 你还是得设计出...

好用的协议这东西不是定义出来的,是演化出来的。

开环驱动器只有PUL DIR EN ERR四条线。伺服一般只需要高频率下发目标位置,需要调参,有些需要电同步。

协议内容太多用户头大,开发者累死。

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
RodTech
1年1个月前 IP:美国
926752
引用warmonkey发表于40楼的内容
好用的协议这东西不是定义出来的,是演化出来的。开环驱动器只有PUL DIR EN ERR四条线。伺服...

所以嘛 直接 canopen和can FD,cia402标准 各厂都遵守 多方便

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
m24h作者
1年1个月前 IP:上海
926755
引用RodTech发表于41楼的内容
所以嘛 直接 canopen和can FD,cia402标准 各厂都遵守 多方便

并不方便 因为他们并没有应用层上的东西

即便作为底层 也不能采用 因为他们满足不了我的要求 而它们做到的 也不是我需要的

即 在已有的硬件平台 实现需要的功能和性能

而现有的rs485加最高位为1的地址表示 已经能够完全满足我在应用层之下的所有需求了 如果能加个总线仲裁 如CAN底层那样 就更好了

然而我依然没有选择CAN的物理层 保留和最低端系统的通用性 否则就会变成 对哪个都不真兼容

形而上学固然是好 滑向八股就是灾难了 恕我直言 我感觉你们 都没有真去看下我的协议 其中有啥问题 用某某协议会怎么样 因此我都觉得 你们都在说啥无关的东西 就像某抖上的的广告 “这东西很棒 我也入手了一款 用起来很不错” 也不考虑一下可能用了这段四处皆宜的话的 是棺材商

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
RodTech
1年1个月前 IP:美国
926759
引用m24h发表于42楼的内容
并不方便 因为他们并没有应用层上的东西即便作为底层 也不能采用 因为他们满足不了我的要求 而它们做到...

我正用着ethercat呢 就是canopen over ethercat,发的还是cia402,好用的很啊

引用
评论
2
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
m24h作者
1年1个月前 IP:上海
926779
引用RodTech发表于43楼的内容
我正用着ethercat呢 就是canopen over ethercat,发的还是cia402,好...

我确实缺乏感恩和满足之心 我正好这两天在某乎看到过一个问题 “美国黑奴既然过得比国内人过得还好 为什么不懂得感恩 还要反抗呢” 我想他们也不满足吧 或者骨子里缺乏满足的文化

所以 我不满足在现有低廉平台上 传统方式的功能和性能 只能自己造了



引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
大仙
1年1个月前 IP:江苏
926780
引用m24h发表于44楼的内容
我确实缺乏感恩和满足之心 我正好这两天在某乎看到过一个问题 “美国黑奴既然过得比国内人过得还好 为什...

我没老哥这水平,最近做个要求比较高的吊车控制,最后选的用国产codesys PLC+国产canopen模块方案做。

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

居然有那么多人组团来这里跌倒 也不知道是哪家的包包 居然能塞下那么多工控模块 我不过是控制个42电机 说实在的 就算皇帝 有时候也会只喝一碗粥吧 感觉都是鸡同鸭讲

抛开无效沟通  今天尝试看看格雷码是否能用到地址120上的三进制编码上 虽然它和另一种编码不同 (那种具备滚动性 基本上就是2345601234这样的数据 应该可以用来纠错)

我原本的打算是 对三进制先找到一个排序 使得相邻数字 其步进区别只要一步 或者最少的部数 我这里1表示前进 2表示后退 0表示不动 比如 (1,1,0,1)和(1,1,2,1)就只有一步差距 但是和(2,1,0,1)就从前进变成后退 差了两步 ... 另外再找个二进制的格雷编码 作为前面排序的索引 ... 总之 尽量使得 编码后 步数只差一步的 位上也只有一个位不同

因为数量不是二的整数幂 甚至是个奇数(81) 而且三进制的要求并不等同格雷码 常规3进制格雷码(先不考虑前进后退 就认为0后退 1不动 2前进) 是循环的 从2到0认为是一步 但我这里认为是两步 所以我采用计算机写个perl脚本 来个深度搜索 硬找硬算 以为最好有几个数字之间有最多两步误差 就满足了

没想到居然存在完美解 得到一张表 相邻之间只相差一步

0,1,4,3,5,2,8,6,7,16,15,17,11,9,10,13,12,14,41,39,40,
37,36,38,44,42,43,34,33,35,29,27,28,31,30,32,50,48,
49,46,45,47,53,51,52,25,24,26,20,18,19,22,21,23,77,
75,76,73,72,74,80,78,79,61,60,62,56,54,55,58,57,59,
68,66,67,64,63,65,71,69,70

然后是二进制格雷码 因为不是2个整数次幂 所以网上也没有生成算法 于是我用0-63的格雷码 0-15的格雷码加64 还有80这个数 进行分段 颠倒 拼接尝试 居然也出结果了 存在0-80的格雷编码 相邻数字也只差一位

0,32,33,35,34,38,39,37,36,44,45,47,46,42,43,41,
40,56,57,59,58,62,63,61,60,52,53,55,54,50,51,
49,48,16,80,64,65,67,66,70,71,69,68,76,77,79,
78,74,75,73,72,8,24,25,27,26,30,31,29,28,20,
21,23,22,18,19,17,1,3,2,6,7,5,4,12,13,15,14,10,11,9

但是可惜的结果并不理想 我模拟每个位分别产生误差 比较普通编码和格雷码最终产生的MSE  格雷码并没有带来益处 相反 格雷码虽然会产生更多的小误差 但是也会使得大的误差变大 就是拉大了误差分布的...基尼系数? 折算到MSE上 反而吃亏了 

可惜了两张奇迹般的表 就放着留作纪念吧 有两个问题

  1. 是不是所有数量的数 都存在 或者都能找到它的格雷排序呢 数学上能否证明 我感觉太难 放弃了

  2. 是否有另外一种编码 能使得误差分摊更均匀 然后降低整体MSE呢 研究一下

引用
评论(1)
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
m24h作者
1年1个月前 IP:上海
926837

今天研究带纠错的位置流编码 结果不错

在使用3位编码 但是主机只发不动 前进一步 后退一步的情况下

我排除了格雷码 反正就0-7 8个数组的组合 量不大 直接用计算机计算所有的编码组合 硬算出一个误差最小的组合01236745

01236745
00-46-22-11  --  2  2  1
11-57-33-00  --  2  2  1
22-64-00-33  --  2  2  1
33-75-11-22  --  2  2  1
46-00-64-57  --  2  2  1
57-11-75-46  --  2  2  1
64-22-46-75  --  2  2  1
75-33-57-64  --  2  2  1

这个编码确定不是格雷码 甚至与原来的裸码相差不大 但是能做到 当有一位传错时 数字最多相差2 (这里是循环的 比如6到0 是两步)

对比之下的裸编码 数字可能相差到4

00-44-22-11  --  4  2  1
11-55-33-00  --  4  2  1
22-66-00-33  --  4  2  1
33-77-11-22  --  4  2  1
44-00-66-55  --  4  2  1
55-11-77-44  --  4  2  1
66-22-44-77  --  4  2  1
77-33-55-66  --  4  2  1

相差只有2  就保证了可以纠正偶尔的错误

比如前面成功传送位置 3 下一步传送 4 由于误码 最终变成了 6或者2

如果下次传输成功了 传输了5 那么过程可能是 365 或者 325 显然路径都是唯一的 6-5 2-5 都符合最短路径原则  临时的错误没有被积累

如果下次传输传回3 或者保持4 显然判断更轻松

当然如果主机不限于前进 后退一步 和不动  比如前进2步 那么误码可能没法被纠正 但是也应该损失更小

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

花了一天设计了个USB转485的小接口 

sch.png

pcb.png

3d.png

没有自动收发 可提供最大速率 .... 但是最终没动手做出来 一是双11券没地方用 又看见才几块钱的模块在卖 做工还一眼特别不错 还是买现成的了 关键是 现成的产品 图片上用了3个集成块 除了USB接口 485驱动 还有一个是什么 我想不出来  特别好奇 ...猜可能是个单稳态集成电路 或者计数电路 来完成自动收发转换 而不是把485口变成opendrain的形式 .... 两天后到手再说

....................

到手后发现 是个4与非门 估计就是当反相器用 和传统自动收发电路没区别  因为不好拆开 就不细究了

......................

还是拆开了 发现波形不太对头 发现用了限摆率的485芯片 最大500khz 更换 而且 还真是用两个与非门做成了单稳电路 还不如三极管反相器那种电路适应性好 (怪不得那么便宜) 卸下 485方向接RTS输出来控制

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

铣了个小东西 用来认真装磁铁

1700306464575.jpg

这回真对得准了 

但是令人吃惊的是 并未像我预期的那样对结果有任何改善 甚至可以说 比起原来粘歪的另一个电机 误差更大  这种情况下都有正负1度的原始误差 真令我陷入到深深的疑惑中 如果是电机磁场干扰 不应该是这种一圈4次起伏的误差图像 唯一可能只能是磁铁本身就充磁得不够对称 或者MT6701芯片问题

我于是看了一下磁场的分布 果然磁铁很不完美 不光并不对称 甚至分界线都不是直线 是个大圆弧的一部分 (照片不太容易看出 但是现场一目了然)

magnet.jpg

这东西真不是肉眼能检测的 估计再买也不会更好 算了 反正靠校正

这个项目充分地体现了一个事儿 就是人生事 八九不如意 遍布网上 就磁编码而言 估计就我这暴露的细节最多 下面则是AIR001的BUG

就普通的STM32F030系列 串口如果是8倍超采样的话 计算波特率时候 要比16倍超采样乘2  然而AIR001不是 估计是自己的实现 其手册也没有如此宣传 但是它提供的LL库中 却错误地照抄了STM32F030系列的算法 我也是花了一段时间才发现这个问题

但是这是可以软件解决的 问题是当使用500kbps及以上速率的USART2时 出现了大量的误码 一开始我以为是电机干扰 可是测试所有外部信号波形 均几乎完美 没有受到干扰的迹象 最后发现应该是驱动MT6701的SSI时钟干扰导致 一个PA2 一个PA3 引脚也相邻 但是同样在外部引线也测不出干扰 应该是芯片内部的串扰 这让我对国产芯片抗干扰能力差的说法 有了一个直观的了解

最后只能将通信速率降到250kpbs 这时候干扰被悬崖式的阻断 长期测试也没有发现误码 这时候 如果采用我设计在地址F8上某通信协议 可以类比传统20kHz频率的步进驱动 但是这时候转速在细分大的时候受到影响 一般16细分只能得到每秒数圈的水平

其实通信的负担并不重 500kpbs是我观察到一个比较合理的通信速率 可惜了 目前主要负担是定期的闭环计算 能占一半的时钟资源 光MCU电流就会升到10mA左右 目前最高速度在24V电源能得到每秒10圈左右 (30V能得到10多圈) 但是..... 也有例外 在调整某些预测方面的参数时候 曾经将马达激发到 前所未有的速度 以至于定时计算位置的中断跟不上 从磁编码数值得到了相反的增长方向 促使了自激的继续 


VID_20231119_164409.mp4  点击下载

正常受控情况是这样的


VID_20231118_184445.mp4  点击下载

再往下走感觉非常困难 尤其是我并没有一个应用它的系统 来使用它 并调整算法 只能说业余玩玩 可能最终会作为半成品开源 不过我尽量实现了一个较包容的框架 可以使用各种磁感应传感器和算法 (目前我打算完成两个算法 PID和一个半开环根据负载调整电流的) 然后就等哪天我再需要 比如要搞个FDM的3D打印机 或者机械臂之类的再说 (但是从内心看 我对此兴趣不大)


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

半开环算法测试:

算法采用开环驱动 (细分设置为16 比较符合当前输入速率和电机最大速度) 但是失步时候会记录下来并尽量追上 此外还有一些小的优化 比如当误差较大时 驱动带有一定的提前量 电流也会根据负载造成的误差而变化 并对时间有所平滑 当负载轻下来并且不需要驱动时候 锁定电流为1/6满电流 

  1. 特点: 鲁棒性强 刚性强 无须配置 在负载变化时候没有震荡

  2. 计算负担:

    1. 锁定时 剩余主循环速度:62次/ms (对比空闲时130次/ms)

    2. RS485以250kbps满速率驱动时, 剩余主循环速度:46次/ms

  3. 最大转速

    1. 测试指令驱动 约12圈每秒

    2. RS485以250kbps满速率驱动时 可以完全跟踪上 约7.8圈每秒

  4. 误差:

    1. 静态时 误差一般在2步内 没有抖动 (考虑到实际上是无负载开环直接驱动 这误差其实应该是传感器的)

    2. 动态时 RS485以250kbps满速率驱动时, 误差约为12步

      trace-error.png

  5. 给一个角度台阶输入 其误差曲线 因为有加速优化 有少量过冲 但是数据中 响应启动有近1ms时间的延迟 程序其实是立即驱动的 该延迟应该来自电流驱动和电机惯性等 

    trace-error2.png  

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

想了一天这个延迟的1ms 其实这个对整个系统影响还是颇大的 也是动态跟踪误差最大的原因

整个系统有许多延迟因素 

  1. 算出下一步 到实际执行时间 我这里主频48MHz PWM是10位  这里有21.3us (但是两次才处理一步 所以上图X坐标单位是42.6us)

  2. MT6701有5us延迟 加上读取它的指令 一共大概需要10us

  3. PWM模拟DAC的2阶低通滤波带来的延时, 分别是1kOhm 47nF, 2.2kOhm 22nF

  4. A4950驱动的延迟 其死区时间25us 

  5. 电机电感带来的电流延迟 实测所用42电机 相电阻13.5欧 电感20mH (这个电机太老了 相电阻和电感都偏大啊)

  6. 电机转动惯量带来的延迟 其转子称量133g 直径26mm 推算转动惯量约11u kg·m^2 根据长度查表 额定电流应该是1.2A  推测最大静扭矩应该是0.3N·m

这么多因素 颇难计算 只能仿真 尤其是3,5,6项

  1. PWM低通传递函数 公式蛮烦 应该是 $\frac{1} {1+sR_2C_2+sR_1C_2+sR_1C_1+s^2R_1R_2C_1C_2} = \frac{1} {1+117*10^{-6}s+2274.8*10^{-12}s^2} $

  2. 电机电气部分传递函数 忽略初始项 为 $\frac 1 {sL+R} = \frac 1 {0.02s+13.5} $

  3. 电机机械部分 忽略磁链夹角影响和初始项 为 $ \frac {T_m} {I_mJs^2} = \frac 1 {0.000044s^2} $

仿真结果如下

trace-error4.png

实际上我的驱动算法 在上上图中 55*42.6us前 是全力加速的 而仿真没有包括其收敛定位过程 因此只对前2.34ms进行仿真 仿真表明 此时角度变化到0.033弧度 对应步数是0.033/6.28*3200=17步 与上上图数据基本吻合

此外 也可以到结论 PWM低通影响较小 电机电感影响较大 但是惯性滞回的影响是最大的

不过仅此 也无法完全解释前期有28*42.6us=1.2ms的平台一般的滞后 传感器就算按12位算 精度也有0.0015弧度 由仿真看 在1.2ms处 应该也有0.003弧度(约1.5步)了 

考虑到电机和PWM低通都是无感的设备 A4900的原理也简单 我怀疑传感器实则有数百微秒的延迟 即使MT6701在相位域上甚至可以设置为超前 但是时域上仍然可能有延迟的 .... 但我没有证据 也没有个光编进行同步对比

如果是传感器的延迟 假如有500us延迟 按RS485 250kbps 步进脉冲等于25kHz 500us就有12步的偏差 与测试结果符合了 这时候开环其实是紧咬住没有偏差的 只是我的测量有所延迟 

但是这对PID算法是糟糕的 我实际上已经有所初步测试 因为PID完全依赖传感器定位 初步测试结果是咬合很好 偏差在0上下轻微波动  如果传感器是延后的 这意味着 实际上 咬合是超前的 

正好 还是超前 这是个问题 也影响算法优化的方向 ..... 

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

吃完饭继续研究 我做了个测试 以1/8满电流先开始驱动电机 等待一段时间稳定后 进行步进 采集位置信息 ... 结果比我想的还要糟糕 只能说MT6701的动态响应 真不值得

trace-error5.png

由数据可以看出 MT6701真有较大的延迟

首先逻辑上 先从MT6701的曲线可以判断 步进确实存在 虽然物理上的波形是否与驱动一致无法证明 但是其幅度是存在的 其变化转折点也是存在的 至少物理上不会落后与磁滞为0的传感器的转折点

从图(上)可以看出 当以23kHz左右步进 方向进行改变时候 即使磁滞设为0 MT6701也完全来不及响应 而这种改变其实并不算激烈 每次只是常规的16细分的1个微步

从图(下)可以看出 当以2.3kHz左右步进 MT6701勉强能够进行跟踪 磁滞为0时候 延迟有1ms左右 磁滞为4(我在用的 这个设置下没有超前的相位补偿) 的时候 延迟达到了3ms 而且波形与驱动相差太远 静态的精度掩盖不了动态的变形

前面测试时候 遇到的延迟是500us-1ms左右 比这次测试要小  可能的原因是 前面测试启动阶段是以阶跃式最大出力驱动电机 而这次测试虽然变换频繁 但是出力不大 电机速度其实是要小很多的

AS5600的手册有详细的响应时间 比如采样周期150us 建立时间从0.29ms到2.2ms可调 但是MT6701只有一个匀速时候延迟5us 其他避而不谈 但是从这次测试结果看 我感觉它的建立时间 也应该有2-3ms 看来它也并没有特殊的黑科

但是如果采用AS5600的话 需要将处理周期从20kHz降到几kHz 而且I2C本身也比较慢 ... 但是换句话说 MT6701的SSI虽然快 但是我也怀疑它的采样周期并不高 我得到的只是其数字滤波器上的余响 动态上基本上都没法得到高的精度 远不如开环稳定准确

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

换个波形再测试一次 这回发现 HYST为0LSB时候 DC响应居然有这么大偏差的证据了 我虽然想用 但是 DC响应真的很难校正啊 而且有时候波形还不是这个样子的 说实在真的很不喜欢厂家自作主张 使用一些奇怪的 不可控的 严重非线性的算法呢 如果真是裸数据 我想我都不会那么头疼

trace-error6.png

因为算法采用了延时补偿机制 使用了测量的延时参数 而不是厂家给的所谓5us 哪怕使用300us延时 性能也大幅度提升了 最高转速达到28.5圈每秒


VID_20231123_210611.mp4  点击下载

 对于50极电机而言 等于1.4kHz 而我采样处理频率才23kHz 虽然目前感觉控制干净利落没有问题 但是按一般至少20倍处理频率的准则  (实际测试 降采样频率降到16kHz后 出现不稳定问题) 

我决定对性能重新规划 既然传感器延迟那么大 采用太高处理频率不合称 于是处理频率降到16kHz 以容纳更多算法处理的余地 (实际上 我里面会同时放几种算法以供选择  是各有所长的) 其次是加上限速算法 限制在每秒16圈左右

重新测量其性能

  1. 稳定性:稳定  手动加乱力负载 没有抖动震荡

  2. 计算负担(主循环速度): 空闲时 94次/ms 算法启动后 59次/ms 加上RS485满速率工作 48次/ms ( 应该这时候大概50%)

  3. 最大转速 实测每秒17圈

  4. 跟踪测试和台阶测试如下图 相比之前 主要是驱动速度加快了 (毕竟这时候预测准确了)

trace-error7.png


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

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

所属专业
上级专业
同级专业
m24h
进士 学者 机友
文章
55
回复
905
学术分
1
2020/01/22注册,2时20分前活动

个人开源项目: XXXXXXXXXXXXXX

主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:上海
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

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