Allegro AAS33001和AAS33051角度传感器IC的线性化参数计算

Allegro AAS33001和AAS33051角度传感器IC的线性化参数计算

下载PDF版本

由Dominik Geisler,
亚博棋牌游戏Allegro MicroSystems,LLC

介绍

磁角传感器通常是快速,可靠,非接触式测量系统的良好选择,特别是在脏环境中,光学编码器可能不具有良好拟合。

亚博棋牌游戏Allegro MicroSystems, LLC提供广泛的角度传感器IC.对于不同的应用程序。亚博尊贵会员这些传感器IC可以测量侧轴或轴端设置中的径向磁化编码器磁体的角度,如图1所示。

图1:侧轴测量角度(左)和轴端角度测量(右)
图1:侧轴测量角(左)和
轴末端角度测量(右)

测量误差

所有Allegro角度传感器IC都使用同质磁场在出厂的最终测试中校准。这样做是为了最小化传感器的本地错误。然而,特别是在侧轴应用中,传感器换能器处的磁场角与待测量的轴的机械角亚博尊贵会员度不相同。这种差异的主要贡献者是从编码器磁体发出的磁场的形状。

机械和磁场角之间的其他不匹配源是磁体未对准,磁体缺陷,剩余传感器不准确和漂移,以及铁磁材料的存在。

可以得出结论,所有系统,尤其是侧面系统,在编码器角度和测量角度之间存在不匹配。可以在图2中看到侧轴应用的典型转移曲线。

图2:在侧轴设置中模拟传感器读数与编码器角度
图2:模拟传感器读取与编码器
侧轴设置中的角度

这些测量误差称为非线性,可以通过称为线性化的过程来补偿。

线性化

一些allegro传感器IC,如A1335, 这AAS33001,而且AAS33051具有嵌入式逻辑,允许输入数据的线性化。此应用笔记将解释如何使用AAS33001和AAS33051的线性化功能。为了简化对这些部件的引用,两者都将被称为AAS330x1以后。

此应用程序注意将:

  • 解释线性化的基础
  • 解释AAS330x1线性化功能
  • 展示如何处理测量数据以计算校正数据
  • 解释如何计算传感器参数
  • 线性化后的准确性

定义

编码器角度

通过精确的高分辨率外部编码器报告的角度。

传感器角度

角度传感器IC所报告的角度。

角误差

角度误差是通过角度传感器IC测量的磁体的实际位置与磁体的位置之间的差异。这是通过从传感器角度减去编码器角度来计算的:

ERROR =(α_Sensor - α_Encoder)。

但是,如果传感器角度为359°,则编码器角为0°,则误差应为-1°且不+ 359°。要在±180°之外的任何错误缠绕,可以使用Modulo操作员:

error = mod [(α_sensor - α_encoder)+ 180,360] - 180。

图3中给出了侧轴应用中的角度误差的样品图。

最大绝对角度误差

最大绝对角误差是通过在完全旋转上通过角度传感器IC测量的磁体的实际位置与磁体的位置之间的最大绝对差。
在图3中,最大角度误差为21.46°,以56°的编码器角度测量。

图3:与传感器输出图相比的角度误差
图3:与传感器输出图相比的角度误差


线性化的目标

线性化的目标是确定,存储和应用一个功能,该功能最小化测量的传感器角度误差与编码器角度值相比。这最大限度地减少了测量的传感器角度和实际编码器角之间的差异。

图4:线性化的目标:从传感器角度到编码器角度
图4:线性化的目标:从传感器获取
角度角度的角度

这种目标可以以不同的方式实现。在此应用中将详细介绍三种常见技术。亚博尊贵会员

呈现的技术取决于单个校准相(通常在客户端的线末端测试中执行),之后应用固定校正功能。

线性化的先决条件

使用此处详述的技术进行线性化的先决条件如下:

  • 在生产过程中,需要将已知的角度应用于传感器系统。
  • 在生产过程中,需要读出传感器角度。
  • 要线性化的系统需要一个微控制器,在生产过程中写入线性化信息,并且在应用程序中执行线性化。

限制线性化

使用此处描述的方法的线性化有一些限制:

  • 线性化不会纠正传感器噪声。
  • 校准后传感器的任何漂移都不会被校正。
  • 校准后机械系统的变化不会通过线性化校正。由于振动和扭矩,常用例是磁体位置的动态变化。
  • 如果在校准期间的输入位置不准确地记录,则校正的准确性将以相同的方式受到限制。

线性化方法

1.数据记录

