Blogs

如何估算编码器速度而不制定愚蠢的错误:第一部分

杰森萨赫斯2012年12月27日30评论

这是一个常见的问题:您有一个正交编码器来测量电机的角度位置,并且您希望了解位置和速度。你怎么做呢?有些人做得很差 - 这篇文章是如何不是他们之一。

好吧,首先我们需要得到位置。正交编码器是 增量编码器,意味着它们只能测量相对变化的位置。它们产生一对脉冲列车,通常称为A和B,看起来像这样:

本文以PDF格式提供,便于打印

您需要两个以便区分前向和反向运动。如果您需要了解绝对位置,您可以使用A和B信号以及每次旋转产生一次脉冲的索引信道,以便以参考位置为信号来购买3通道编码器。

状态机可用于检查A和B脉冲并产生向上/向下计数到任意宽度的计数器,并且索引脉冲可用于在启动时将计数器初始化为0。这里有一些微妙之处涉及噪音和失败模式,但至少让他们忽略它们,至少为这篇文章。

大多数微控制器都有内置编码器外围设备,或者中断输入 - 变化或两者。如果您没有编码器外设,则必须自己检查信号并递增/递减计数器。在任何情况下,让我们假设您可以基于编码器信号获得正确的位置计数值。我们的问题成为采用位置计数器和估计速度的样本之一。

这是一个具体的例子。让我们考虑一个旋转但由于粘性阻力而逐步减慢的对象。这是位置可能如下所示:

在这里,我们显示了对象(转换为编码器计数)的实际连续位置,以及由编码器输出指示的量化位置。量化?是的,增量和绝对编码器areDigital并具有量化效果。一个正交编码器,被广告为“256线”或“256 PPR”(每次旋转脉冲)测量每转1024计数:正交编码器每周期产生4计数,每个循环对应于“线”(光学编码器中的暗标记)或在示波器上测量的脉冲。

在任何情况下,我们都有很多选择来获得位置计数的速度。

最简单的方法是估计速度=ΓPOS /î”T:测量位置的变化并通过变化划分。这里有两个经典选项:

  • 以固定时间递增执行代码(常数Γt),测量位置,并采取Δpos =两个连续位置测量之间的差异
  • 执行代码由编码器计数中的更改触发(常数ΓPOS),测量经过时间,并采取ΔT =两个连续时间测量之间的差异

通常的解释是,第一方法(常数ΓT)对于中等速度和第二种方法更好(常数ΔPOS)更好地用于低速。德州仪器有一个 用户指南(Sprug05a) 详细讨论这一点:

这是说:

在低速,等式2提供更准确的方法。它需要一个位置传感器,该位置传感器输出固定间隔脉冲序列,例如上述正交编码器。每个脉冲的宽度由电动机速度限定给定的传感器分辨率。

[提示蜂鸣器声音] 错误的!!!!!!!

本文的其余部分将是关于了解为什么该陈述是错误的,为什么常量î“POS方法是一个糟糕的选择,并且(在第II部分)一些更高级的估计位置的算法。

首先,我们必须了解什么会驱使某人选择常量î“POS方法。这样做的关键在于我以上引用的第二句:“它需要一个输出一个位置传感器 固定间隔脉冲系(如上述正交编码器)。“如果在正交中有一对常数频率方波,则按规则间隔测量代码中的编码器位置,您可能会看到这样的内容:

底部两个波形是平方波,频率为1618.03Hz = 0.61803毫秒(编码器计数间隔为1/4 = 0.154508毫秒= 6472.13Hz)。顶部两个波形是那些相同的波形,但以0.1毫秒的间隔采样。

您将注意到,这些采样波形所感知的编码器状态变化之间的时间不规则地在0.1毫秒和0.2毫秒之间变化;我们不能准确地测量0.154508毫秒的间隔,代码以0.1毫秒粒度执行。使用常量î“T方法来测量速度的代码,用Δt = 0.1毫秒,将测量每个采样间隔的0或10000Hz的速度。 用于使用常数î“T的代码的速度分辨率,用于使用常量Δt,是1 /î“t。

