在校准过程中,我记录了编码器(速度已知)的两个电压。创建这个(Angular 上的电压),然后我需要测量电压并得到相应的Angular 。
我也想找到记录点之间的值,以获得更高的精度,某种arccos查找表,但我被卡住了,无法找到有效的方法来做到这一点。
我需要通过比较很多数组来研究数组中的值吗?那会很慢,对吗?
我试过使用反余弦函数,但我想这不能补偿机械的不规则性,而且我已经计算了波的平均值和振幅。
编辑:如前所述,目标是测量FOC电机的位置。设置如下:
这是我用atan2函数得到的结果:
x = 2*(hallA.read() - moyenneA)/(maxA-minA);
y = 2*(hallB.read() - moyenneB)/(maxB-minB);
3条答案
按热度按时间kd3sttzy1#
最后,除了更频繁地采样外,你无法向数据中添加更多的信息。也就是说,你可以用线性插值法来估计任意两个测量点之间的电压。2详细信息可以查线性插值法,但总结一下,如果你在A点和B点之间有一个时间点C,它是A点和B点之间距离的25%。然后计算加权相同的电压,即电压C =电压A + 25%(电压A -电压B)。
至于计算Angular ,这不是我的专业领域,但我想我会计算感兴趣点之后1/2采样时间的线性插值和感兴趣点之前1/2采样时间的插值,并计算斜率的Angular 。我不是信号处理Maven。关于这个主题的书很多。还有其他插值函数可用,阅读有关信号处理插值在互联网上可能会得到你吨更多的信息。
如果您担心数据中的机械或电气噪声,那么我建议您使用平滑算法。我知道快速傅里叶变换非常流行。但我肯定还有很多其他选择。互联网上肯定有过滤库和算法。但正如我所说,这不是我的专业领域。也许我的回答会引起其他人更专业的回答。消除高频噪声的一个方法就是减少采样频率。
g0czyy6m2#
正如前面提到的,你的数据包含噪声和振幅失真。然而,你的数据很可能也包含时间失真(正弦波的Angular 参数是非线性的,也不是精确/恒定的相移),这将使
atan,acos,asin
的使用非常不准确和有问题。我会:
1.FIR滤波数据
所以使用以值为中心的滑动平均值,这样输出就不会相移。这是
O(n)
,并且一个只有一次。不要忘记使用临时数组...1.检测单调间隔
简单地检测信号只减少或只增加的间隔...这也是
O(n)
,只做一次。1.使用二进制搜索
只需遍历所有间隔,如果测得的电压在其范围内(间隔的第一个和最后一个值),则对间隔进行二进制搜索。间隔的选择为
O(1)
,因为间隔数始终为4
或5
,具体取决于起始相位。二分查找本身是
O(log(n))
下面是一个C++/VCL小示例:
我从你的图像中提取输入数据并转换为
[V]
和[deg]
。你可以忽略VCL渲染和窗口的东西。这里唯一重要的是这些函数:第一个预先计算所有需要的填充(只调用一次),第二个返回电压
u0,u1
的[deg]
中的Angular 。然而,如果您的
u0,u1
接近间隔边缘,其中一个电压在一个间隔中,另一个在下一个间隔中,如果添加噪声,可能会发生这种情况,则可能会有轻微的准确性问题。在这种情况下,您可以分别对u0
和u1
进行二元搜索,记住两者的2个位置,然后检查4个组合中哪一个是正确的。之后,只需使用找到的两个索引之间的中间位置。为此,你也可以将间隔分开(但每个信号只有2或3个)。你也可以通过在二进制搜索后添加线性插值来增加**“亚像素”精度**(我太懒了,所以不在我的例子中)
这里预览:
红色、蓝色曲线是
u0,u1
信号,灰色线是找到的间隔边缘,点是测试(测量)电压,白色是找到的Angular6ie5vjzr3#
如果您需要插值,则需要 * 重构滤波器 * 从一组样本重构测量信号,或至少在采样值之间获得(最佳)插值,以获得符合您需要的数据集。
最基本的方法是线性插值;例如,在两个测量值之间加上一个值,即这两个测量值的平均值。这是一个简单的算法,你可以从旧的数据集生成一个新的、更大的数据集,或者动态插值。
大多数示波器使用sin(x)/x重构滤波器,与线性插值法相比,该滤波器可提供更精确的采样输入信号重构。
如果你想摆脱不规则,你可以使用移动平均滤波器,或(更复杂的)FIR滤波器,但这会使事情变慢,当你处理“现场”。
如果你想知道更多(可能比我知道的更多),你可以试着问他关于EE的问题;他们有我怀疑你想要达到的所有理论。