为了产生线性化所需的数据,测量传感器输出[y0.......N在已知编码器角度[x0.… XN].这些编码器的角不需要等距,尽管通常使用等距角。

值的记录如图5所示。

图5:数据记录
图5:数据记录

2.坐标转换传感器角度

由于校正功能必须基于传感器数据工作,因此应将记录的数据点转换为传感器坐标系。这意味着代替将传感器角度表达为实角度,而是需要表达作为传感器角度的功能的实角度。因此,传感器角度[y'0....... y'N选择,相应的编码器角度[x'0.… X'N]需要确定。为此,需要通过数据点应用拟合。这可以通过样条插值来完成,如图6所示。

图6:坐标转换成传感器角度
图6:坐标转换成传感器角度

3.修正曲线计算

为了创建将在传感器上测量的角度转换为编码器角度的功能,需要计算校正值。这些校正值计算为[c0.… CN] = [x'0.… X'N] - [y'0....... y'N].

图7:校正值计算
图7:校正值计算

最后,这些值描述了校正曲线C,C,其将校正值作为传感器角度。图8示出了传感器角度的曲线C的曲线图。

图8:修正曲线
图8:修正曲线

4.校正曲线应用于数据

为了将校正应用于测量的传感器数据点,需要基于校正曲线C计算传感器数据点Y的校正值C.这是图形方式表示的。

图9:在校正曲线C上找到值C = F(Y)
图9:在校正曲线C上找到值C = F(Y)

然后将正确的角度值x确定为x = y + c.这是图形的图10中表示的。
图10:使用校正曲线查找值x = y + c
图10:查找值x = y + c使用
校正曲线

校正曲线确定

本文档中的实现是在MathWorks Matlab™中实现的。由于这是商业软件,许可费用适用于使用它,这可能会阻碍在生产环境中使用。Matlab的免费软件替代品是GNU Octave,可免费提供GNU GPLv3许可证。

本文档中使用的所有功能都由MATLAB和GNU Octave提供支持。

传感器输出捕获

必须由用户捕获传感器角输出的初始数据。这是通过设置某些已知角度来完成的,在本文档中称为编码器角度。然后记录传感器角度。传感器角度是由传感器测量的角度。记录的点数可以更多或小于线性校正点的数量。录制更多点,如果可能,总是更好。

通常,记录至少16个数据点就足以在轴上的情况下获得良好的校正性能。在离轴情况下,建议至少32点。

使用N个段(例如32)应用分段线性校正,记录至少n个点将充分利用可用的校正点。录制大约2×n点导致几乎理想的性能。表1给出了记录点的真实例子。

表1:录制的编码器和输出角度

图11:表1中的数据绘图
图11:表1中的数据绘图

传感器输出溢出溢出

传感器数据中的跳跃约为100°输入角度将导致下一个处理步骤中的困难。通过向跳转到负方向后向所有值添加360°来除去它。此外,数据的平均值应在±180°内,以避免以后处理的其他问题。这是通过以下行实现的:

%%预处理
%检查是否连续上升/下降,最大一个溢出
If any(diff(sensor_data_2) == 0)
错误('传感器数据必须单调增加或减少')
ELESEIF SUM(差异(SENSOR_DATA_2)<0)<= 1
%上升角数据有零或一个溢出,溢出将被纠正
sensor_data_2 = sensor_data_2(:) + 360 * cumsum([false; diff(sensor_data_2(:))
<0]);
Elseif sum(diff(sensor_data_2) > 0) <= 1
将校正零或一个溢出的%下降角度数据,溢出将被纠正
sensor_data_2 = sensor_data_2(:) - 360 * cumsum([false; diff(sensor_data_2(:))
> 0]);
其他的
错误('允许只有一个数据溢出')
结尾
输入数据的方向可能需要反转。通过以下行检测并执行此操作:
如果需要,%反转角度方向
如果所有(差异(Sensor_Data_2)<0)
DISP('反相角度方向...')
sensor_data_2 = -sensor_data_2;
raw_direction = -1;
否则所有(差异(sensor_data_2)> 0)
RAW_Direction = +1;
其他的
错误(检测到的非单调角度变化')
结尾
数据的均值应在±180°以内,以避免后期处理时出现其他问题。这是通过以下行实现的:
%正确缠绕传感器数据
rollovercorrection = round((平均值(sensor_data_2) - 180)/ 360)* 360;
sensor_data_2 = sensor_data_2 - 翻转粗描;
结果值如表2所示。

表2:拆除溢出后的编码器和输出角度

图12:来自表2的数据图
图12:来自表2的数据图

数据复制

最终,需要基于0°至360°的基于传感器角度的校正数据。为避免任何边缘效果,传感器数据将被复制三次。这通过始终始终安全地将来自传感器角度360°至720°的值放置的可能性来避免所有情况下的边缘效应。
%延长传感器数据

sensor_data_ext = [sensor_data_2 (:);sensor_data_2 (:) + 360;......
sensor_data_2(:) + 720];
%延长输入数据
discle_input_ext = [Anight_Input(:);Angle_Input(:) + 360;......
Angle_Input(:) + 720];

投影到传感器数据网格上

在下一步骤中,计算与在下面的代码中的360°和720°之间的传感器输出相对应的编码器角输入(称为“中间化”)。这是通过4096步进行的,作为这种中间步骤的高分辨率,有利于最终输出质量。

%%使用样条曲线从有序的输入网格移动数据
%到有序输出网格上:
Ordered_output_grid = 0:(360/4096):( 360-360 / 4096);
intermediateGrid = Ordered_output_grid + 360;
投影=样条曲序(Sensor_data_ext,Antle_Input_ext,...
中间奖金);
该步骤在图13中以图形方式示出。

图13:找到编码器角度(“投影”)作为固定网格传感器角度的投影(“中间奖金”)
图13:找到编码器角度(“投影”)如
固定网格传感器角度的投影(“中间奖金”)
角度编码器值和传感器输出之间的差异是校正曲线,并且可以通过从计算出的匹配编码器角减去固定网格传感器角来计算。
%计算数据所需的校正:
校正_curve =投影 - 介入;
校正_curve = correnction_curve(:);
校正曲线可以在图14中看到。
图14:我们的示例的校正曲线
图14:我们的示例的校正曲线

简要检查是否可以看到此曲线是正确的。在表1中,可以看出,对于137.46°的传感器角度,编码器角度为213.75°。图14的校正曲线表明,在137.5°的传感器角度,需要施加+ 76.29°的校正。AS 137.46 + 76.26 = 213.72°≅213.75°,计算的校正曲线适用。

在下一步骤中,校正曲线需要存储在AAS330x1中。为了解释传感器如何应用校正,首先将首先解释分段线性校正的概念,然后解释AAS330x1硬件功能,以便确定实际校正值。

线性插值

概念

校正曲线可以通过分段线性函数近似。对于此功能,需要将支持点存储为传感器坐标对和校正值。

在图8中,这些对将是[(y'0.c0.,)...(y'NcN)]。

在支撑点之间,执行线性插值。

在角度传感器线性化应用中,使用等距传感器角度网格是有用的。亚博尊贵会员这样,传感器的角度值[y'0…y'n]就不需要存储,线性校正的实现也更容易。例如,可以存储32个校正值,然后应用于0°、11.25°、22.50°等传感器角度。

要存储的点可以由不同的标准确定。确定它们的最简单方法是通过在所述传感器角处选择校正曲线上的点,这将被称为“曲线上”线性插值。然而,也可以针对存储的校正曲线的最小二乘误差进行优化。这将被称为“最小二乘”线性插值。

其他优化策略是可能的,但不会在本文档中描述。

在该示例中,在该示例中看到了从该示例的曲线和最小二乘校正参数之间的差异。

图15:用曲线上和最小二乘法确定参数的线性插值与理想修正曲线的对比
图15:使用参数确定的理想校正曲线与线性插值的比较
曲线和最小二乘法

对于相同的最大误差,最小二乘法减少了约50%所需的存储参数量,对单个测量异常值不太敏感。因此,这里将使用至少方法来确定线性插值支持点。

执行

需要使用分段线性函数来近似校正曲线。因为应以最小二乘误差方式选择支持点,所以支持点之前和之后的数据也有助于确定其最终值。

这为第一个和最后一点创造了一个问题。在0°的第一个支撑点仅在右侧具有校正曲线,使得不考虑接近360°的数据。为了避免这个问题,校正曲线将重复三次,并且将计算该曲线的分段线性最小二乘近似。然后只使用中央部分来选择所使用的参数。这个概念如图16所示。

图16:重复三次的校正曲线,最小二乘拟合,使用中心点
图16:重复三次的校正曲线,最小二乘拟合,使用中心点

适合计算

复制校正曲线并计算拟合的代码如下:

校正曲线的%%分段线性近似
lin_sup_nodes = 32;
%重复校正表三次以避免
修正计算的%角效果。
triple_correction_curve = repmat(校正_curve,3,1);
triple_correction_curve(end + 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);
%仅使用中心点来计算校正:
y_lin = y_lin_triple (lin_sup_nodes+1: 2*lin_sup_nodes+1);
xi_lin = linspace(0,360,lin_sup_nodes + 1);

LSQ_LUT_PICEWISE功能在附录A中重印。

下面找到32点线性插值的校正参数列表:

表3:线性插值参数

注意,360°的校正参数也显示了,即使它与0°的校正参数相同。这是为了在MATLAB脚本中校正348.75°和360°之间的角度。然而,AAS330x1并不单独存储360°值,而是使用0°值。

图17显示了线性化后输出误差如何随着线性化点的数量增加而降低。当使用32个线性化点时,角度误差变得非常小,显示在AAS330x1中实现的数字足够。

图17:线性化后的剩余角度误差随着本文档中的示例的越来越多的线性支撑节点
图17:线性化后的剩余角度误差
随着越来越多的线性支持节点
本文档中的示例

要了解如何确定AAS330x1编程参数,首先将首先讨论AAS330x1的硬件功能。

AAS330x1线性化功能

AAS330x1使用32段分段线性近似存储校正曲线。校正值在0°,11.25°,22.50°,...,348.75°的等距传感器角度施加。在这些点之间,应用两个相邻支撑点之间的线性插值。传感器在188 NS执行线性化,这比大多数微控制器快得多
实施。

硬件功能

AAS330x1包含偏移级,线性化级和旋转方向逆变器。如图18所示,可以在线性化之前或之后执行偏移调整。在本文档中,将假设“线性化之后的零”被设置为“1”,这意味着将在线性化之后执行偏移调整。

图18:简化的AAS330x1信号路径,“zal”设置为“1”
图18:简化的AAS330x1信号路径,“zal”设置为“1”

旋转方向

传感器的旋转方向可以倒置。如果已启用,则角度值反转:

分段线性化

通过将“ELI”设置为“1”,使能分割的线性化。如果启用,则以(## / 32)×360°的角度从传感器输出中减去值“LIN ##”。例如,“LIN10”的值施加在(10/32)×360°= 112.5°处。这些角度之间的值在相邻的支撑点之间线性内插。例如,将基于“LIN10”和“LIN11”的值来确定115°处的校正值。

LIN字段是12位符号值,并用2的补充编写。分辨率取决于位“LS”,对于“LS”='0'和45°/ 2048 LSB为“LS”='1',是22.5°/ 2048LSB。因为从角度下减去它们,所以LIN字段中的负值增加了传感器的角度输出。这在下表中详述:

表4:录制的CONODER和SENSOR_DATA的输出角度

例如,如果LIN00的值设置为0xD0F,则表示为3343-212 = -753的十进制值。如果“LS”设置为“0”,则这等于22.5°/ 2048 LSB×(753LSB)= -8.27°的角度值。将从测量的角度减去该值,因此对于0°的输入,线性化块将输出0° - (-8.27°)= + 8.27°。

抵消调整

传感器的偏移调整级将传感器的零值对准到外部编码器的零值。它由EEPROM字段“ZERO_OFFSET”控制,允许编写12位值。该无符号值表示0°和(4095/4096)×360°之间的角度,从原始角度值中减去。



180°旋转

在最终处理步骤中,传感器输出可以旋转180°:

该功能可以通过偏移级同样良好地执行,从而不会使用本文档中的芯片旋转功能。

参数计算

了解传感器的工作原理,表3中描述的校正曲线现在可以根据传感器参数表示。这是通过首先使用关于旋转方向和从数据确定的偏移的信息来完成的。然后可以选择线性化参数比例,并且可以确定完整的线性化值表。

%%计算AAS330x1参数
% "zal":零后线性化始终为零
disp(['*** AAS330x1 "zal"参数在EEPROM中应设置为1']);
%“Eli”:启用线性化始终是一个
DISP(['*** AAS330x1“EEEPROM中的”ELI“参数应设置为1']);
如果传感器角度的方向是,则应使能量旋转应使能
减少。
if(raw_direction == -1)
sensor_eeprom_val_ro = 1;
其他的
sensor_eeprom_val_ro = 0;
结尾
DISP(['*** *** AAS330x1“RO”参数在EEPROM中应设置为“
num2str(sensor_eeprom_val_ro)]);
%“zero_offset”:偏移应设置为min和max偏移的平均值。
%这将充分利用+/-45度的范围
线性化参数具有。
zerou_offset =均值([min(yi_lin)max(yi_lin)]);
从角度数据中减去%传感器偏移。如果传感器方向是
倒置,这发生在角度反转之前,
%使传感器偏移标志必须在这种情况下反转
sensor_eeprom_val_zero_offset = uint16(mod(rower(-zero_
offset / 360 * 4096),4096));
DISP(['*** AAS330x1“ZERO_OFFSET”参数在EEPROM中应设置为“
num2str(sensor_eeprom_val_zero_offset)]);
%“LS”:必须根据最大参数设置线性化刻度
价值观。
线性化_range_small = 22.5 * (2047/2048);
linearization_range_large = 45.0 *(2047/2048);
如果圆(max(abs(yi_lin - zero_offset)))sensor_eeprom_val_ls = uint16(0);
elseif round(max(abs(YI_lin - zero_offset))) < linearization_range_large
sensor_eeprom_val_ls = uint16(1);
其他的
误差('线性化参数超出+/-45°范围;
线性化不可能')
结尾
EEPROM中['*** AAS330x1 "ls"参数应设置为'
num2str(sensor_eeprom_val_ls)]);
%“lin _ ##”参数
if(sensor_eeprom_val_ls == 0)%小范围+/- 22.5°
sensor_eeprom_val_lin = int16(rower(relox_offset-yi_lin(1:lin_sup_
节点)))/ 22.5 * 2048));
else%更大的+/- 45.0°
sensor_eeprom_val_lin = int16(rower(relox_offset-yi_lin(1:lin_sup_
节点)))/ 45.0 * 2048));
结尾
EEPROM中的"LIN_##"参数应设置为
以下值:']);
disp (num2str (sensor_EEPROM_val_LIN));
%%编写Allegro AAS330x1样本程序员的CSV表
eptable =细胞(38,2);
效果(1,1:2)= {'EEPROM',''};
效果(2,1:2)= {'zal',1};
EEPtable(1:2) ={“艾利”,1};
效果(4,1:2)= {'ro',sensor_eeprom_val_ro};
效果(5,1:2)= {'zero_offset',sensor_eeprom_val_zero_offset};
效果(6,1:2)= {'ls',sensor_eeprom_val_ls};
对于i = 1:32
效果{6 + i,1} = num2str(['线性化错误段'num2str(i-
1, ' % 2 d '));
【6 + i,2} = num2str(sensor_eeprom_val_lin(i));
结尾
Cell2CSV('EEP_TABLE.CSV',效果);
在此代码末尾,函数Cell2CSV用于编写可以由Allegro AAS33001 / AAS33051样本程序员导入的CSV表。功能Cell2CSV在附录B中被重印。许多类似的功能在循环中,但提供的功能应该足够。我们的例子的结果表如下:
EEPROM,
Zal,1
Eli,1
ro,0
Zero_Offset,3103
ls, 0
线性化误差段00,-973
线性化误差段01,-1009
线性化误差段02,-981
线性化误差段03,-881
线性化误差段04,-701
线性化误差段05,-492
线性化误差段06,-278
线性化误差段07,-18
线性化错误段08,245
线性化误差段09,487
线性化误差段10,701
线性化误差段11,875
线性化误差段12,994
线性化误差段13,1009
线性化误差段14,924
线性化误差段15,699
线性化误差段16,323
线性化误差段17,-54
线性化误差段18,-402
线性化误差段19,-600
线性化误差段20,-707
线性化误差段21,-744
线性化误差段22,-694
线性化误差段23,-627
线性化误差段24,-558
线性化误差段25,-474
线性化误差段26,-428
线性化误差段27,-411
线性化误差段28,-494
线性化误差段29,-578
线性化误差段30,-748
线性化误差段31,-865