这导致三种常规冲动:

  1. 为什么我不刚刚使用更大的î?然后我的速度分辨率较小。
  2. 为什么我只是在î“POS /î”的计算上只使用低通滤波器?
  3. 为什么我不用常数 Î”pos approach?

我们稍后会讨论其中的前两个。常量î“POS方法(即,在每个编码器状态变化和测量时间), 用于固定频率波形,实际上是最佳方法。如果我有一个0.1微秒精度的计时器,并且我在每个编码器状态变化上都会得到一个中断,那么我的速度分辨率不是恒定的,就像常量î“t接近,但是替代才能取决于频率。对于该特定的波形组,表示每个状态变化0.154508毫秒的编码器状态频率,0.1微秒定时器分辨率将测量状态变化= 6472.5Hz或6468.3Hz之间的0.1545或0.1546毫秒 - 用于约4.2Hz的速度分辨率。我们的波形较慢,我们的速度分辨率越精确,可以使用常数ΓPOS方法。

那有什么问题?

好吧,有一件事,随着波形变得更快,精度变得更糟,并且我们将获得的中断越来越大,导致CPU使用量增加。还有零速度振动的情况:然后必须区分正面和负面的位置变化,并且在这种情况下的速度估计可能会过度。那些问题非常明显。

这里更微妙的问题是常数î“POS方法的最佳性 is true 只要 用于固定频率波形。如果频率以未知方式随时间变化,则常量ΓPOS方法仅为我们提供编码器状态更改的时刻之间的平均频率,这可能不是我们想要的。我还说“我们的波形较慢,我们的速度分辨率越精确即可” - 和 精确的 与...不同 准确的.

让我们回到较早的指数衰减的例子。 

以下是使用常量ΓPOS方法时估计速度波形的样子:

蓝色是此时的实际速度,绿色是估计的速度。请注意绿色波形如何始终高于蓝色波形。一般而言,这始终是真的,由于任何真实算法的后视属性:当速度下降时,任何速度估计都会滞后并太高,并且当速度增加时,任何速度估计都会延迟太低了。

现在记住,我们只在获得编码器位置的更改时更新估计值。这是常量î“POS方法的问题。假设我们测量的对象正在沿着一定慢但恒定的正速度移动:编码器计数定期更新,并将正确地计算此速度。现在对象停止了。没有更多的编码器计数。但直到我们得到另一个伯爵,我们不会更新速度估计值!我们从未估计零的速度!我们可以用黑客“修复”这个问题:设置超时,当超时到期时,估计零的速度。这些信号处理中的这些修复通常非常糟糕:它们很难分析,您无法预测修复程序是否会被反馈。

除了零速度问题之外,问题一般是由于两个波形之间的区域:实际和估计的速度。在良好的速度估计器中,该区域将始终受到与加速率成比例的数字的限制。在这里,该区域更越偏好,我们速度偏好。为什么我们关心?因为该区域是速度的积分,所以它是位置:如果您随着时间的推移集成了速度估计,则应在开始时恢复相同的位置值。 当您集成速度估计以获得位置时,常量ΓPOS方法不会产生有界位置漂移。 在所有系统中这件事吗?不,但是,每当使用估计速度的积分时,它会产生后果,例如在PI控制器中。

另一个密切相关的问题是获得速度估计的时间:它们不是恒定的时间间隔,而是在每个位置计数的每个变化下发生。除了在具有高速度的不可预测的时代获得大量中断的不便,这意味着它们与定期采样的控制系统不直接兼容。控制系统背后有很多有价值的理论,以定期执行,并且有很少的原因偏离这种方法。如果您有一个定期运行的PI控制器,并且它会从常数ΓPOS方法中获取速度估计,速度估计更新将始终存在时间延迟,以及使用它的时间点:速度估计以它使用的速率有效重新采样。此时间延迟不是恒定的,导致实际和估计速度波形之间的其他区域:

它并不多,但它会导致额外的错误。 (仔细观察这个图表和前一个图。)

到目前为止所有这些讨论都对编码器带来了一件事:这是一个完美的测量装置。我们量化了实际位置的完全平等的间隔。实际位置编码器由于制造公差而具有错误。

使用常量î“POS方法的主要错误是假设编码器是完美的。不是。让我们来看看我之前使用过的编码器,Avago Heds-55xx / 56xx系列。如果你看p。 4-6的数据表,您将看到编码器波形中的错误的规范,图表和定义。以下是定位准确性规格:

这里具有最佳规格的编码器是HEDS-5540/5640编码器,其指定状态宽度误差ΓS = 35度电气最大值,典型5度。如果我们使用î“POS方法来估计速度,这对我们来说意味着什么?

每个编码器状态是名义上90deg电气,所以±35度电误差是±39%的误差; ±5度电误差为±5.5%误差。我们计算v =Γθ/Δt。时间测量ΓT由CPU时钟的精度决定,该晶体振荡器通常为50ppm或更小 - 基本上可忽略不计。因此,速度的误差与î“î¸中的错误成比例,通常是从一个编码器状态到下一个编码器状态的误差。

我们可以使用每个边缘和第4个前沿之间的时间代替;这是数据表中指定的循环时间C. ΓC的错误是典型的3度,最大值5度 - 具有360度的总循环,功率为0.8%,最大1.4%。

请注意,这些错误不是DC错误,它们从一个状态或一个周期显示为抖动到下一个状态。因此,如果我们平均这些速度估计,那么误差会衰减,这对于高速很好,但废墟使用一个编码器边缘到下一个编码器边缘之间的时间 - 但这是使用常量î“POS的整点方法!

这就是为什么我不建议使用它。如果您正在使用编码器,并且您可以分析数据表以确定典型或最坏情况错误,并且如果必须,您可以继续使用这些数字并使用常量î“POS。

好吧,如果常量î“PO出局,剩下什么?

让我们公平,并通过同样的分析来看待常量î“的方法。在这里,我们必须估计。让我们假设我们测量的位置计数代表编码器状态的中心。使用完美的编码器,采样在任何给定的即时的位置可以偏离高达45摄氏度:实际位置可以位于脉冲的任一边缘。这意味着在两个连续测量之间,我们可以在90度的电气中关闭。

这是真的的示例:我们在一个编码器状态的开始处进行一个测量,并且在相同的编码状态的另一端附近的下一次测量,因此位置的真实变化是90度电气,并且估计的位置变化是0.或者我们在编码器状态转换之前进行一次测量,并且在以下转换之后的另一个测量,因此位置的真实变化是90度,并且位置的估计变化是2计数= 180度。对于具有35度电气的最坏情况状态宽度误差的不完美编码器,在这两种情况下的位置的实际变化的最坏情况值为90 + 35 = 125摄氏度,用于估计0,或者90-35 = 55摄氏度,估计变化为180度;这两种情况都补充了不完美编码器的最坏情况错误,在125度的ΓPOS中的总差别错误。

此错误是一个属性 编码器,不是使用的算法。

我想在这里制作的那一点是,因为编码器是不完美的,我们将有一个我们只需要期待和接受的位置错误。通过常数î“T方法,这转化为恒定的最坏情况速度误差,与速度无关。我们有选择哪个î“T我们想要使用,这让我们回到了早些时候提出的两点:

  1. 为什么我不刚刚使用更大的î?然后我的速度分辨率较小。
  2. 为什么我只是在î“POS /î”的计算上只使用低通滤波器?

选择î“t 导致权衡。如果我们选择一个大胆的î“t,我们会得到非常低的速度错误,但我们也会获得低带宽和大型时间滞后。如果我们选择一个小î“T,我们会得到非常 高带宽和小的时间滞后,但我们也将具有高速估计误差。

