ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

odrive抗齿槽算法为什么用3600个采样点?从原理到实现的完整解析

odrive抗齿槽算法为什么用3600个采样点?从原理到实现的完整解析 齿槽转矩这个东西凡是调过永磁同步电机或者无刷直流电机低速性能的人都绕不开。你让电机开环慢慢转会明显感觉到一圈里有一顿一顿的“咯噔”感这就是齿槽效应在作祟。odrive 作为开源伺服驱动里比较有代表性的方案它的抗齿槽算法一直被人讨论尤其是那个“3600 个采样点”的说法很多人第一次看到都会愣一下一圈 3600 个点那分辨率才 0.1 度够用吗为什么不是 360、不是 36000偏偏是 3600这篇就把这个数字背后的逻辑掰开讲清楚顺带把齿槽补偿从原理到落地实现的整条链路走一遍。不管你是用 STM32F405 跑 odrive 固件还是在 DSP28379 上自己写电机控制代码或者拿 SimpleFOC 配 STM32F405 做验证这套思路都能直接借鉴。1. 齿槽转矩到底从哪来为什么非补不可1.1 齿槽转矩的物理来源要理解抗齿槽算法得先搞清楚齿槽转矩是怎么产生的。永磁电机的转子是永磁体定子是开槽的硅钢片叠压而成。定子槽的存在导致气隙磁导不均匀——对着齿的地方磁阻小对着槽的地方磁阻大。转子永磁体在旋转过程中总是倾向于停在磁阻最小的位置也就是磁极正对着定子齿的位置。这种“倾向于停在某个位置”的力矩就是齿槽转矩。它有几个很讨厌的特性。第一它和绕组电流无关即使电机不通电你用手转转子也能感觉到那一下一下的阻力。第二它是转子位置的周期函数周期等于定子槽数和极数的最小公倍数对应的机械角度。第三它的幅值虽然通常只有额定转矩的百分之几但在低速、轻载、需要平滑运动的场合这个百分之几足以毁掉整个控制效果。我见过太多案例电机在高速跑的时候一切正常一到低速爬行就开始抖位置环怎么调都压不住最后发现根源就是齿槽转矩。尤其是直驱应用比如云台、机械臂关节、精密转台齿槽转矩直接决定了你能不能做到“丝滑”。1.2 为什么反馈控制压不住齿槽有人会想我有编码器有 PID齿槽转矩来了我让电流环去顶不就行了理论上可以实际上很难。原因在于齿槽转矩是位置的高频周期扰动它的频率随转速变化。你 PID 带宽调高了系统容易振荡带宽调低了根本追不上这个扰动。而且齿槽转矩的谐波成分很丰富不是单一频率用陷波器也很难全部滤掉。更关键的是齿槽转矩在低速时表现为“位置依赖”的静差而不是“时间依赖”的动态扰动。PID 是建立在时间域误差上的它对这种和位置强相关、和时间弱相关的扰动天生不敏感。所以工程上的主流做法是前馈补偿提前把每个位置上的齿槽转矩测出来做成一张表运行时根据当前转子位置查表直接给电流环叠加一个补偿量把齿槽转矩抵消掉。这就是抗齿槽算法的核心思想。1.3 补偿的本质是“位置到力矩”的映射既然要查表就要回答一个问题这张表有多细表太粗补偿量在两个采样点之间是阶梯状的补偿本身就会引入新的转矩波动表太细存储和标定成本上去了而且标定精度未必跟得上。odrive 选择 3600 个点本质上是在“补偿精度”和“标定/存储成本”之间找的一个平衡点。下面就来算这笔账。2. 3600 这个数字是怎么算出来的2.1 从角度分辨率倒推3600 个采样点对应一圈 360 度每个点间隔 0.1 度机械角。这个分辨率是什么概念我们拿常见的电机参数来算。假设一个电机的齿槽周期是 15 度机械角这是很多 12 槽 10 极或者 12 槽 14 极电机的典型值那么一个齿槽周期内有 150 个采样点。齿槽转矩的主要谐波是基波和低次谐波150 个点去描述一个周期内的波形绰绰有余。再换个角度从编码器分辨率看。odrive 常用的增量式编码器是 4096 线或者 8192 线四倍频之后是 16384 或 32768 个计数。3600 个点比编码器计数少意味着标定时每个采样点可以对应多个编码器计数取平均能降噪。如果采样点比编码器计数还多那标定就变成插值游戏了没有意义。所以 3600 这个量级和常见编码器分辨率是匹配的。2.2 采样点计算公式的推导把上面的逻辑形式化一下。设编码器四倍频后的每圈计数为 (N_{enc})齿槽周期数为 (N_c)等于槽数和极数的最小公倍数我们希望每个齿槽周期内至少有 (k) 个采样点那么总采样点数 (N_s) 满足[ N_s \geq k \cdot N_c ]同时采样点数不应超过编码器计数否则标定无意义[ N_s \leq N_{enc} ]odrive 的实际情况是它内部把一圈统一映射到 3600 个点不管你的电机有多少个齿槽周期。这个做法有个好处补偿表的长度固定固件里数组大小是编译期确定的不随电机变化。代价是对于齿槽周期数特别多的电机每个周期内的点数会少一些。比如一个 24 槽 28 极的电机最小公倍数是 168那每个齿槽周期只有 3600/168 ≈ 21 个点。21 个点描述一个周期勉强够用但已经接近下限了。所以 3600 不是拍脑袋来的它是在“覆盖绝大多数电机”这个约束下选的一个折中值。绝大多数常见电机的齿槽周期数在 12 到 60 之间3600 除以 60 还有 60 个点足够描述波形。2.3 存储与计算开销的考量3600 个点每个点用一个 float 存就是 14.4 KB。odrive 主控是 STM32F405有 192 KB RAM 和 1 MB Flash14.4 KB 完全放得下。如果放到 Flash 里做常量表连 RAM 都省了。如果用 int16 存每个点 2 字节总共 7.2 KB更省。这个开销对于现代 MCU 来说微不足道。计算开销方面运行时需要根据当前转子位置查表。位置是连续的表是离散的中间要做插值。线性插值只需要两次查表和一次乘加对 STM32F405 的 FPU 来说几个周期就完成了完全不影响电流环的执行。如果采样点太少比如只有 360 个插值误差会变大如果太多比如 36000 个存储翻十倍插值计算量也上去了但精度提升有限。3600 正好在“开销可忽略”和“精度够用”的交点上。3. 标定流程3600 个点的数据是怎么测出来的3.1 标定的基本思路补偿表不是算出来的是测出来的。标定的核心思路是让电机在开环或者力矩控制模式下缓慢匀速旋转一整圈同时记录每个位置上的转矩波动这个波动就反映了齿槽转矩。但直接测转矩需要转矩传感器成本高。工程上更常用的方法是测电流或者测位置误差间接反推齿槽转矩。odrive 的做法是让电机做位置控制给定一个缓慢的斜坡位置指令观察实际位置和指令位置的偏差或者观察维持位置所需的电流。在齿槽转矩大的位置电机需要更大的电流才能维持同样的位置这个电流的波动就对应齿槽转矩。把一圈的电流波动记录下来就得到了原始的齿槽数据。3.2 采样点的对齐问题这里有个容易被忽略的坑采样点的相位对齐。你测出来的 3600 个点第一个点对应转子的哪个机械角度如果这个基准没对齐补偿表就是错的不但补不了齿槽还会引入额外的波动。odrive 的做法是利用编码器的索引信号或者绝对位置来对齐。对于增量式编码器通常需要先找 Z 信号把 Z 信号对应的位置作为零点然后从这个零点开始采样。我实际调试时发现如果编码器安装有偏心或者 Z 信号和磁极对齐有偏差标定出来的表会有系统性误差。解决办法是标定完之后做一次验证让电机在补偿开启的情况下再慢转一圈看电流波动是否明显减小。如果没减小甚至变大八成是对齐出了问题。3.3 多次采样与平均降噪单次标定的数据噪声很大因为电流采样有噪声机械系统有摩擦波动位置环本身也有误差。所以实际标定要重复多次然后对每个采样点取平均。odrive 的标定流程一般会转好几圈把每圈的数据累加再平均。这样能把随机噪声压下去留下真实的齿槽波形。这里有个经验转的圈数不是越多越好。转太多圈电机发热电阻变化电流采样会漂移反而引入系统性误差。一般转 5 到 10 圈取平均就够了。另外转速要慢且稳太快了电流环跟不上测出来的波形会失真。我一般用额定转速的百分之一到百分之二来做标定具体看电机大小。3.4 从原始数据到补偿表测出来的原始数据还不能直接用要做几步处理。第一步是去均值把直流分量去掉因为齿槽转矩是零均值的周期波动。第二步是滤波把高频噪声滤掉但要注意滤波不能把齿槽的高次谐波也滤没了截止频率要选在齿槽主要谐波之上。第三步是归一化或者缩放把数据映射到电流补偿量的量纲上。odrive 内部会把标定数据存成一张表运行时根据位置查表得到补偿电流叠加到 q 轴电流指令上。注意是叠加到 q 轴因为齿槽转矩主要是切向的对应 q 轴电流。有些实现也会在 d 轴上做补偿但主流还是 q 轴。4. 运行时补偿查表、插值与相位补偿4.1 位置到表索引的映射运行时每个电流环周期都要根据当前转子位置算出表索引。设当前机械角度为 (\theta)一圈 3600 个点那么索引为[ idx \frac{\theta}{360} \times 3600 ]取整数部分做查表小数部分做插值。这里要注意角度是机械角还是电角。齿槽转矩是机械角周期的所以要用机械角。odrive 内部会做极对数换算把电角度转成机械角度再查表。4.2 线性插值的实现线性插值的公式很简单[ T_{comp} T[idx] (T[idx1] - T[idx]) \times frac ]其中 (frac) 是小数部分。这个计算量很小但要注意边界处理当 (idx) 是最后一个点时(idx1) 要绕回到 0因为齿槽是周期性的。这个绕回处理如果忘了会在每圈的一个固定位置产生一个尖峰表现为电机每转一圈“咯噔”一下。我踩过这个坑排查了半天才发现是数组越界绕回没写对。4.3 相位滞后与超前补偿实际系统里从位置采样到电流输出有延迟电流环本身也有带宽限制。这意味着你查表得到的补偿量实际作用到电机上时会滞后一个相位。如果齿槽转矩的频率较高这个滞后会导致补偿效果大打折扣甚至在某些频率上变成正反馈。解决办法是给查表位置加一个相位超前量。具体超前多少取决于系统的总延迟。经验做法是先不加超前标定完看补偿效果如果效果不理想逐步增加超前角度观察电流波动是否减小。一般超前量在几个电角度到十几个电角度之间。这个参数没有理论公式得实测调。4.4 补偿强度的整定补偿表里的数值是标定得到的但直接全量叠加可能过补或者欠补。因为标定时的工况和实际运行工况不完全一样比如电流大小不同、温度不同齿槽转矩的幅值会有变化。所以通常要加一个补偿增益 (K_{comp})范围在 0 到 1.5 之间可调。(K_{comp}1) 表示全量补偿小于 1 是欠补大于 1 是过补。调试时我一般从 0.5 开始逐步加到 1.0观察低速爬行时的平滑度。过补的话电机会有高频抖动欠补的话还是有齿槽感。找到那个“刚刚好”的点通常就在 0.8 到 1.2 之间。5. 实测中那些文档不会告诉你的坑5.1 编码器偏心会毁掉整张表这是最隐蔽的坑。编码器如果安装偏心转子转一圈的过程中编码器读数和真实机械角度之间会有正弦形的偏差。这个偏差会被标定流程当成齿槽转矩的一部分记录下来补偿表里就混入了“假齿槽”。运行时补偿这个假齿槽等于给电机加了一个和偏心同频的扰动效果适得其反。判断方法标定完之后看补偿表的波形。如果波形里有一个明显的低频正弦分量一圈一个周期那大概率是编码器偏心。真正的齿槽转矩是高频的一圈有几十个周期。遇到这种情况要么重新安装编码器要么在标定数据里把这个低频分量滤掉。5.2 电流采样噪声会污染标定数据标定时的电流采样噪声直接进入补偿表。如果电流采样没有做好滤波或者采样时刻和 PWM 不同步噪声会很大。odrive 用的是下桥臂采样或者 inline 采样对采样时刻有严格要求。如果你自己移植代码采样时刻没对齐标定出来的表就是一团噪声。我的做法是标定前先看电流采样的原始波形确认噪声在可接受范围内再开始标定。如果噪声大先解决采样问题别指望后期滤波能救回来。5.3 温度漂移与补偿表的时效性齿槽转矩的幅值会随温度变化因为永磁体的磁性能随温度变化。冷机和热机标定出来的表不一样。如果你的应用对低速平滑度要求极高可能需要做温度补偿或者在不同温度下分别标定。一般应用里在热机状态下标定一次就够了因为电机正常工作时就是热的。5.4 齿槽补偿和 PID 的相互影响开了齿槽补偿之后位置环的 PID 参数可能需要重新调。因为补偿改变了系统的等效扰动特性原来的 PID 参数可能不再最优。我一般建议先调好 PID再加齿槽补偿加完之后微调 PID。顺序反了的话你会搞不清楚到底是补偿在起作用还是 PID 在起作用。6. 不同平台上的实现差异6.1 STM32F405 上的 odrive 原生实现odrive 固件在 STM32F405 上跑齿槽补偿是集成在电流环里的。它的补偿表存在 Flash 里运行时加载到 RAM。整个流程封装得比较好用户只需要跑标定命令然后使能补偿就行。但如果你想改采样点数比如从 3600 改成 7200需要改固件里的宏定义并重新编译。改完之后标定流程也要相应调整因为标定时的采样逻辑和表长度是绑定的。6.2 DSP28379 上的移植要点TI 的 DSP28379 是很多工业伺服用的主控性能比 STM32F405 强不少。在 DSP28379 上移植齿槽补偿主要差异在浮点运算和存储布局。DSP28379 有更大的 RAM 和更快的浮点单元你可以用更多的采样点比如 7200 甚至 14400来获得更高的补偿精度。但要注意采样点多了之后标定时间会变长因为每个点都要采到。另外 DSP 的中断优先级配置和 STM32 不同要确保齿槽补偿的计算在电流环中断里完成不能拖到后台。6.3 SimpleFOC 配 STM32F405 的轻量方案SimpleFOC 是一个轻量级的开源电机控制库很多人拿它配 STM32F405 做验证。SimpleFOC 本身没有内置齿槽补偿但你可以自己加。思路是在 SimpleFOC 的电流环外面套一层查表补偿用 SimpleFOC 的位置传感器读数做索引。因为 SimpleFOC 的代码结构比较清晰加这个功能不难。但要注意 SimpleFOC 的电流环频率通常比 odrive 低补偿的相位滞后会更明显超前补偿要调得更大一些。6.4 各平台关键参数对比平台主频典型采样点数补偿表存储电流环频率备注STM32F405 odrive168 MHz3600Flash/RAM8-24 kHz原生支持开箱即用DSP28379200 MHz7200-14400RAM10-20 kHz性能强可上更高分辨率STM32F405 SimpleFOC168 MHz1800-3600RAM1-5 kHz需自行实现注意相位滞后STM32F103C8T672 MHz900-1800RAM1-2 kHz资源有限点数要降这张表里的数字不是死的具体要看你的电机和应用需求。核心原则是电流环频率越高允许的采样点数越多补偿效果越好MCU 资源越紧张越要控制点数。7. 怎么验证补偿到底有没有用7.1 看电流波动的频谱最直接的验证方法是让电机在补偿开启和关闭两种状态下分别以极低转速匀速旋转记录 q 轴电流做 FFT。如果补偿有效齿槽对应频率的幅值应该明显下降。齿槽频率等于转速乘以齿槽周期数。比如转速 1 转/秒齿槽周期数 60那齿槽频率就是 60 Hz。看 60 Hz 及其谐波的幅值变化一目了然。7.2 看位置跟踪误差在位置控制模式下给一个缓慢的斜坡指令看实际位置和指令位置的偏差。补偿开启后偏差的峰峰值应该减小。这个方法比看电流更贴近实际应用因为最终用户关心的是位置精度。7.3 手感测试最土但最有效的方法用手转电机轴。补偿关闭时你能明显感觉到一圈里有几十个“咯噔”补偿开启后手感应该变得顺滑很多。这个方法虽然不量化但很直观适合快速判断补偿有没有生效。7.4 注意验证时的工况一致性验证时要注意工况一致同样的转速、同样的负载、同样的温度。如果两次测试工况不同对比就没有意义。我一般会在同一台电机上同一时间段内交替开关补偿做对比排除环境变化的影响。8. 采样点数还能怎么优化8.1 变分辨率方案3600 是固定分辨率但不同电机的齿槽周期数不同。对于齿槽周期数少的电机3600 个点其实过剩了对于齿槽周期数多的电机3600 个点又偏少。一个优化思路是变分辨率根据电机的齿槽周期数动态决定采样点数保证每个齿槽周期内有足够的点。比如设定每个齿槽周期至少 64 个点那么采样点数就是 (64 \times N_c)。这样既不会浪费也不会不够。8.2 谐波建模替代查表齿槽转矩是周期性的可以用傅里叶级数建模。与其存 3600 个点不如存前几十个谐波的幅值和相位运行时用谐波合成计算补偿量。这样存储量大幅减少而且天然平滑没有插值误差。缺点是计算量比查表大而且谐波阶数要选够否则会丢失细节。对于 MCU 资源紧张但又想要高精度的场合这是个不错的折中。8.3 自适应补偿固定补偿表的问题是工况变化后补偿效果下降。自适应补偿的思路是运行时持续监测电流波动用某种自适应算法在线调整补偿表的数值。这样能跟踪温度漂移和负载变化。但自适应算法复杂容易不稳定工程上用得不多。一般应用里固定表加手动增益调节就够了。齿槽补偿这件事说到底是个“测量-建模-补偿”的闭环。3600 这个数字不是什么神秘常数它是在常见电机参数、常见编码器分辨率、常见 MCU 资源这三个约束下算出来的一个工程最优解。你完全可以根据自己的电机和硬件把这个数字改大或改小。关键是理解背后的权衡逻辑而不是死记这个数。我在实际项目里用过 1800 点也用过 7200 点效果差异在大多数应用里并不明显真正影响效果的是标定质量、相位对齐和补偿增益的整定。把这几个环节做扎实了3600 个点足够让电机跑得丝滑。
返回列表