基于微控制器的角度传感器IC的线性化
基于微控制器的角度传感器IC的线性化
杜米尼克聊聊,
雷竞技竞猜下载快板微系统有限责任公司
介绍
磁角传感器通常是快速、可靠、非接触测量系统角位置的好选择,特别是在光学编码器可能不适合的肮脏环境中。
雷竞技竞猜下载Allegro MicroSystems,LLC为不同的应用提供广泛的角度传感器IC[1]。这些传感器IC可以测量直径磁化编码器磁铁的角度雷竞技最新网址
在侧轴或端轴的-设置,如图1所示。
轴末端角度测量(右)
测量误差
所有的Allegro角度传感器ic在工厂的最终测试中使用均匀磁场进行校准。这样做是为了尽量减少传感器的固有误差。然而,特别是在侧轴应用中,传感器传感器处的磁场角度与要测量的轴的机械雷竞技最新网址角度不相同。造成这种差异的主要原因是编码器磁铁发出的磁场的形状。
机械和磁场角度之间不匹配的其他来源包括磁铁未对准、磁铁缺陷、剩余传感器不准确度和漂移以及铁磁性材料的存在。
由此可以得出结论,所有的系统,特别是侧轴的系统中,从编码器的角度和所测量的角之间的失配受损。用于侧轴应用中的典型转移曲线在图2中可以看出。
侧轴设置中的角度
这些测量误差称为非线性,可以通过称为线性化的过程来补偿。
线性化
一些快板传感器IC,如A1335, 这AAS33001,而且AAS33051具有嵌入式逻辑,允许输入数据的线性化。然而,其他的传感器IC,如A1330那A1333.那A1337.那A1338, 或者A1339.,芯片上没有此功能。如果使用没有内置功能来线性化数据的传感器IC,则可能需要使用微控制器进行外部线性化,以在特定应用中达到所需的精度。
本申请须知将:
- 说明线性化的基础
- 展示如何处理真实测量数据以计算校正数据
- 详细介绍了校正数据的三种存储方法
- 详细说明如何应用修正
- 比较所提出方法的准确性
定义
编码器角度
一个精确的,高分辨率的外部编码器报告的角度。
感应角度
角度传感器IC所报告的角度。
角度错误
角度误差是通过角度传感器IC测量的磁体的实际位置与磁体的位置之间的差异。这是通过从传感器角度减去编码器角度来计算的:
误差=(α_sensor - α_encoder)。
但是,如果传感器角度为359°,则编码器角为0°,则误差应为-1°且不+ 359°。要在±180°之外的任何错误缠绕,可以使用Modulo操作员:
错误=mod[(α-u传感器-α-u编码器)+180360]–180。
图3给出了侧轴应用中角度误差的样图。
最大绝对角度误差
最大绝对角度误差是磁体的实际位置和由传感器IC的角度超过一整圈旋转测量的所述磁体的位置之间的最大绝对差。
在图3中,最大角度误差为21.46°,在56°的编码器的角度测量。
线性化的目标
线性化的目标是确定,存储和应用一个功能,该功能最小化测量的传感器角度误差与编码器角度值相比。这最大限度地减少了测量的传感器角度和实际编码器角之间的差异。
这个目标可以通过不同的方式实现。本文将详细介绍三种常见的技术。雷竞技最新网址
所提供的技术依赖于单个校准阶段(通常在客户的行尾测试中执行),在此之后应用固定的校正功能。
先决条件线性化
使用这里详细介绍的技术进行线性化的先决条件如下:
- 在生产期间,公知的角度需要被施加到传感器系统。
- 在生产过程中,需要读出传感器角度。
- 所要线性化的系统需要一个微控制器,在生产过程中写入线性化信息,并在应用中进行线性化。
线性化的极限
使用这里描述的方法线性化有一定的限制:
- 线性化不会纠正传感器噪声。
- 校准后传感器的任何漂移将不予校正。
- 校准后机械系统的变化不会通过线性化校正。一个常见的例子是由于振动和扭矩引起的磁体位置的动态变化
- 如果校正时输入位置没有准确记录,校正的精度也会受到同样的限制。
线性化方法
1.数据记录
要生成线性化所需的数据,请测量传感器输出[y0.... YN]以已知编码器角度[x0.… XN]。这些编码器角度不需要等距离,尽管通常使用等距角度常见。
值的记录如图5所示。
2.坐标变换到传感器角作为所述校正功能,以基于传感器数据的工作,所记录的数据点应被变换成在传感器的坐标系。
这意味着,代替表达传感器角度作为实际角度的功能,则需要表达实际角度作为角度传感器的机能。因此,传感器角[Y”0.…是的N选择,相应的编码器角度[X'0.… X'N需要将待确定。要做到这一点,适合需要通过数据点被应用。这可以通过样条内插来完成,如图6。
3.校正曲线计算
为了创建一个将传感器测得的角度转换为编码器角度的函数,需要计算校正值。这些校正值计算为[c]0.… CN] = [X”0.… X'N] - [y '0.…是的N]。
最后,这些值描述了校正曲线C,C,其将校正值作为传感器角度。图8示出了传感器角度的曲线C的曲线图。
4.修正曲线应用到数据
以应用校正到一个测量的传感器数据点,一个校正值C对传感器数据点Y.需要基于校正曲线C进行计算。这在图形表示
正确的角度值X被确定为X = Y + c,如图10所示。
校正曲线存储选项
在本文档中,将研究三种存储校正曲线的方法。有许多其他可能性。但是,此处提供的方法提供广泛的需求,同时需要适度的实现和计算工作。在这些方法中,线性插值是在A1335,AAS33001和AAS33051中实现的硬件。谐波校正仅在A1335中实现。
谐波校正
修正曲线通常具有周期性的形状。通过将其分解为谐波并存储谐波的相位和振幅,可以实现紧凑的存储。例如,在图3中,情况就是如此。
谐波校正的优点是只需要存储很少的参数来校正传感器数据。缺点是单片机需要进行余弦计算,限制了速度。
线性插值
作为第二种方法,可以用分段线性函数来近似修正曲线。
该方法需要更多的存储参数来使用比谐波校正,但需要较少的计算时间。计算方法的代码大小也更小。
查找表
来存储所述校正曲线的第三个方法是使用一个查找表。这需要一个大表,其中校正参数存储,但由于修正值可以直接从查找表中取出,不需要内插步骤。
这使得线性化代码非常简单和快速。
校正方法比较
图11和图12示出了当校正曲线存储为谐波近似,分段线性插值和查找表时,从图3中的数据获得的预期输出之间的比较。
修正曲线测定
本文中的实现是在MathWorks MATLAB中实现的™. 由于这是一种商业软件,使用它需要支付许可费用,这可能会妨碍在生产环境中的使用。一个替代MATLAB的自由软件是GNU Octave,它在GNU GPLv3许可证下免费提供。
本文档中使用的所有功能都由MATLAB和GNU Octave提供支持。
在这些脚本中,假设的是,传感器角度随着编码器的角度增加。如果不是这种情况下,传感器的角度必须与其他处理步骤之前被反转。
传感器输出捕获
用户必须捕获传感器角度输出的初始数据。这是通过设置某些已知的角度来实现的,在本文档中称为编码器角度。然后记录传感器角度。传感器角度是由传感器测量的角度。记录的点数可以比线性修正点数多或少。记录更多的分数,如果
有可能,总是更好。
通常,记录至少16个数据点足以在轴上处于良好的校正性能。在轴外情况下,建议至少32个点。
若要对n段(例如32段)进行分段线性校正,记录至少n个点将充分利用可用的校正点。记录大约2×n个点可获得近乎理想的性能。表1给出了记录点的实际示例。
表1:已记录编码器和输出角
传感器输出溢出拆除
传感器数据中的跳跃约为100°输入角度将导致下一个处理步骤中的困难。通过向跳转到负方向后向所有值添加360°来除去它。此外,数据的平均值应在±180°内,以避免以后处理的其他问题。这是通过以下行实现的:
%%预处理
sensor_data_2 = sensor_data(:);
angle_input = angle_input (:);
%检查是否有至多一个溢流连续上涨
如果有的话(screat(sensor_data_2)== 0)
误差(“传感器数据必须单调递增”)
Elseif sum(diff(sensor_data_2) < 0) <= 1
%上升角数据有零或一个溢出,溢出将被纠正
sensor_data_2 = sensor_data_2(:) + 360 * cumsum([false; diff(sensor_
_2(:))<0]);
elseif和(差异(传感器数据2)<0)>1
错误(“只有一个数据减少允许作为溢出”)
结束
%正确地环绕传感器数据
翻转校正=四舍五入((平均值(传感器数据)-180)/360)*360;
传感器\数据\ 2=传感器\数据\ 2-翻转校正;
结果值如表2所示。
表2:去除溢出后的编码器和输出角度
数据复制
最终,基于从0传感器角度°至360需要°校正数据。为了避免任何边缘效应,传感器的数据将被重复三次。在所有情况下这避免边缘效应通过给可能性总是安全地提取传感器角度360°的值,以720°。
%扩展传感器数据
sensor_data_ext = [sensor_data_2(:);sensor_data_2(:) + 360;...
sensor_data_2 (:) + 720];
%延长输入数据
angle_input_ext = [angle_input (:);angle_input (:) + 360;...
角度输入(:)+720];
投影到传感器数据网格上
在接下来的步骤中,对应于360°和720°计算之间的传感器输出的编码器的角度输入(称为在下面的代码“intermediategrid”)。这与4096个步骤进行,作为这个中间步骤高分辨率利于最终输出质量。
%%使用花键以从有序输入网格移动数据
%到有序输出网格:
有序输出网格=0:(360/4096):(360-360/4096);
Intermediategrid = ordered_output_grid + 360;
投影=样条(sensor_data_ext, angle_input_ext,…)
中间整体);
这个步骤如图15所示。
角度编码器值和传感器输出之间的差是校正曲线,并且可以通过从计算出的编码器匹配的角度减去固定网格传感器的角度来计算。
校正曲线可以在图16中看到。%计算所需的数据的校正:
校正_curve =投影 - 介入;
correction_curve = correction_curve (:);
简要检查是否可以看到此曲线是正确的。在表1中,可以看出,对于137.46°的传感器角度,编码器角度为213.75°。图16的校正曲线显示,在137.5°的传感器角度,需要施加+ 76.29°的校正。AS 137.46 + 76.26 = 213.72°≅213.75°,计算的校正曲线适用。
在接下来的步骤中,校正曲线需要被存储以有效的方式,以使修正值可以为任何输入来计算。这将使用谐波近似,线性插值和查找表来完成。
谐波近似
概念
每个重复信号可以分成它的组成频率。
每旋转一次后,校正曲线重复一次,使其完全可以描述为一组频率。重复修正曲线可以使修正曲线中包含不同的频率更清楚。
谐波近似的一个优点是,仅使用几个参数即可以可接受的精度描述校正曲线。然而,余弦的计算可能过于复杂
慢一些平台或应用程序。雷竞技最新网址
实现
使用傅立叶变换,对于校正曲线的每个组成频率的相位和振幅可以被确定。的校正曲线引线的4096个数据点到4096点FFT的结果。然而,最能在较低的频率。下面,仅偏移值和校正曲线的第一16次谐波被提取:
这产生89.82偏移校正°,并且谐波的振幅以下:%%傅立叶变换纠正,丢弃16th之后的值
%和缩放能量由表中的长度
fft_table = fft长度(correction_curve) / (intermediategrid);
偏移校正=abs(fft_表(1));
correction_pha =角度(fft_table(2:17));
校正_AMP = 2 * ABS(FFT_TABLE(2:17));
到第16次谐波的完整结果表如下:
表3:谐波振幅和相位数据
应用
特定角度下N次谐波的校正值如下所示:
Corr (n) = correction_amp(n)× cos[n × sensor_angle + correction_pha(n)],
其中第0次谐波是偏置校正,也应该考虑在内。在实际应用中,下列代码产生四次谐波。因为余弦函数需要弧度
作为输入,角度值被转换为弧度。由于傅里叶变换的输入是用度数表示的,所以存储在表中的校正振幅是以度数表示的。
%%对四次谐波进行谐波校正
restored_signal_4_harmonics = MOD(sensor_data +(...
offset_correction +……
校正放大器(1)*cos(1*(传感器数据/360*2*pi)+校正pha(1))+。。。
Correction_amp (2)*cos(2*(sensor_data/360*2*pi) + correction_pha(2)) +…
校正_pm(3)* cos(3 *(sensor_data / 360 * 2 * pi)+校正_pha(3))+ ...
Correction_amp (4)*cos(4*(sensor_data/360*2*pi) + correction_pha(4))…
),360);
此代码对所有传感器角度执行校正sensor_data。
在循环中实现此校正将降低微控制器实现的代码大小,但在此处不用于代码清晰度原因。
图19显示了从表1的16个录制的角度上线性化后的剩余输出不准确性。剩余误差通过添加更多谐波来减小。选择次谐波补偿时,最好按照降低幅度选择谐波。例如,如果谐波1,2和4具有大的幅度,而谐波3具有较小的幅度,则校正谐波1,2和4将提供比校正谐波1,2和3更好的结果。
线性插值
概念
修正曲线可用分段线性函数逼近。对于这个函数,需要将支撑点存储为传感器坐标和校正值对。
在图8中,这些对将[(Y”0., C0.)...(Y”N, CN)]。支承点之间,进行线性内插。在角度传感器线性化应用中,有用的是使用传感器角度的等距网格。雷竞技最新网址以这种方式,传感器的角度值[Y”0.…是的N]并不需要存储,线性校正的实现变得更加容易。例如,它可以存储32的修正值,这将随后在0角度传感器被施加°,11.25°,22.50°,等等。
要被存储的点数可以通过不同的标准来确定。
最简单的确定它们的方法是在修正曲线上选择点在传感器角度,这将被称为“曲线上”线性插值。然而,这些点也可以根据存储的校正曲线的最小二乘误差进行优化。这将被称为“最小二乘”线性插值。其他优化策略是可能的,但不会
在本文档中描述。
用参数的线性内插来确定由
曲线上和最小二乘法
对于相同的最大误差,最小二乘法将所需的存储参数量减少了约50%,并且对单个测量异常值不太敏感。因此,这里将使用最小二乘法来确定线性插值支撑点。
实现
校正曲线需要使用分段线性函数来近似。因为支承点应以最小二乘误差的方式来选择,数据之前和之后的支持
点也有助于确定它的最终值。
这为第一个和最后一点创造了一个问题。在0°的第一个支撑点仅在右侧具有校正曲线,使得不考虑接近360°的数据。为了避免这个问题,校正曲线将重复三次,并且将计算该曲线的分段线性最小二乘近似。然后,只将使用中央部分来选择所使用的参数。这个概念如图21所示。
适合计算
复制的修正曲线,并计算拟合的代码给出如下:
%分段线性逼近修正曲线
lin_sup_nodes = 32;
重复修正表三次以避免
%拐角对校正计算的影响。
三重校正曲线=repmat(校正曲线,3,1);
triple_correction_curve(end + 1)= triple_correction_curve(1);
%做的角度输入相同的
triple_output_grid = 0:(4096分之360):( 3 * 360);
%计算支撑点
XI_lin_triple = linspace (0 3 * 360 lin_sup_nodes * 3 + 1);
yi_lin_triple = lsq_lut_piecewise(triple_output_grid(:),...
triple_correction_curve XI_lin_triple);
%只使用中心点来计算校正值:
y_lin = y_lin_triple (lin_sup_nodes+1: 2*lin_sup_nodes+1);
XI_lin=linspace(0360,lin_sup_节点+1);
lsq_lut_piecewise函数在附录A中重新打印。
下面找到32点线性插值的校正参数列表:
表4:线性插值参数
注意,对于一个360°的值也被加入,即使它是相同的一个为0°。这是必要的,以使348.75°和360°之间可能的角度的校正,而无需使用技巧。
应用
在MATLAB中,校正的应用是直接使用内置的一维插值功能:
同样的功能也可以实现如下,以演示如何在微控制器中执行计算:%%执行线性插值
Restored_linear_signal = mod(sensor_data(:) + ...
interp1(XI_lin,YI_lin,sensor_data(:),”线性”),360);
%%手动执行线性插值
restored_linear_signal_man =零(长度(sensor_data),1);
lin_sup_res = 360 / lin_sup_nodes;
For I = 1:length(sensor_data)
%获取传感器角度之前的表项索引
基本角度=地板(传感器数据(i)/lin sup res);
baseangle = baseangle_idx * lin_sup_res;
获得我们通过表项的度数
offstangle = sensor_data(i) - 胸部;
%校正是基础+
= YI_lin(baseangle_idx+1) +…
((YI_lin (baseangle_idx + 2) -…
林毅夫(基准角idx+1))*偏移角/林辅助;
恢复的线性信号(i)=模式(传感器数据(i)+。。。
校正,360);
结束
此代码对Sensor_data中的所有传感器角度执行校正。
在微控制器实现中,位移位和位掩蔽的有效使用可以消除除法运算的需要。模运算可以被故意使用整数溢出代替。但是,减法、加法和乘法仍然是必需的。
线性化用于我们的例子中后剩余的输出误差被示出低于16在已记录的角度。其余的误差通过增加更多的线性化点降低。
查找表
概念
对于修正曲线的线性插补,需要在支撑点之间插补。这需要一些数学运算,而这通常会花费很长时间。
可以直接使用最接近的校正值,而不是在两个支持值之间进行插值。此方法在本文档中称为查找表。
将选择每组角度或垃圾箱的校正值作为该箱内校正曲线值的平均值。这将确保校正曲线的最低结果RMS错误
表示。其他策略,例如选择相应箱的最小和最大校正之间的平均值,但不会在本文档中使用。
使用查找表需要存储大量的值以达到可接受的性能。通常需要大约256个值。数值的数量不需要是2的幂;然而,在定点代码中的微控制器实现将受益于使用2的幂来表示表项的数量。
实现
首先,需要定义容器边界。然后,可以确定该边界内校正曲线值的平均值。
%%查找表近似校正曲线
number_table_entries = 64;
%选择仓边界
XI_binlimits = linspace(0360年,number_table_entries + 1);
%使用函数bin_lut查找每个bin的平均点:
YI_lut=bin_平均值(有序输出网格(:)。。。
correction_curve(:),XI_binlimits(:));
在附录b中打印了函数bin_lut。应该注意的是,对于较大的值,校正曲线值恰好在两个容器之间的边界上,被包含在容器的平均值中,而对于较小的值,则被排除在容器之外。
例如,对于64个条目,180°角的校正曲线数据用于料仓180°…185.625°的值,而不用于料仓174.375°…180°。
64个表项的示例性所得修正曲线被认为是在图23中。
修正曲线的64个箱
64个条目的结果表可以在表5中找到。
表5:64个条目的查找表
应用
在MATLAB中,使用内置的一维插值函数的前邻值可以直接进行修正:
restored_lut_signal = MOD(sensor_data(:) + ...
interp1 (XI_binlimits (1: end-1),……
YI_lut sensor_data(:),‘以前’,‘extrap’),360);
同样的功能也可以如下证明实施
如何在微控制器中执行计算:
number_table_entries = 64;
restored_lut_signal_man = 0(长度(sensor_data), 1);
table_res = 360 / number_table_entries;
For I = 1:length(sensor_data)
%获取传感器角度之前的表项索引
baseangle_idx =地板(sensor_data(我)/ table_res);
纠正val = yi_lut(baseangle_idx + 1);
Restored_lut_signal_man (i) = mod(sensor_data(i) +…
校正,360);
结束
此代码对Sensor_data中的所有传感器角度执行校正。
在微控制器实现中,有效地使用位移位和位屏蔽可以消除对划分操作的需求。角度可用于直接在位移位或屏蔽后直接索引表格条目。可以通过刻意使用整数溢出来替换模数操作。只需要添加。
线性化用于我们的例子中后剩余的输出误差被示出低于16在已记录的角度。其余的误差通过增加更多的查找表项目的减少。
性能比较
为了比较的三种方法的性能本文件中说明的那样,理想的校正曲线,并使用三个讨论的方法的表示之间的差异进行了分析。
这是使用图16的校正曲线完成的。其他曲线将提供不同的结果。
在轴上应用中,需要的修雷竞技最新网址正量很小,可以减少条目的数量。
为了比较方法的存储需求,假设为查找表和线性插值存储的每个值都需要一个存储条目。
对于谐波线性化,每个谐波需要两个存储条目(相位和幅度),并且还需要存储DC偏移。这带来了N谐波的存储条目量
到2×N+ 1。
对于谐波校正,所应用的谐波按幅值减小的顺序选择。这意味着,例如,在添加对第7次谐波(振幅为0.0361°和0.0257°)的校正之前,先添加对第9次谐波(振幅为0.0429°)的校正。对于侧轴应用来说,二次谐波和四雷竞技最新网址次谐波比其他谐波强得多是很常见的。在这种情况下,只有纠正这两个可能是有用的。
在一个完整的旋转,最大绝对误差测定,并绘制在图25中的存储需求。
结论
本文档详细介绍了使用微控制器线性化角传感器数据的三种可能方法。这些实现涵盖了广泛的内存和处理时间要求。
联系快板代表对于任何剩余的问题或支持。
附录A:函数LSQ_LUT_PIECEWISE
从https://uk.mathworks.com/matlabcentral/fileexchange/40913-piecewise-linear-least-square-fit。
版权所有(c) 2013, Guido Albertin
保留所有权利。
在符合下列条件的情况下,可以源代码和二进制形式重新分发和使用,不论是否经过修改:
*再分发源代码必须保留以上版权声明,此条件列表和下面的免责声明。
*以二进制形式的再分发必须复制上述版权信息,此条件列表和下面的文档中的免责声明和/或其它材料提供与分配
本软件提供了由版权所有者和贡献者按“原样”提供,任何明示或暗示的担保,包括但不限于适销性和适用性的特定用途的暗示担保。在任何情况下,版权所有者或贡献者都应对任何直接,间接,偶然,特殊,示范性或相应的损害负责(包括但不限于采购替代商品或服务;使用丧失,数据或利润;然而,或者业务中断)造成和任何责任理论,无论是在合同,严格的责任或侵权行为(包括疏忽或其他方式),也以任何方式出现在使用本软件的情况下,即使涉及此类损害的可能性也是如此。
function [YI] = lsq_lut_piecwise (x, y, XI)
1-D插值的分段线性插值(查表)
%yi = lsq_lut_piecewise(x,y,xi)获得最佳(最小二乘意义)
用线性插值例程使用的%矢量。
%的目标是找到给出:Y的函数X的最小化
% f = |y-interp1(XI,YI,x)|^2
%
%的输入
% x测量数据向量
% y测量数据向量
1-D表的% XI断点
%
% 输出
1-D表的%yi插值点
%Y = interp1(XI,YI,x)的
%
如果尺寸(x,2)〜= 1
错误('Vector x must have dimension n x 1.');
elseif大小(y,2)~=1
错误('向量y必须具有尺寸n x 1');
ELSEIF尺寸(X,1)〜=尺寸(X,1)
错误('Vector x and y must have dimension n x 1.');
结束
通过X测量定义的%基质
a =稀疏([]);
%y测量矢量
Y = [];
对于j = 2:长度(XI)
% get bin中的点索引[XI(j-1) XI(j)]
x = x>=XI(j-1) & x%检查我们是否在箱中有数据点
如果~(第九)
警告(Sprintf('bin [%f%f]没有数据点,检查估计。
请相应地重新定义X向量。',Xi(J-1),XI(J)));
结束
%获取x和y数据子集
x_ = x(ix);
y_ = y(ix);
%创建临时矩阵要添加到a
tmp=[(-x_uxi+XI(j-1))/(XI(j)-XI(j-1))+1)((x_XI-XI(j-1))/(XI(j)-XI(j-1)))];
%建立带有约束条件的测量矩阵
(m1, n1) = (A)大小;
[M2,N2] =尺寸(TMP);
A = [[A zeros(m1, n1-1)];[0 (m2,n1-1) tmp]];
连接料仓的尺寸
Y = [Y;Y_];
结束
%得到最小二乘Y估计
yi = a \ y;
附录B:功能BIN_MEAN
版权所有(c) 2018, dominique Geisler, Alle雷竞技竞猜下载gro MicroSystems Germany GmbHvAll rights reserved。
在符合下列条件的情况下,可以源代码和二进制形式重新分发和使用,不论是否经过修改:
*再分发源代码必须保留以上版权声明,此条件列表和下面的免责声明。
*以二进制形式的再分发必须复制上述版权信息,此条件列表和下面的文档中的免责声明和/或其它材料提供与分配
本软件提供了由版权所有者和贡献者按“原样”提供,任何明示或暗示的担保,包括但不限于适销性和适用性的特定用途的暗示担保。在任何情况下,版权所有者或贡献者都应对任何直接,间接,偶然,特殊,示范性或相应的损害负责(包括但不限于采购替代商品或服务;使用丧失,数据或利润;然而,或者业务中断)造成和任何责任理论,无论是在合同,严格的责任或侵权行为(包括疏忽或其他方式),也以任何方式出现在使用本软件的情况下,即使涉及此类损害的可能性也是如此。
函数[YI] = bin_mean(x, y, XI)
%BIN_LUT仓查找表1-d插补(表查找)
%yi = lsq_lut_piecewise(x,y,xi)获得最佳(最小二乘感)箱
在席定义的bin边界之间的最近邻查找表的%值。
如果((大小(X,1)〜= 1)&&(大小(X,2)〜= 1))
错误('矢量x必须具有尺寸n x 1或1 x n');
elseff((size(y,1)〜= 1)&&(size(y,2)〜= 1)))
错误( '矢量y必须具有维数n X 1或1×N');
elsefif长度(x)〜=长度(y)
错误('矢量x和y必须具有相同的长度');
结束
易= 0((长度(XI) 1), 1);
对于j = 1 :(长度(xi)-1)
yi(j)=均值(y((x> = xi(j))&(x结束
附录C:功能完整的脚本用于本应用笔记
版权所有(c) 2018, dominique Geisler, Alle雷竞技竞猜下载gro MicroSystems Germany GmbH。
在符合下列条件的情况下,可以源代码和二进制形式重新分发和使用,不论是否经过修改:
*再分发源代码必须保留以上版权声明,此条件列表和下面的免责声明。
*以二进制形式的再分发必须复制上述版权信息,此条件列表和下面的文档中的免责声明和/或其它材料提供与分配
本软件提供了由版权所有者和贡献者按“原样”提供,任何明示或暗示的担保,包括但不限于适销性和适用性的特定用途的暗示担保。在任何情况下,版权所有者或贡献者都应对任何直接,间接,偶然,特殊,示范性或相应的损害负责(包括但不限于采购替代商品或服务;使用丧失,数据或利润;然而,或者业务中断)造成和任何责任理论,无论是在合同,严格的责任或侵权行为(包括疏忽或其他方式),也以任何方式出现在使用本软件的情况下,即使涉及此类损害的可能性也是如此。
%%传感器数据定义
angle_input = [0:11.25:348.75];
Sensor_Data = [266.31 278.61 290.39 301.99 312.45 323.00 332.75 342.69 352.79 3.16
14.24 26.02 38.94 52.91 67.15 82.18 97.12 111.45 124.98 137.46 148.62 158.82
167.96 176.48 184.48 192.92 201.27 210.50 220.43 230.98 242.31 254.36];
检查上升参考角度
如果任何(angle_input <0)||任何(angle_input> 360)||任何(差异(angle_input)<= 0)
误差('参考角度必须在0和360之间单调上升');
结束
%%检查正确的传感器的角度范围
如果任何(sensor_data <0)||任何(sensor_data> 360)
错误('传感器角度必须在0到360'之间);
结束
%%预处理
sensor_data_2 = sensor_data(:);
angle_input = angle_input (:);
%检查是否有至多一个溢流连续上涨
如果有的话(screat(sensor_data_2)== 0)
误差(“传感器数据必须单调递增”)
Elseif sum(diff(sensor_data_2) < 0) <= 1
%上升角数据有零或一个溢出,溢出将被纠正
传感器数据2=传感器数据2(:)+360*cumsum([假;差异(传感器数据2(:)<0]);
elseif和(差异(传感器数据2)<0)>1
错误(“只有一个数据减少允许作为溢出”)
结束
%正确地环绕传感器数据
翻转校正=四舍五入((平均值(传感器数据)-180)/360)*360;
传感器\数据\ 2=传感器\数据\ 2-翻转校正;
扩展传感器数据%
sensor_data_ext = [sensor_data_2(:);sensor_data_2(:) + 360;...
sensor_data_2 (:) + 720];
扩展输入数据
angle_input_ext = [angle_input (:);angle_input (:) + 360;...
角度输入(:)+720];
预处理完成后%%绘图磁体测量
图;绘图([Anight_Input(:)],[Sensor_Data_2(:)],'O-');
包含(“编码器角度(度)”);
ylabel(“输出角(度)”);
网格;
XLIM([0 360]);
标题({'Output field direction over encoder direction'});
%%使用花键以从有序输入网格移动数据
%到有序输出网格:
有序输出网格=0:(360/4096):(360-360/4096);
Intermediategrid = ordered_output_grid + 360;
投影=样条(sensor_data_ext, angle_input_ext,…)
中间整体);
%计算所需的数据的校正:
校正_curve =投影 - 介入;
correction_curve = correction_curve (:);
%%傅立叶变换纠正,丢弃16th之后的值
%和缩放能量由表中的长度
雷竞技竞猜下载Allegro MicroSystems,LLC 20
955周边路
曼彻斯特,NH 03103-3353 U.S.A.
www.wasanxing.com
fft_table = FFT(correction_curve)/长度(ordered_output_grid);
偏移校正=abs(fft_表(1));
correction_pha =角度(fft_table(2:17));
校正_AMP = 2 * ABS(FFT_TABLE(2:17));
%%对四次谐波进行谐波校正
restored_signal_4_harmonics = MOD(sensor_data +(...
offset_correction +……
校正放大器(1)*cos(1*(传感器数据/360*2*pi)+校正pha(1))+。。。
Correction_amp (2)*cos(2*(sensor_data/360*2*pi) + correction_pha(2)) +…
校正_pm(3)* cos(3 *(sensor_data / 360 * 2 * pi)+校正_pha(3))+ ...
Correction_amp (4)*cos(4*(sensor_data/360*2*pi) + correction_pha(4))…
),360);
%分段线性逼近修正曲线
lin_sup_nodes = 32;
重复修正表三次以避免
%拐角对校正计算的影响。
三重校正曲线=repmat(校正曲线,3,1);
triple_correction_curve(end + 1)= triple_correction_curve(1);
%做的角度输入相同的
triple_output_grid = 0:(4096分之360):( 3 * 360);
%计算支撑点
XI_lin_triple = linspace (0 3 * 360 lin_sup_nodes * 3 + 1);
yi_lin_triple = lsq_lut_piecewise(triple_output_grid(:),...
triple_correction_curve XI_lin_triple);
%只使用中心点来计算校正值:
y_lin = y_lin_triple (lin_sup_nodes+1: 2*lin_sup_nodes+1);
XI_lin=linspace(0360,lin_sup_节点+1);
%%执行线性插值
Restored_linear_signal = mod(sensor_data(:) + ...
interp1 (XI_lin、YI_lin sensor_data(:),“线性”),360);
%%手动执行线性插值
restored_linear_signal_man =零(长度(sensor_data),1);
lin_sup_res = 360 / lin_sup_nodes;
For I = 1:length(sensor_data)
%获取传感器角度之前的表项索引
基本角度=地板(传感器数据(i)/lin sup res);
baseangle = baseangle_idx * lin_sup_res;
获得我们通过表项的度数
offstangle = sensor_data(i) - 胸部;
%校正是基础+
= YI_lin(baseangle_idx+1) +…
((YI_lin (baseangle_idx + 2) -…
林毅夫(基准角idx+1))*偏移角/林辅助;
恢复的线性信号(i)=模式(传感器数据(i)+。。。
校正,360);
结束
%%执行查找表校正
number_table_entries = 64;
%选择仓边界
XI_binlimits = linspace(0360年,number_table_entries + 1);
%使用函数bin_lut查找每个bin的平均点:
YI_lut=bin_平均值(有序输出网格(:)。。。
correction_curve(:),XI_binlimits(:));
%%应用查找表线性化
restored_lut_signal = MOD(sensor_data(:) + ...
interp1 (XI_binlimits (1: end-1),……
YI_lut sensor_data(:),‘以前’,‘extrap’),360);
%%手动应用查表线性化
restored_lut_signal_man = 0(长度(sensor_data), 1);
table_res = 360 / number_table_entries;
For I = 1:length(sensor_data)
%获取传感器角度之前的表项索引
baseangle_idx =地板(sensor_data(我)/ table_res);
纠正val = yi_lut(baseangle_idx + 1);
Restored_lut_signal_man (i) = mod(sensor_data(i) +…
校正,360);
结束
%%用三种方法绘制滞环后的剩余误差
数字;
情节(angle_input(:),国防部(180 + restored_linear_signal (:) -angle_input(:), 360), -180年”。——“,……
angle_input(:),国防部(180 + restored_signal_4_harmonics (:) -angle_input(:), 360), -180年”。——“,……
angle_input(:),国防部(180 + restored_lut_signal (:) -angle_input(:), 360), -180年”。——“…
);
('线性插值(32段)','谐波校正(4次谐波)',
'查找表(64个条目)');
XLIM([0 360]);xlabel( '测量的角度[度]');
ylabel('线性化后的预期误差[deg]');
本文件所包含的信息不构成Allegro就本文件标的向客户作出的任何陈述、保证、保证或诱惑。所提供的信息不能保证基于这些信息的流程是可靠的,也不能保证Allegro已经探索了所有可能的故障模式。客户有责任对最终产品进行充分的合格测试,以确保其可靠并满足所有设计要求。
1] Allegro角度位置传感器ic, /en/Products/Magnetic-
线性和角位置传感器-IC / Angular-Position-Sensor-ICS.aspx