Microcontroller-Based ICs角传感器的线性化
Microcontroller-Based ICs角传感器的线性化
杜米尼克聊聊,
雷竞技竞猜下载快板微系统公司有限责任公司
介绍
磁角度传感器通常是一个不错的选择快速、可靠、非接触式测量系统的角位置,特别是在肮脏的环境中光学编码器可能不是一个合适的选择。
雷竞技竞猜下载快板微系统公司,提供了一个广泛的角传感器集成电路[1]为不同的应用程序。雷竞技最新网址这些传感器集成电路可以测量的角度截然磁化编码器磁铁
在side-shaft或end-of-shaft设置,如图1所示。
end-of-shaft角度测量(右)
测量误差
所有快板角度传感器ICs校准在最终测试在工厂里使用一个同质的磁场。这样做是为了减少本机误差传感器。然而,尤其是在side-shaft应用,传感器的磁场角度传感器不是一雷竞技最新网址样机械的轴角测量。这种差异的主要因素是编码器发出的磁场形状的磁铁。
其他来源的机械和磁场角磁铁之间的不匹配失调,磁铁缺陷,剩余传感器误差和漂移,铁磁材料的光临。
它可以得出结论,所有系统,特别是sideshaft-systems遭受编码器角和测量角之间的不匹配。一个典型的转移曲线side-shaft可以看到应用程序如图2所示。
角side-shaft设置
这些测量误差称为非线性,可以通过这一过程被称为线性化补偿。
线性化
一些快板传感器集成电路,如A1335,AAS33001,AAS33051有嵌入式逻辑允许输入数据的线性化。然而,其他传感器集成电路,如A1330,A1333,A1337,A1338,或A1339芯片,没有此功能。在一个传感器集成电路的情况下不使用内置的功能来线性化数据,可能需要使用单片机外部线性化达到所需精度在一个特定的应用程序。
本应用笔记将:
- 解释线性化的基本原理
- 展示如何处理实际测量数据来计算校正数据
- 细节三种方式存储校正数据
- 细节如何应用修正
- 比较该方法的准确性
定义
编码器角度
角度准确报道,高分辨率外部编码器。
传感器的角度
角的角传感器集成电路。
角误差
角误差的实际位置之间的区别是磁铁,磁铁的位置的角传感器IC。这个计算减编码器角度传感器角度:
错误=(α_sensor -α_encoder)。
然而,如果传感器角度359°,编码器角度为0°,错误应该1°而不是+ 359°。包装在180°±以外的任何错误,可以使用的模运算符:
错误=国防部[(α_sensor -α_encoder) + 180360] - 180。
样图的角度误差在side-shaft应用程序在图3中给出。
最大绝对误差角
最大绝对误差角是最大的绝对差异的实际位置磁铁,磁铁的位置测量的角度传感器集成电路在一个完整的旋转。
在图3中,最大角度误差是21.46°,编码器56°角测量。
线性化的目标
线性化的目标是确定、存储和应用一个函数最小化传感器测量角度误差相比编码器角度值。这最小化之间的差异角度和实际编码器角度测量传感器。
这个目标可以以不同的方式实现。三种常见的技术将在这个应用程序详细的注意。雷竞技最新网址
提出的技术取决于单个校正阶段(通常是在客户的行尾测试),之后一个固定的修正函数。
先决条件线性化
先决条件线性化使用的技术详细如下:
- 在生产过程中,角度需要被应用到传感器系统。
- 在生产过程中,传感器角度需要读出。
- 线性化的系统需要一个单片机,线性化信息写在生产过程中,在应用程序中执行线性化。
线性化的极限
线性化使用本文描述的方法有一些限制:
- 传感器噪声不会被线性化校正。
- 传感器的漂移校正后不会被纠正。
- 更改后的机械系统校准不会被线性化校正。一个常见的例子是动态磁铁位置由于振动和转矩的变化
- 如果输入的位置在校正不准确记录,校正的准确性以同样的方式将是有限的。
线性化方法
1。数据记录
生成所需的数据线性化、测量传感器输出(y0y…n)在已知编码器角度(x0x…n]。这些编码器角度不需要等距,尽管通常使用等距角度。
值的记录如图5所示。
2。坐标变换角度传感器的校正函数基于传感器数据,记录数据点应该转换成传感器坐标系。
这意味着,而不是表达函数角度传感器的角度,应表达真正的角度传感器的功能角度。因此,传感器的角度(y '0y…”n选择),相应的编码器角度(x '0…x 'n)需要确定。要做到这一点,需要一个合适的应用通过数据点。这可以通过样条插值,如图6所示。
3所示。修正曲线计算
为了创建一个函数,将角度测量传感器转换为编码器角度,调整值需要计算。这些调整值计算[c0c…n]= [x '0…x 'n]- [y '0y…”n]。
最后,这些值描述一个校正曲线,c,使校正传感器角度的函数值。图8显示了一个图的曲线c /传感器角度。
4所示。校正曲线的应用程序数据
应用校正传感器测量数据点,修正C传感器数据点Y值需要计算基于修正曲线C。这是图形化表示
然后确定正确的角值X X = Y + c .这是图形如图10所示。
修正曲线存储选项
在本文档中,三种方式存储修正曲线将调查。有许多其他的可能性。但是,本文提供的方法服务范围广泛的需求,同时需要适度的实现和计算工作。这些方法,线性插值hardware-implemented A1335, AAS33001, AAS33051。谐波校正A1335才实现。
谐波校正
校正曲线往往有一个周期的形状。通过解剖成谐波和储存谐波的相位和振幅,紧凑的存储是可能的。这显然是这种情况,例如,在图3所示。
谐波校正的优点是,只有很少的参数需要存储正确的传感器数据。微控制器的缺点是需要执行余弦计算,这限制了速度。
线性插值
第二种方法,可以使用分段线性函数近似校正曲线。
此方法需要更多的存储空间比谐波校正参数使用,但需要更少的计算时间。代码大小的计算方法也更小。
查找表
第三种方法来存储修正曲线是使用一个查找表。这需要一个大桌子的校正参数存储,但自从修正价值可以直接取自查找表,不需要插值的步骤。
这使线性化的代码非常简单和快速。
校正方法比较
图11和图12显示比较预期的输出获得图3中的数据存储为一个谐波近似校正曲线时,分段线性插值和查找表。
修正曲线测定
实现在本文档中实现MathWorks MATLAB™。因为这是商业软件,许可成本适用于使用它,这可能会阻碍在生产环境中使用。GNU Octave自由软件MATLAB的替代品,这是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 (:);
%检查不断上升最多一个溢出
如果任何(diff (sensor_data_2) = = 0)
错误(传感器数据必须是单调递增)
elseif总和(diff (sensor_data_2) < 0) < = 1
%上升角度数据与零个或一个溢出,溢出会纠正
sensor_data_2 = sensor_data_2 (:) + 360 * cumsum([假;diff (sensor_
data_2 (:)) < 0]);
elseif总和(diff (sensor_data_2) < 0) > 1
错误(只有一个数据减少允许溢出)
结束
%正确环绕传感器数据
rollovercorrection =圆((平均(sensor_data_2) - 180) / 360) * 360;
sensor_data_2 = sensor_data_2 - rollovercorrection;
由此产生的值如表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;…
angle_input (:) + 720];
投影传感器数据网格
在下一步中,编码器角度输入对应传感器输出360°和720°之间计算(称为“intermediategrid”下面的代码)。这是用4096步,因为一个高分辨率的中间步骤的好处最终的输出质量。
% %使用样条来移动数据从一个命令输入电网
%到有序输出网格:
ordered_output_grid = 0 (360/4096): (360 - 360/4096);
intermediategrid = ordered_output_grid + 360;
投影=花键(sensor_data_ext, angle_input_ext,…
intermediategrid);
这一步是图形如图15所示。
角编码器值之间的差异和传感器输出校正曲线,可以计算减去固定格栅从计算匹配编码器角度传感器的角度。
校正曲线可以下面图16中所示。%计算所需数据的修正:
correction_curve =投影- intermediategrid;
correction_curve = correction_curve (:);
一个简短的检查才能看到,这条曲线是正确的。在表1中,可以看出传感器137.46°角,编码器角度是213.75°。图16显示的校正曲线,在传感器137.5°角修正+ 76.29°的需要。137.46 + 76.26 = 213.72°≅213.75°,校正曲线计算都是适用的。
在下一步,修正曲线需要存储在一个有效的方式,以便调整值可以计算出任何输入。这是通过使用谐波近似,线性插值和一个查找表。
谐波近似
概念
每个重复信号可分为其构成的频率。
校正曲线重复每旋转一圈后,这样它就可以被完全描述为一组频率。重复校正曲线可能会使它更清晰中包含各种频率校正曲线。
谐波近似的一个优势是,修正曲线可以用可接受的精度描述仅使用几个参数。然而,cos的计算可能
慢一些平台或应用程序。雷竞技最新网址
实现
使用傅里叶变换,每个组合的频率的相位和振幅校正曲线可以确定。4096年的修正曲线的数据点导致4096点FFT结果。然而,大多数能量较低的频率。下面,只有偏移值和第一个16谐波校正曲线的提取:
这个收益率89.82°的补偿修正,以下的谐波振幅:% %傅里叶变换的修正,丢弃后,16日的值
%和扩展能源表的长度
fft_table = fft长度(correction_curve) / (intermediategrid);
offset_correction = abs (fft_table (1));
correction_pha =角(fft_table (17));
correction_amp = 2 * abs (fft_table (17));
完整的结果表16谐波存在以下:
表3:谐波振幅和相位数据
应用程序
n次谐波的调整值在一个特定的角度可以发现:
相关系数(n) = correction_amp (n)×因为[n×sensor_angle + correction_pha (n)),
第0个谐波的补偿校正和应该考虑。实际应用,下面的代码导致四次谐波。余弦函数的期望弧度
作为输入,转换为弧度的角值。correctionamplitude存储在表是在度,因为傅里叶变换的输入是在度。
% %谐波校正申请四次谐波
restored_signal_4_harmonics =国防部(sensor_data + (…
offset_correction +……
correction_amp (1) * cos (1 * (sensor_data / 360 * 2 *π)+ correction_pha (1) +…
correction_amp (2) * cos (2 * (sensor_data / 360 * 2 *π)+ correction_pha (2)) +…
correction_amp (3) * cos (3 * (sensor_data / 360 * 2 *π)+ correction_pha (3)) +…
correction_amp (4) * cos (4 * (sensor_data / 360 * 2 *π)+ correction_pha (4))…
),360);
这段代码执行的所有传感器角度校正sensor_data。
这个校正的实现在一个循环中会减少代码大小单片机实现,但这里没有使用原因代码清晰。
图19显示剩余的输出不精确线性化后的16个记录从表1角。其余的错误减少通过添加更多的谐波。在选择谐波补偿,最好选择谐波振幅的递增顺序链接在一起的。例如,如果谐波1、2和4有一个大的振幅,而谐波3有一个较小的振幅,然后纠正谐波1,2,4会给一个更好的结果比纠正谐波1、2和3。
线性插值
概念
校正曲线可以用分段线性函数近似。对于这个函数,它是需要存储支持点对传感器坐标和调整值。
在图8中,这些对[(y '0c0),…(y 'ncn)]。支持点,之间的线性插值。在角度传感器线性化应用程序中,使用一个很有用的等距网格传感器雷竞技最新网址角度。通过这种方式,传感器角度值(y '0y…”n不需要存储,和线性校正的实现变得更加容易。例如,它可以存储32调整值,这将被应用在传感器角度0°、11.25°、22.50°,等等。
点存储可以由不同的标准。
最简单的方法来确定它们是通过选择点校正曲线在传感器的角度说,这将被称为“在曲线”的线性插值。然而,点也可以存储优化的最小二乘误差修正曲线。这将被称为“最小二乘线性插值。其他的优化策略是可行的,但不会
本文档中描述。
由线性插值与参数
在曲线和最小二乘法
存储参数的最小二乘方法可以减少所需的大约50%相同的最大误差和不太敏感的单一测量异常值。因此,将使用leastsquares方法来确定线性插值点的支持。
实现
校正曲线需要使用分段线性函数近似。因为支持点应选择在最小二乘误差时尚,之前和之后的数据支持
点也贡献在决定其最终值。
这就产生了一个问题的第一个和最后一个点。第一个支持点在0°只有一个校正曲线的右侧,以便接近360°的数据不会被考虑。为了避免这个问题,修正曲线将重复三次,和一个分段线性最小二乘近似的曲线计算。然后,只有中央部分将用于选择所使用的参数。此概念如图21所示。
适合计算
复制的代码校正曲线和计算符合如下所示:
% %修正曲线的分段线性近似
lin_sup_nodes = 32;
%,以避免重复校正表三次
%角落对校正计算的影响。
triple_correction_curve = repmat (correction_curve 3 1);
triple_correction_curve结束(+ 1)= triple_correction_curve (1);
%的角度输入
triple_output_grid = 0 (360/4096): (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);
%只使用中央点计算更正:
YI_lin = YI_lin_triple (lin_sup_nodes + 1: 2 * lin_sup_nodes + 1);
XI_lin = linspace(0360年,lin_sup_nodes + 1);
在附录A lsq_lut_piecewise函数是转载。
32点线性插值校正参数列表中找到如下:
表4:线性插值参数
注意,一个值为360°也补充说,即使是相同的一个0°。这是需要修正角度360°和348.75°之间可能不使用技巧。
应用程序
在MATLAB,校正的应用是直接使用内置的一维插值函数:
相同的功能还可以实现如下演示如何计算在单片机可以执行:% %执行线性插值
restored_linear_signal =国防部(sensor_data (:) +…
interp1 (XI_lin、YI_lin sensor_data(:),“线性”),360);
% %手动执行线性插值
restored_linear_signal_man = 0(长度(sensor_data), 1);
lin_sup_res = 360 / lin_sup_nodes;
i = 1:长度(sensor_data)
%索引的表进入传感器前角
baseangle_idx =地板(sensor_data(我)/ lin_sup_res);
baseangle = baseangle_idx * lin_sup_res;
%的度,是我们过去的表条目
offsetangle = sensor_data (i) - baseangle;
% +修正基地
correctionval = YI_lin (baseangle_idx + 1) +…
((YI_lin (baseangle_idx + 2) -…
YI_lin (baseangle_idx + 1) * offsetangle / lin_sup_res);
restored_linear_signal_man (i) =国防部(sensor_data(我)+…
correctionval, 360);
结束
这段代码执行所有传感器的校正sensor_data角度。
在单片机实现中,有效地利用一点一点转移和屏蔽可以删除部门操作的必要性。模操作可以被蓄意使用整数溢出。然而,减法,加法和乘法仍然是必需的。
剩下的输出不精确线性化后我们的示例如下所示的16个角度记录。通过添加更多的线性化点剩余误差减小。
查找表
概念
校正曲线的线性插值,它需要支持之间的插入点。这需要一些数学运算,这通常需要太长了。
而不是两个支持值之间的插值,可以直接使用最近的校正值。这种方法被称为一个查找表在这个文档。
角度的调整值为每个设置,或本,将被选择作为校正曲线的平均值,本内部值。这将确保最低的均方根误差修正曲线
表示。其他策略,如选择各自的平均最小值和最大值之间的修正本,是可能的,但是不会在本文档中使用。
使用一个查找表需要存储大量的值达到可接受的性能。大约256的值通常是必要的。值不需要的数量是2的幂;然而,单片机实现定点代码将受益于使用权力的两个表格条目的数量。
实现
首先,本需要定义边界。然后,修正曲线值的平均值在边界可以确定。
% %查表修正曲线的近似
number_table_entries = 64;
%选择本边界
XI_binlimits = linspace(0360年,number_table_entries + 1);
%找到点的平均每本使用bin_lut函数:
YI_lut = bin_mean (ordered_output_grid (:),……
correction_curve (:), XI_binlimits (:));
函数bin_lut是印在附录b .应该注意,修正曲线值是完全在两个箱子之间的边界都包含在本为更大的值的平均值,并被排除在本为较小的值。
例如,64个条目,校正曲线数据在一个角为180°的值用于本180°…185.625°,而不用于本174.375°…180°。
一个模范结果修正曲线64表条目如图23所示。
校正曲线的使用64箱
结果表可以找到64个条目在表5。
表5:64年的查找表条目
应用程序
在MATLAB中,应用程序的修正是直接使用内置的一维插值函数previous-neighbor值:
restored_lut_signal =国防部(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;
i = 1:长度(sensor_data)
%索引的表进入传感器前角
baseangle_idx =地板(sensor_data(我)/ table_res);
correctionval = YI_lut (baseangle_idx + 1);
restored_lut_signal_man (i) =国防部(sensor_data(我)+…
correctionval, 360);
结束
这段代码执行所有传感器的校正sensor_data角度。
在单片机实现中,有效地利用一点一点转移和屏蔽可以删除部门操作的必要性。角度可以用来直接索引表条目后移位或屏蔽。模操作可以被蓄意使用整数溢出。只有一个加法仍然是必需的。
剩下的输出不精确线性化后我们的示例如下所示的16个角度记录。其余的错误减少通过添加更多的查找表条目。
性能比较
比较三种方法的性能在这个文档中解释说,理想的修正曲线之间的差异,表示使用三种方法进行了分析讨论。
这是通过使用图16的修正曲线。其他的曲线会给不同的结果。
在轴上的应用程序所需的雷竞技最新网址修正很小,使用的条目数量可能会减少。
存储需求的比较方法,假设一个存储条目所需的每个值存储查找表和线性插值。
谐波线性化,需要两个存储条目(相位和振幅)每个谐波和直流偏置需要存储。这让存储条目的数量n次谐波
2×n+ 1。
对于谐波校正,应用谐波振幅递减的顺序选择。这意味着,例如,修正第九次谐波(0.0429°)的振幅校正之前添加了7日和8日谐波(振幅分别为0.0361和0.0257°)。对于side-shaft应用程雷竞技最新网址序,是很常见的,第二和第四谐波是比其他人更强。在这种情况下,只有纠正这两个可能是有用的。
确定的最大绝对误差在一个完整的旋转和绘制存储需求如图25所示。
结论
本文档细节三种可能的方法来线性化角传感器数据使用单片机。实现覆盖范围广泛的内存和处理时间的要求。
接触一个快速的代表对于任何剩余的问题或支持。
附录A: LSQ_LUT_PIECEWISE函数
从https://uk.mathworks.com/matlabcentral/fileexchange/40913-piecewise-linear-least-square-fit。
版权(c) 2013年,圭多Albertin
保留所有权利。
再分配和使用源代码和二进制形式,有或没有修改,允许提供满足下列条件:
*分发源代码必须保持上述版权声明,这个列表的条件以及其后的免责声明。
*以二进制形式重新发布必须保留未经修改的上述版权通知,这个列表的条件以及其后的免责声明提供的文档和/或其他材料分布
这个软件提供的版权所有者和贡献者”是“和任何明示或默示保证,包括但不限于适销性的隐含保证和健身为特定目的是否认的。没有版权所有者或贡献者概对任何直接、间接、附带、特别,模范,或间接的损害赔偿(包括但不限于替代产品或服务的采购;损失的使用、数据或利润;或业务中断)然而造成任何理论的责任,无论是在合同,严格责任,或侵权行为(包括疏忽或其他)引起的以任何方式使用这个软件,即使建议的这种损害的可能性。
函数(YI) = lsq_lut_piecewise (x, y, XI)
% LSQ_LUT_PIECEWISE分段线性插值的一维插值(查表)
%易= lsq_lut_piecewise (x, y, XI)获得最佳(最小二乘意义上)
%向量与线性插值程序使用。
%的目标是找到Y给X函数的最小化
% f = | y-interp1 (XI,咦,x) | ^ 2
%
%的输入
% x测量数据向量
% y测量数据向量
% XI破发点的一维表
%
%输出
%易插值点的一维表
% y = interp1 (XI,咦,x)
%
如果大小(x, 2) ~ = 1
错误(的n维向量x必须x 1。');
elseif大小(y, 2) ~ = 1
错误(的n维向量y必须x 1。');
elseif大小(x, 1) ~ =大小(x, 1)
错误(向量x和y一定维数n x 1。');
结束
x %矩阵定义的测量
一个=稀疏([]);
%为y测量向量
Y = [];
j = 2:长度(XI)
%得到点本指数(ξ(j - 1)ξ(j))
第九= x > = XI (j - 1)和x < XI (j);
%检查如果我们在本数据点
如果~(第九)
警告(sprintf(“本(% % f)没有数据点,检查评估。
请重新定义相应的X向量。”,XI (j - 1), XI (j)));
结束
%获得x和y数据子集
间= x (ix);
y_ = y (ix);
%创建临时添加到一个矩阵
tmp =(((间+ XI (j - 1)) / (XI (j)习近平(j - 1)) + 1) ((x_-XI (j - 1)) / (XI (j)习近平(j - 1))));
%建立测量矩阵与约束
(m1, n1) = (A)大小;
(m2, n2) = (tmp)大小;
A = [[0 (m1, n2-1)]; [0 (m2, n1-1) tmp]];
%连接y测量本
Y = [Y;y_];
结束
%获得最小二乘估计
易= \ Y;
附录B: BIN_MEAN函数
版权(c) 2018年,杜米尼克聊聊,快板MicroSystems德国Gm雷竞技竞猜下载bHvAll版权。
再分配和使用源代码和二进制形式,有或没有修改,允许提供满足下列条件:
*分发源代码必须保持上述版权声明,这个列表的条件以及其后的免责声明。
*以二进制形式重新发布必须保留未经修改的上述版权通知,这个列表的条件以及其后的免责声明提供的文档和/或其他材料分布
这个软件提供的版权所有者和贡献者”是“和任何明示或默示保证,包括但不限于适销性的隐含保证和健身为特定目的是否认的。没有版权所有者或贡献者概对任何直接、间接、附带、特别,模范,或间接的损害赔偿(包括但不限于替代产品或服务的采购;损失的使用、数据或利润;或业务中断)然而造成任何理论的责任,无论是在合同,严格责任,或侵权行为(包括疏忽或其他)引起的以任何方式使用这个软件,即使建议的这种损害的可能性。
函数(YI) = bin_mean (x, y, XI)
% BIN_LUT本为一维查找表插值(查表)
%易= lsq_lut_piecewise (x, y, XI)获得最佳(最小二乘意义上)
%值之间的近邻查找表本XI中定义的边界。
如果((大小(x, 1) ~ = 1) & &(大小(x, 2) ~ = 1))
错误(' n维向量x必须x 1或1 x n ');
elseif(大小(y, 1) ~ = 1) & &(大小(y, 2) ~ = 1))
错误(' n维向量y必须x 1或1 x n ');
elseif长度(x) ~ = (y)
错误(向量x和y必须有相同的长度”);
结束
易= 0((长度(XI) 1), 1);
j = 1:(长度(XI) 1)
易(j) =意味着(y ((x > = XI (j)) & (x < XI (j + 1))));
结束
附录C:功能完整的脚本中使用这个应用程序
版权(c) 2018年,杜米尼克聊聊,快板MicroSystems德国Gm雷竞技竞猜下载bH保留所有权利。
再分配和使用源代码和二进制形式,有或没有修改,允许提供满足下列条件:
*分发源代码必须保持上述版权声明,这个列表的条件以及其后的免责声明。
*以二进制形式重新发布必须保留未经修改的上述版权通知,这个列表的条件以及其后的免责声明提供的文档和/或其他材料分布
这个软件提供的版权所有者和贡献者”是“和任何明示或默示保证,包括但不限于适销性的隐含保证和健身为特定目的是否认的。没有版权所有者或贡献者概对任何直接、间接、附带、特别,模范,或间接的损害赔偿(包括但不限于替代产品或服务的采购;损失的使用、数据或利润;或业务中断)然而造成任何理论的责任,无论是在合同,严格责任,或侵权行为(包括疏忽或其他)引起的以任何方式使用这个软件,即使建议的这种损害的可能性。
% %传感器数据的定义
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) | | (diff (angle_input) < = 0)
错误(“基准角必须monotonuously上升0到360之间的);
结束
% %检查正确的传感器的角度范围
如果任何(sensor_data < 0) | |任何(sensor_data > 360)
错误(传感器角必须在0到360之间的);
结束
% %预处理
sensor_data_2 = sensor_data (:);
angle_input = angle_input (:);
%检查不断上升最多一个溢出
如果任何(diff (sensor_data_2) = = 0)
错误(传感器数据必须是单调递增)
elseif总和(diff (sensor_data_2) < 0) < = 1
%上升角度数据与零个或一个溢出,溢出会纠正
sensor_data_2 = sensor_data_2 (:) + 360 * cumsum([假;diff (sensor_data_2 ()): < 0]);
elseif总和(diff (sensor_data_2) < 0) > 1
错误(只有一个数据减少允许溢出)
结束
%正确环绕传感器数据
rollovercorrection =圆((平均(sensor_data_2) - 180) / 360) * 360;
sensor_data_2 = sensor_data_2 - rollovercorrection;
%扩展传感器数据
sensor_data_ext = [sensor_data_2 (:);sensor_data_2 (:) + 360;…
sensor_data_2 (:) + 720];
%扩展输入数据
angle_input_ext = [angle_input (:);angle_input (:) + 360;…
angle_input (:) + 720];
% %情节磁铁预处理完成后测量
人物,情节([angle_input (:)), [sensor_data_2(:)),“啊——”);
包含(“编码器角度(度)”);
ylabel(“输出角(度)”);
网格;
xlim (360 [0]);
标题({编码器方向输出磁场方向过去});
% %使用样条来移动数据从一个命令输入电网
%到有序输出网格:
ordered_output_grid = 0 (360/4096): (360 - 360/4096);
intermediategrid = ordered_output_grid + 360;
投影=花键(sensor_data_ext, angle_input_ext,…
intermediategrid);
%计算所需数据的修正:
correction_curve =投影- intermediategrid;
correction_curve = correction_curve (:);
% %傅里叶变换的修正,丢弃后,16日的值
%和扩展能源表的长度
雷竞技竞猜下载快速的微系统,LLC 20
周边路955号
曼彻斯特,NH 03103 - 3353美国
www.wasanxing.com
fft_table = fft长度(correction_curve) / (ordered_output_grid);
offset_correction = abs (fft_table (1));
correction_pha =角(fft_table (17));
correction_amp = 2 * abs (fft_table (17));
% %谐波校正申请四次谐波
restored_signal_4_harmonics =国防部(sensor_data + (…
offset_correction +……
correction_amp (1) * cos (1 * (sensor_data / 360 * 2 *π)+ correction_pha (1) +…
correction_amp (2) * cos (2 * (sensor_data / 360 * 2 *π)+ correction_pha (2)) +…
correction_amp (3) * cos (3 * (sensor_data / 360 * 2 *π)+ correction_pha (3)) +…
correction_amp (4) * cos (4 * (sensor_data / 360 * 2 *π)+ correction_pha (4))…
),360);
% %修正曲线的分段线性近似
lin_sup_nodes = 32;
%,以避免重复校正表三次
%角落对校正计算的影响。
triple_correction_curve = repmat (correction_curve 3 1);
triple_correction_curve结束(+ 1)= triple_correction_curve (1);
%的角度输入
triple_output_grid = 0 (360/4096): (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);
%只使用中央点计算更正:
YI_lin = YI_lin_triple (lin_sup_nodes + 1: 2 * lin_sup_nodes + 1);
XI_lin = linspace(0360年,lin_sup_nodes + 1);
% %执行线性插值
restored_linear_signal =国防部(sensor_data (:) +…
interp1 (XI_lin、YI_lin sensor_data(:),“线性”),360);
% %手动执行线性插值
restored_linear_signal_man = 0(长度(sensor_data), 1);
lin_sup_res = 360 / lin_sup_nodes;
i = 1:长度(sensor_data)
%索引的表进入传感器前角
baseangle_idx =地板(sensor_data(我)/ lin_sup_res);
baseangle = baseangle_idx * lin_sup_res;
%的度,是我们过去的表条目
offsetangle = sensor_data (i) - baseangle;
% +修正基地
correctionval = YI_lin (baseangle_idx + 1) +…
((YI_lin (baseangle_idx + 2) -…
YI_lin (baseangle_idx + 1) * offsetangle / lin_sup_res);
restored_linear_signal_man (i) =国防部(sensor_data(我)+…
correctionval, 360);
结束
% %执行查表修正
number_table_entries = 64;
%选择本边界
XI_binlimits = linspace(0360年,number_table_entries + 1);
%找到点的平均每本使用bin_lut函数:
YI_lut = bin_mean (ordered_output_grid (:),……
correction_curve (:), XI_binlimits (:));
% %应用查表线性化
restored_lut_signal =国防部(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;
i = 1:长度(sensor_data)
%索引的表进入传感器前角
baseangle_idx =地板(sensor_data(我)/ table_res);
correctionval = YI_lut (baseangle_idx + 1);
restored_lut_signal_man (i) =国防部(sensor_data(我)+…
correctionval, 360);
结束
% %情节lienarization后的剩余误差的三种方法
图;
情节(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 (360 [0]);包含(“测量角(度)”);
ylabel(线性化后的预期误差[度]”);
本文档中包含的信息并不构成任何表示,保修,保证,担保,或诱因快板给客户关于本文的主题。提供的信息并不能保证一个过程根据这些信息将是可靠的,或者急速地探索所有可能的失效模式。是客户的责任做足够的资格测试的最终产品,以确保它是可靠和满足所有的设计要求。
1]快板角位置传感器ICs, / en /产品/磁-
Linear-And-Angular-Position-Sensor-ICs / Angular-Position-Sensor-ICs.aspx