绩效估计数

用所使用的参数线性化后的精度可以在仿真中估计。为此,需要在模拟中应用已确定的线性化参数,并结合可选方向反演:

%%在matlab中执行线性化
Restored_linear_signal = mod(raw_direction*sensor_data(:) +…
interp1 (XI_lin YI_lin,国防部(raw_direction * sensor_data(:), 360),“线性”),360);
%%在MATLAB中绘制线性化后的剩余错误
图;
绘图(Aligh_Input(:),Mod(180 + Restored_Linear_Linear_SigneR_Linear_Signal(:) - Angle_Input(:),360) -
180,'.-');
网格;图例('线性插值(32个段)');
xlim (360 [0]);ylim([ - 1 1]);
Xlabel('测量角度°');
ylabel('线性化后的预期误差[deg]');
图19显示了AAS330x1中线性化后的预期角度误差:
图19:使用本文档中描述的AAS330x1线性化后的剩余角度误差,例如来自本文档的示例
图19:线性化后的剩余角度误差
使用本文档中所述的AAS330x1,
对于本文档的示例

结论

本文档一般地解释了线性化背后的理论,并描述了可以完成校正的线性近似程度。

AAS33001和AAS33051允许分段线性化。该线性化方法由传感器的0.2μs执行,并通过32个段实现非常好的精度。