如果我使用基本方法来估计角速度,我将采用主控制回路速率的位置估计,取得连续样本之间的差异,除以î“t,并且用时间常数低通过滤波结果ï“将带宽和误差减少到最小可接受的可能性。 (一个1杆或2极IIR过滤器应该足够;如果使用那种计算昂贵但内存便宜,请使用圆形队列来存储最后一个样本的位置,并延长有效的î“t倍数。)

如果您正在使用测量/显示目的的速度估计,那么您都完成了。如果您正在使用对控制目的的速度估计,请小心。最好将滤波最小并接受速度误差作为整体控制回路性能拒绝的噪声。

我们能做的最好吗?不完全的。我们将讨论本文第二部分中的速度估计的一些先进技术。


[]
评论 Kevbo.2018年2月15日

我将添加我的2美分:Â不是正交编码,但是使用脉冲输出流量计出现的类似问题:Â流量是脉冲/Δt,这是过程控制通常需要的。

我已经看到三个不同的程序员**Â这计算了这种方式,然后继续整合那些流读数以获得卷。 (通常需要维护间隔或审计等)Âuhhhh .....

如果您没有看到问题:脉冲/ deltat是一种衍生物,*它们将集成。这两者都有潜在的错误源。概率的正确方法Â卷的速度只是为了计算脉冲,因为每个脉冲表示固定卷。

最后,我看到的另一个大错误是使用浮点变量作为卷累加器。这在累积到足够的音量之前,在低流量的卷上,每间隔音量小于您的尾数的最低数字。 。这导致你逐渐增加卷。这永远不会被抓住调试测试,因为它们永远不会让它运行足够长的时间来推动足够高的累加器指数。 - 双重精度浮动帮助,或常规转移累积的Aub - 对“主累加器”的零和子累加器的复位是用于坚持浮点的带有辅助设备。 - 我宁愿使用整数。 (几个如果需要)。Â当原始计数分为转换为单位时,我保存剩余部分(Modulo)并将其添加到下一个间隔的计数值中,从而避免截断错误。最终增加了剩余的剩余物整个单位(加仑)和错误返回零。

*好的,它不是严格的连续时间衍生,而是对这次讨论相同的事情。

**实际上是一个程序员使用脉冲输入到电子车速表,转换为速度,然后集成到距离。它是相同的问题,只是速度和距离,而不是流量和距离。 




[]
评论 我喜欢奶酪2013年11月8日
你不能离开我们这样挂!第2部分在哪里?
[]
评论 JMS_NH.2014年6月25日
对不起,我错过了注意到你的评论 - 我做了第2部分:

http://www.dianjingline.icu/showarticle/530.php
[]
评论 Evan B.2013年1月7日
非常有兴趣阅读第2部分。
[]
评论 Stephaneb.2016年6月9日
第一个图像似乎已经消失了。
[]
评论 JMS_NH.2016年6月9日
谢谢,URL改变了>:( -- i'll fix
[]
评论 kenny_l.2018年7月6日

这里真的很棒的文章。非常感谢时间来解释和写下这一切。你教我们很多。在看到和理解所提出的问题后,我肯定会使用这些技术。

现在快速注释......对于说“0.1微秒定时器分辨率将测量0.1545或0.1546毫秒的部分变更”的部分。那应该是100微秒定时器分辨率,对吗?这可能是一个次要的错字。再次感谢!真正欣赏本文,也是第2部分。

[]
评论 Westfw.2013年1月3日
我必须问 - 为什么我们试图从位置数据重新推出速度(引入额外的错误层),当我们可以简单地将其计算在同一Pin-Change ISR中,这是首先计算位置。不计数“停止”,速度仅为1 / dT,其中dt是任何两个信号转换之间的时间增量。是的,这将受到相同的错误,但并非如此基于位置的速度,并且似乎更容易“平滑”边缘时间的速度计算而不是位置的样本时间。
(如果您有编码器外围设备,这可能不适用......)
[]
评论 JMS_NH.2013年1月4日
Westfw:您建议*的方法*是*常量的delta-pos方法。您实际上不计算一个Delta-POS,它是一个常量:+/- 1编码器状态。 (记住你必须跟踪方向。)

关于平滑:当执行速率变量和不可预测时,过滤真的不起作用。
[]
评论 Sparkygsx.2013年1月3日
我过去所做的是,正在录制当前位置(根据适当计数或下降),以及最后一步向前和反向的时间戳。运行控制循环的代码以固定和相对慢的间隔读取那些3个参数,并保留上一个周期的记录值的副本。基本上,您需要在最近的事件和上一个周期的最后一个事件之间的时间,并将事件的数量除以,以确定自控制循环的最后更新以来事件之间的平均时间。如果录制的先前值仅在有新事件时覆盖,则覆盖了输入频率低于循环更新频率的情况,并且自上次录制的事件以来的时间为您提供了速度的上限,因此当收到事件时,它将渐近转到0。
[]
评论 Sparkygsx.2013年1月4日
我忘了说明:我描述了δ-time和delta-position模式之间的类型无缝过渡,同时最大限度地减少了两者的主要噪声源;您永远不会衡量一些事件+/- 1的时间,这导致低速或+/- 1个循环事件的间隔发生问题,这导致高速问题。

基本上,这是第三个明显的方法:它计算了Delta位置/增量时间,既没有固定,而且两者都最大化。

时间戳可以是非常高的分辨率,因为它可以是最大时钟速度的自由运行计数器。

当然,它仍然是最小化中断延迟的重要性,因为这限制了输入频率,尤其是延迟抖动,因为这决定了时间戳的准确性。
[]
评论 JMS_NH.2013年1月4日
我同意,在规则采样位置测量之间添加边缘时间的新信息是一个潜在的改进。但该信息需要仔细纳入。您所描述的方法真正需要从信号处理透视或模拟或与更传统的方法进行模拟,以显示它导致提高精度并且不会引入误差。 (特别是考虑编码器边缘周围的振动案例,或突然加速/减速)

在第II部分,我将讨论一些更复杂的方法,也具有一些稳定的理论背景。
[]
评论 Sparkygsx.2013年1月4日
我的2条评论在哪里?我对我之前使用的方法写了一篇相当长的一件措施,以避免通过计算每个控制回路周期的最后脉冲的脉冲和记录时间戳,这将是既不是Delta的Δ位置/增量时间方法常数,包括一些简单的修复用于零速度和非常低速的速度。我已经努力了,看起来你刚刚删除了它!
[]
评论 JMS_NH.2013年1月4日
他们没有删除!我认为论坛软件会自动批准多次评论。我刚批准他们所以他们是。
[]
评论 Sparkygsx.2013年1月4日
很奇怪,我可以在他们消失之前大约半小时看到消息。不用担心。

我确实同意我所描述的方法必须分析。我之前使用过它在宽带频率测量之前,当不存在前后踩踏问题时。在这种情况下,它解决了两种模式中提到的问题,其中包含固定的Δ-pos或固定的增量时间,以及如果您实现两者,潜在的交叉问题。除了可能略有增加CPU负载,我找不到任何潜在的新问题。

我建议单独记录最后一个上调事件的时间戳,并根据依靠循环方向使用,并且使用Δ-位置与事件的数量相反,以抑制由后退和向其踩踏引起的速度高估。

当然,一些问题,就像渠道相移的错误,这样仍然会导致不准确。一个可能的改进可能是测量相同边缘事件的两个出现之间的时间;这至少可以消除传感器放置错误。纠正不完美的车轮插槽放置可能有点困难。如果您有索引信号,可以在某种校准程序后存储单独事件的角度,但我认为这将是相当复杂的和CPU和内存密集。

但是,我对你的解决方案很好奇。
[]
评论 Sørenfriis.2013年1月14日
非常有趣。期待第二部分:)!
[]
评论 p1r2013年1月22日
有趣的阅​​读肯定想读第二部分。
驱动电机时:代替使用正交编码器,您也可以使用单通道编码器和方向是间接地知道的,因为您知道您正在驱动电机的方向。我在消费电子产品中看到过这一点,在那里节省一个霍尔传感器可以有意义。
[]
评论 Sparkygsx.2013年1月23日
这可能在某些情况下工作,但有一些需要考虑的事情:首先,在某些情况下,如果负载可以向电动机提供扭矩,电动机可以旋转相反的方向,并且第二,如果电机停止,则如果存在滞后不足,则小振动可能导致传感器产生脉冲。
[]
评论 蒂斯特蒂科特2013年11月19日
我已经看到了一些非常糟糕的事情,试图依靠这种方法。如果你可以绝对确定电机只在一个方向上旋转,但我已经看到它在需要在低速下工作并通过电机的速度逆转所需的控制回路中尝试了它,这是一个绝对灾难。
[]
评论 JMS_NH.2013年1月25日
^^火花说的是什么。 :)
[]
评论 Mrajesh_9.2013年2月24日
我正在使用TMS320F2812进行开关磁阻电机的传感位置。我的电机有四个霍尔传感器,每个霍尔传感器均由7.5度移位。每个传感器每个传感器都有六个脉冲 革命 S1,S2,S3和S4在周期和30deg OFF期间用30deg的7.5deg移位。 S1-S3和S2-S4形成一对正交信号。我不知道我应该用于传感位置的方法。我使用了Simulink接口,但Simulink触发器无法使用套件。我尝试了捕获和计时器.Also
[]
评论 休眠2013年2月24日
第2部分的前景是什么?
迈出这一点是戏弄!
[]
评论 volkhen.2013年3月2日
你的博客是我很长一段时间的搜索。我真的很悬手,有人如此经历的是分享他的知识。我期待着第二部分。同时我将根据我的直流电机伺服驱动器中的建议改变我的PID算法。
[]
评论 Mikecook.2013年4月1日
优秀的文章。像往常一样,这是非常有效的。也许我可以用它来解释给我的老板,而在有用的速度测量方面,事情比他们出现的事情更难。我期待第2部分。
[]
评论 Saneesh MP.2013年8月19日
您可以共享更有效的方法来估计低速。