使用本文档,任何用户都应该能够确定AAS33001和AAS33051的最佳线性化参数。

联系Allegro代表,了解任何剩余的问题或支持。

附录A:功能LSQ_LUT_PICEWISE

https://uk.mathworks.com/matlabcentral/fileexchange/40913-piecewise-linear-least-square-fit。

版权所有(c)2013,Guido Albertin

版权所有。

如果满足以下条件,则允许在源和二进制表单中重新分配和使用或不使用修改使用:

*源代码的重新分配必须保留上述版权声明,此条件清单和以下免责声明。

*二进制形式的再分配必须重现上述版权声明,此条件清单以及以下文件和/或其他材料中提供的其他材料中的免责声明

该软件由版权所有者和贡献者提供“原样”,并提供任何明示或暗示的保证,包括但不限于默示的默示和特定目的的适应性的暗示保证。在任何情况下,版权所有者或贡献者都应对任何直接,间接,偶然,特殊,示范性或相应的损害负责(包括但不限于采购替代商品或服务;使用丧失,数据或利润;然而,或者业务中断)造成和任何责任理论,无论是在合同,严格的责任或侵权行为(包括疏忽或其他方式),也以任何方式出现在使用本软件的情况下,即使涉及此类损害的可能性也是如此。

功能[yi] = lsq_lut_piecewise(x,y,xi)
1-D插值的%LSQ_LUT_PIECEWISE分段线性插值(表查找)
% YI = lsq_lut_分段(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
错误('向量x必须具有维度n x 1.');
ELESEIF大小(y,2)〜= 1
错误('矢量y必须具有维度n x 1.');
elsefif大小(x,1)〜=尺寸(x,1)
错误('向量x和y必须具有维度n x 1.');
结尾
%矩阵由X测量定义
a =稀疏([]);
Y测量的%矢量
y = [];
对于j = 2:长度(xi)
%获得箱中的点索引[xi(j-1)xi(j)]
ix = x> = xi(j-1)&x 检查bin中是否有数据点
如果〜任何(ix)
'Bin [%f %f]没有数据点,检查估计。
',XI(j-1),XI(j)));
结尾
%get x和y数据子集
x_ = x(ix);
y_ = y (ix);
创建要添加到A的临时矩阵
tmp = [((-x_ + xi(j-1))/(xi(j)-xi(j-1))+ 1)((x_-xi(j-1))/(xi(j) -XI(J-1))))];
用约束构建测量矩阵
[m1,n1] =尺寸(a);
[M2,N2] =尺寸(TMP);
a = [[[零(m1,n2-1)]; [零(m2,n1-1)tmp];
箱的%contenate y测量
y = [y;Y_];
结尾
%获得最少的平方Y估计
易= \ Y;

附录B:功能Cell2CSV

基于https://uk.mathwands.com/matlabcentral/fileexchange/7601-cell2csv.

函数cell2csv(文件名,cellarray,delimiter)
%将单元数组内容写入* .csv文件。

%Cell2CSV(文件名,CellArray,分隔符)

%filename =要保存的文件的名称。[即'text.csv']
%Cellarray =数据中的小区数组的名称
%delimiter =单独的符号,通常是:','(它默认)

%由Sylvain Fiedler,Ka,2004年
由Rob Kohr,Rutgers,2005修改% - 改为英语和固定分隔符
由Dominik Geisler修改%,Allegro Mic亚博棋牌游戏rosystems,2018 - 删除了'eval'功能
如果nargin <3
分隔符= " ";
结尾
文件= fopen(文件名,' w ');
对于z = 1:尺寸(Cellarray,1)
对于S = 1:尺寸(Cellarray,2)
var = cellarray {z,s};
如果尺寸(var,1)== 0
var ='';
结尾
If isnumeric(var) == 1
var = num2str(var);
结尾
fprintf(文件,var);
如果s〜= size(cellarray,2)
fprintf(文件,[分隔符]);
结尾
结尾
fprintf(文件,'\ n');
结尾
fclose(文件);

附录C:在本申请中使用的整个脚本

版权所有(c)2018,Dominik Geisler,Allegro M亚博棋牌游戏icrosystems德国GmbH

版权所有。

如果满足以下条件,则允许在源和二进制表单中重新分配和使用或不使用修改使用:

*源代码的重新分配必须保留上述版权声明,此条件清单和以下免责声明。

*二进制形式的再分配必须重现上述版权声明,此条件清单以及以下文件和/或其他材料中提供的其他材料中的免责声明

该软件由版权所有者和贡献者提供“原样”,并提供任何明示或暗示的保证,包括但不限于默示的默示和特定目的的适应性的暗示保证。在任何情况下,版权所有者或贡献者都应对任何直接,间接,偶然,特殊,示范性或相应的损害负责(包括但不限于采购替代商品或服务;使用丧失,数据或利润;然而,或者业务中断)造成和任何责任理论,无论是在合同,严格的责任或侵权行为(包括疏忽或其他方式),也以任何方式出现在使用本软件的情况下,即使涉及此类损害的可能性也是如此。

%%传感器数据定义
Angle_Input = [0:11.25:348.75];
SENSOR_DATA = [266.31 278.61 290.39 301.932.75 323.00 332.75 342.69 352.79 3.16 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];
%%检查上升参考角度
如果有的话(角度_input <0)||任何(角度_input> 360)||任何(diff(disch_input)<= 0)
错误('参考角度必须单调上升0到360');
结尾
%%检查正确的传感器角度范围
如果(sensor_data <0)||任何(Sensor_data> 360)
错误('传感器角度必须在0到360'之间);
结尾
%%预处理
sensor_data_2 = sensor_data(:);
%检查是否连续上升/下降,最大一个溢出
If any(diff(sensor_data_2) == 0)
错误('传感器数据必须单调增加或减少')
ELESEIF SUM(差异(SENSOR_DATA_2)<0)<= 1
%上升角数据有零或一个溢出,溢出将被纠正
sensor_data_2 = sensor_data_2(:) + 360 * cumsum([false; diff(sensor_data_2(:))<0];
Elseif sum(diff(sensor_data_2) > 0) <= 1
将校正零或一个溢出的%下降角度数据,溢出将被纠正
sensor_data_2 = sensor_data_2(:) - 360 * cumsum([false; diff(sensor_data_2(:))> 0]);
其他的
错误('允许只有一个数据溢出')
结尾
如果需要,%反转角度方向
如果所有(差异(Sensor_Data_2)<0)
DISP('反相角度方向...')
sensor_data_2 = -sensor_data_2;
raw_direction = -1;
否则所有(差异(sensor_data_2)> 0)
RAW_Direction = +1;
其他的
错误(检测到的非单调角度变化')
结尾
%正确缠绕传感器数据
rollovercorrection = round((平均值(sensor_data_2) - 180)/ 360)* 360;
sensor_data_2 = sensor_data_2 - 翻转粗描;
%延长传感器数据
sensor_data_ext = [sensor_data_2 (:);sensor_data_2 (:) + 360;......
sensor_data_2(:) + 720];
%延长输入数据
discle_input_ext = [Anight_Input(:);Angle_Input(:) + 360;......
Angle_Input(:) + 720];
%磁测图经过预处理后完成
人物,情节([angle_input (:)), [sensor_data_2(:)),“啊——”);
Xlabel('编码器角度°');
ylabel('输出角度[deg]');
网格;
xlim (360 [0]);
If (raw_direction == +1) / /输出
title('编码器方向上的输出字段方向');
其他的
title('方向反转后的编码器方向上的输出字段方向');
结尾
%%使用样条曲线从有序的输入网格移动数据
%到有序输出网格上:
Ordered_output_grid = 0:(360/4096):( 360-360 / 4096);
intermediateGrid = Ordered_output_grid + 360;
投影=样条曲序(Sensor_data_ext,Antle_Input_ext,...
中间奖金);
%计算数据所需的校正:
校正_curve =投影 - 介入;
校正_curve = correnction_curve(:);
校正曲线的%%分段线性近似
lin_sup_nodes = 32;
%重复校正表三次以避免
修正计算的%角效果。
triple_correction_curve = repmat(校正_curve,3,1);
triple_correction_curve(end + 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);
%仅使用中心点来计算校正:
y_lin = y_lin_triple (lin_sup_nodes+1: 2*lin_sup_nodes+1);
xi_lin = linspace(0,360,lin_sup_nodes + 1);
%%计算AAS330x1参数
% "zal":零后线性化始终为零
disp(['*** AAS330x1 "zal"参数在EEPROM中应设置为1']);
%“Eli”:启用线性化始终是一个
DISP(['*** AAS330x1“EEEPROM中的”ELI“参数应设置为1']);
如果传感器角度的方向降低,则应使能为%“RO”:芯片旋转。
if(raw_direction == -1)
sensor_eeprom_val_ro = 1;
其他的
sensor_eeprom_val_ro = 0;
结尾
DISP(['*** AAS330x1“RO”参数在EEPROM中应设置为“NUM2STR(SENSOR_EEPROM_VAL_RO)”);
%“zero_offset”:偏移应设置为min和max偏移的平均值。
%这将充分利用线性化参数具有的+/- 45度的范围。
zerou_offset =均值([min(yi_lin)max(yi_lin)]);
从角度数据中减去%传感器偏移。如果传感器方向反转,则在角度反转之前发生这种情况,
%使传感器偏移标志必须在这种情况下反转
sensor_EEPROM_val_zero_offset = uint16 (mod(圆(-zero_offset / 360 * 4096), 4096));
DISP(['*** AAS330x1“ZERO_OFFSET”参数在EEPROM中应设置为“NUM2STR(SENSOR_EEPROM_VAL_ZERO_OFFSET)”);
%“ls”:必须根据最大参数值设置线性化刻度。
线性化_range_small = 22.5 * (2047/2048);
linearization_range_large = 45.0 *(2047/2048);
如果圆(max(abs(yi_lin - zero_offset)))sensor_eeprom_val_ls = uint16(0);
elseif round(max(abs(YI_lin - zero_offset))) < linearization_range_large
sensor_eeprom_val_ls = uint16(1);
其他的
错误('在+/- 45°之外的线性化参数范围内;线性化不可能')
结尾
DISP(['*** AAS330x1“LS”参数在EEPROM中应设置为“NUM2STR(SENSOR_EEPROM_VAL_LS)”);
%“lin _ ##”参数
if(sensor_eeprom_val_ls == 0)%小范围+/- 22.5°
sensor_eeprom_val_lin = int16(rower(reloxoffset-yi_lin(1:lin_sup_nodes))/ 22.5 * 2048));
else%更大的+/- 45.0°
sensor_EEPROM_val_LIN = int16(圆(zero_offset-YI_lin (1: lin_sup_nodes)) / 45.0 * 2048));
结尾
disp(['*** AAS330x1 "LIN_##"参数在EEPROM中应设置为以下值:']);
disp (num2str (sensor_EEPROM_val_LIN));
%%编写Allegro AAS330x1样本程序员的CSV表
eptable =细胞(38,2);
效果(1,1:2)= {'EEPROM',''};
效果(2,1:2)= {'zal',1};
EEPtable(1:2) ={“艾利”,1};
效果(4,1:2)= {'ro',sensor_eeprom_val_ro};
效果(5,1:2)= {'zero_offset',sensor_eeprom_val_zero_offset};
效果(6,1:2)= {'ls',sensor_eeprom_val_ls};
对于i = 1:32
EEPtable{6+i,1} = num2str(['线性化错误段' num2str(i-1,'%02d')]);
【6 + i,2} = num2str(sensor_eeprom_val_lin(i));
结尾
Cell2CSV('EEP_TABLE.CSV',效果);
%%在matlab中执行线性化
Restored_linear_signal = mod(raw_direction*sensor_data(:) +…
interp1 (XI_lin YI_lin,国防部(raw_direction * sensor_data(:), 360),“线性”),360);
%%在MATLAB中绘制线性化后的剩余错误
图;
绘图(Aligh_Input(:),Mod(180 + Restored_Linear_Linear_SigneR_Linear_Signal(:) - Angle_Input(:),360)-180,'.-');
网格;图例('线性插值(32个段)');
xlim (360 [0]);ylim([-1 1]);xlabel('测量角度[deg]');
ylabel('线性化后的预期误差[deg]');

版权所有©2018,Allegro亚博棋牌游戏 Microsystems,LLC

本文档中包含的信息不构成关于本文件主题的Allegro向客户提供的任何代表性,保证,保证,担保或诱导。所提供的信息并不能保证基于此信息的过程是可靠的,或者Allegro探讨了所有可能的失败模式。客户有责任对最终产品进行充分的资格测试,以确保它是可靠的,满足所有设计要求。