谢谢
saneesh.
[]
评论 Max252016年4月30日
我无法理解为什么你写了关于问题的关于衡量ΔT,CPU负载,中断,计时器,计时器,具有0.1微秒的精度等?所有MotorControl微控制器都可以通过硬件测量编码器边缘之间的时间,而无需程序代码。当您需要计算速度PID时,您需要从锁存时间的寄存器获得结果。
[]
评论 JMS_NH.2016年4月30日
所有MotorControl微控制器都可以通过硬件测量编码器边缘之间的时间,而无需程序代码。

这不是估计速度的好方法。对于缓慢的旋转,对于快速旋转,它可以适用,并且对编码器边缘的制造公差敏感,我在本文中提到的另一个(//www.dianjingline.icu/showarticle/444.php)
[]
评论 Markus472016年9月28日
是否会有一部分?
[]
评论 JMS_NH.2016年10月8日

第三部分需要更多的调查 - 不幸的是,至少在接下来的12-18个月内我没有时间。对不起。

[]
评论 bandicoot.2016年10月11日

不用担心。我很期待,直到你找到时间。

我真的很好奇你如何关闭数字编码器,PLL和观察者之间的差距。据我所知,PLL似乎与角度跟踪观察者有关,该观察者使用rollegers但不是数字编码器。

数字编码器上论文的任何推荐与观察者或其他主题的任何其他时间相结合?

要发布回复评论,请单击连接到每个注释的“回复”按钮。发布新的评论(不是回复评论),请在评论的顶部查看“写评论”选项卡。

注册将允许您参加所有相关网站的论坛,并为您提供所有PDF下载。

注册

我同意 使用条款隐私政策.

尝试我们偶尔但流行的时事通讯。非常容易取消订阅。
或登录