Allegro AAS33001和AAS33051角度传感器集成电路的线性化参数计算
Allegro AAS33001和AAS33051角度传感器集成电路的线性化参数计算
由Dominik Geisler,
雷竞技竞猜下载Allegro Microsystems,LLC
介绍
磁角传感器通常是快速、可靠、非接触测量系统角位置的好选择,特别是在光学编码器可能不适合的肮脏环境中。
雷竞技竞猜下载Allegro MicroSystems, LLC提供广泛的角度传感器集成电路为不同的应用程序。雷竞技最新网址如图1所示,这些传感器集成电路可以测量在侧轴或轴端安装的直径磁化编码器磁体的角度。
轴端角度测量(右)
测量误差
所有的Allegro角度传感器ic在工厂的最终测试中使用均匀磁场进行校准。这样做是为了尽量减少传感器的固有误差。然而,特别是在侧轴应用中,传感器传感器处的磁场角度与要测量的轴的机械雷竞技最新网址角度不相同。造成这种差异的主要原因是编码器磁铁发出的磁场的形状。
机械和磁场角度不匹配的其他来源是磁体不对中、磁体缺陷、剩余传感器不准确和漂移,以及铁磁材料的存在。
由此可以得出结论,所有系统,尤其是侧轴系统,都存在编码器角与测量角不匹配的问题。在图2中可以看到一个典型的侧轴应用的传递曲线。
在侧轴设置的角度
这些测量误差称为非线性,可以通过线性化过程进行补偿。
线性化
一些allegro传感器IC,如A1335,AAS33001,而且AAS33051.具有允许输入数据线性化的嵌入式逻辑。本应用说明将解释如何使用AAS33001和AAS33051的线性化特性。为了简化对这些部分的引用,今后两者都将称为AAS330x1。
此应用程序注意将:
- 解释线性化的基础
- 解释AAS330x1的线性化特性
- 演示如何处理测量数据以计算修正数据
- 解释如何计算传感器参数
- 线性化后的准确性
定义
编码器角度
一个精确的,高分辨率的外部编码器报告的角度。
传感器角度
角度传感器IC所报告的角度。
角误差
角度误差是磁体的实际位置与角度传感器IC测量到的磁体位置之间的差值,计算方法是用传感器角度减去编码器角度:
误差= (α_sensor - α _编码器)。
但是,如果传感器角度为359°,编码器角度为0°,则误差应为-1°,而不是+359°。为了将误差包绕在±180°之外,可以使用模算子:
误差= mod[(α_sensor - α_encoder) + 180,360] - 180。
图3给出了侧轴应用中角度误差的样图。
最大绝对角度误差
最大绝对角度误差是在整个旋转过程中,角度传感器IC测量到的磁体实际位置与磁体位置之间的最大绝对差。
在图3中,编码器角度为56°时,最大角度误差为21.46°。
线性化的目标
线性化的目标是确定、存储和应用一个函数,使测量的传感器角度误差相对于编码器角度值最小。这将使测量的传感器角度和实际编码器角度之间的差异最小化。
角度角度的角度
这个目标可以通过不同的方式实现。本文将详细介绍三种常见的技术。雷竞技最新网址
所提供的技术依赖于单个校准阶段(通常在客户的行尾测试中执行),在此之后应用固定的校正功能。
线性化的先决条件
使用这里详细介绍的技术进行线性化的先决条件如下:
- 在生产过程中,需要将已知的角度应用于传感器系统。
- 在生产过程中,需要读出传感器角度。
- 要线性化的系统需要一个微控制器,在生产过程中写入线性化信息,并且在应用程序中执行线性化。
线性化的极限
使用这里描述的方法进行线性化有一些限制:
- 传感器噪声不会被线性化校正。
- 校准后传感器的任何漂移将不予校正。
- 校准后机械系统的变化不会通过线性化校正。由于振动和扭矩,常用例是磁体位置的动态变化。
- 如果在校准期间的输入位置不准确地记录,则校正的准确性将以相同的方式受到限制。
线性化方法
1.数据记录
为了产生线性化所需的数据,测量传感器输出[y0......n在已知编码器角度[x0… Xn].这些编码器的角不需要等距,尽管通常使用等距角。
值的记录如图5所示。
2.坐标转换传感器角度
由于校正函数必须基于传感器数据工作,因此记录的数据点需要转换为传感器坐标系。这意味着不需要将传感器角度表示为实角度的函数,而需要将实角度表示为传感器角度的函数。因此,传感器角度[y'0y……”n,其中对应的编码器角[x'0… X'n]需要确定。为此,需要通过数据点应用拟合。这可以通过样条插值来完成,如图6所示。
3.修正曲线计算
为了创建一个将传感器测得的角度转换为编码器角度的函数,需要计算校正值。这些校正值计算为[c0… Cn] = [x '0… X'n] - [y'0y……”n].
最后,这些值描述了一条校正曲线c,该曲线给出了校正值与传感器角度的函数关系。图8显示了曲线c /传感器角度的曲线。
4.校正曲线应用于数据
为了将校正应用于测量的传感器数据点,需要基于校正曲线C计算传感器数据点Y的校正值C.这是图形方式表示的。
正确的角度值X被确定为X = Y + c,如图10所示。
校正曲线
校正曲线确定
本文档中的实现是在MathWorks MATLAB™中实现的。由于这是商业软件,使用它需要支付许可费用,这可能会妨碍在生产环境中使用。MATLAB的一个免费替代软件是GNU Octave,它可以在GNU GPLv3许可下免费获得。
本文档中使用的所有函数均由MATLAB和GNU Octave支持。
传感器输出捕获
用户必须捕获传感器角度输出的初始数据。这是通过设置某些已知的角度来实现的,在本文档中称为编码器角度。然后记录传感器角度。传感器角度是由传感器测量的角度。记录的点数可以比线性修正点数多或少。如果可能的话,记录更多的分数总是更好的。
通常,记录至少16个数据点就足以在轴上的情况下获得良好的校正性能。在离轴情况下,建议至少32点。
要对n段(例如32)进行分段线性校正,记录至少n个点将充分利用可用的校正点。记录大约2 × n个点的结果是近乎理想的性能。表1给出了一个真实的记录点示例。
表1:录制的编码器和输出角度
传感器输出溢出溢出
传感器数据在100°输入角左右的跳跃将给下一步的处理步骤带来困难。它被移除通过添加360°的所有值后,跳转到负方向。同时,数据的均值应在±180°以内,以避免后期处理中出现其他问题。这可以通过以下几行来实现:
输入数据的方向可能需要反转。这是由以下行检测和执行的:% %预处理
%检查是否连续上升/下降,最大有一个溢流
If any(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]);
Elseif sum(diff(sensor_data_2) > 0) <= 1
%下降角数据有零或一个溢出,溢出将被纠正
sensor_data_2 = sensor_data_2(:) - 360 * cumsum([false; diff(sensor_data_2(:))
> 0]);
其他的
错误('只允许一个数据溢出')
结束
数据的均值应在±180°以内,以避免后期处理时出现其他问题。这可以通过以下几行来实现:如果需要,倒转角度方向
If all(diff(sensor_data_2) < 0)
DISP('反相角度方向...')
sensor_data_2 = -sensor_data_2;
raw_direction = 1;
case " mapname ": mapname = " mapname "; mapname = " mapname ";
raw_direction = + 1;
其他的
误差(“检测到非单调的角度变化”)
结束
结果值如表2所示。%正确缠绕传感器数据
Rollovercorrection = round((mean(sensor_data_2) - 180)/360) * 360;
Sensor_data_2 = Sensor_data_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°之间的传感器输出相对应的编码器角输入(称为“中间化”)。这是通过4096步进行的,作为这种中间步骤的高分辨率,有利于最终输出质量。
该步骤在图13中以图形方式示出。%%使用样条曲线从有序的输入网格移动数据
%到有序输出网格上:
ordered_output_grid = 0 (360/4096): (360 - 360/4096);
Intermediategrid = ordered_output_grid + 360;
投影=样条(sensor_data_ext, angle_input_ext,…)
intermediategrid);
固定栅格传感器角度的投影(“中间栅格”)
校正曲线如图14所示。%计算数据所需的校正:
Correction_curve =投影- intermediategrid;
校正_curve = correnction_curve(:);
可以做一个简短的检查,看看这条曲线是否正确。由表1可知,当传感器角度为137.46°时,编码器角度为213.75°。由图14的校正曲线可知,在传感器角度为137.5°时,需要进行+76.29°的校正。137.46 + 76.26 = 213.72°≅213.75°,计算得到的修正曲线是适用的。
下一步,校正曲线需要存储在AAS330x1中。为了解释传感器如何应用校正,将首先解释分段线性校正的概念,然后解释AAS330x1的硬件能力,以确定实际的校正值。
线性插值
概念
校正曲线可以通过分段线性函数近似。对于此功能,需要将支持点存储为传感器坐标对和校正值。
在图8中,这些对将是[(y'0c0,)...(y'ncn)]。
在支撑点之间进行线性插值。
在角度传感器线性化应用中,使用等距传感器角度网格是有用的。雷竞技最新网址这样,传感器的角度值[y'0…y'n]就不需要存储,线性校正的实现也更容易。例如,可以存储32个校正值,然后应用于0°、11.25°、22.50°等传感器角度。
要存储的点可以通过不同的标准来确定。最简单的确定它们的方法是在修正曲线上选择点在传感器角度,这将被称为“曲线上”线性插值。然而,这些点也可以根据存储的校正曲线的最小二乘误差进行优化。这将被称为“最小二乘”线性插值。
其他优化策略也是可能的,但在本文中将不作描述。
本例中曲线的on-curve和最小二乘校正参数的差异如图15所示。
曲线上和最小二乘法
对于相同的最大误差,最小二乘方法可减少约50%的存储参数,且对单个测量异常值的灵敏度较低。因此,本文将采用最小二乘法来确定线性插值支撑点。
执行
修正曲线需要用分段线性函数来近似。由于支撑点的选择应采用最小二乘误差的方式,因此支撑点前后的数据也有助于确定支撑点的最终值。
这为第一个和最后一点创造了一个问题。在0°的第一个支撑点仅在右侧具有校正曲线,使得不考虑接近360°的数据。为了避免这个问题,校正曲线将重复三次,并且将计算该曲线的分段线性最小二乘近似。然后只使用中央部分来选择所使用的参数。这个概念如图16所示。
适合计算
复制修正曲线并计算拟合的代码如下:
%分段线性逼近修正曲线
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);
%只使用中心点来计算校正值:
y_lin = y_lin_triple (lin_sup_nodes+1: 2*lin_sup_nodes+1);
XI_lin = linspace(0360年,lin_sup_nodes + 1);
lsq_lut_piecewise函数在附录A中重新打印。
32点线性插值的校正参数列表如下:
表3:线性插值参数
注意,360°的校正参数也显示了,即使它与0°的校正参数相同。这是为了在MATLAB脚本中校正348.75°和360°之间的角度。然而,AAS330x1并不单独存储360°值,而是使用0°值。
图17显示了线性化后的输出误差是如何随着线性化点数量的增加而减小的。当使用32个线性化点时,角误差变得非常小,这表明在AAS330x1中实现的数量是足够的。
随着越来越多的线性支持节点
本文档中的示例
要了解如何确定AAS330x1编程参数,首先将首先讨论AAS330x1的硬件功能。
AAS330x1线性化功能
AAS330x1使用32段分段线性近似存储校正曲线。校正值在0°,11.25°,22.50°,...,348.75°的等距传感器角度施加。在这些点之间,应用两个相邻支撑点之间的线性插值。传感器在188 NS执行线性化,这比大多数微控制器快得多
实现。
硬件功能
AAS330x1包含一个偏置级、一个线性化级和一个旋转方向逆变器。如图18所示,可以在线性化之前或之后进行偏移调整。在本文档中,假设“zal”(线性化后的零)被设置为“1”,这意味着将在线性化后执行偏移调整。
旋转方向
传感器的旋转方向可以倒置。如果已启用,则角度值反转:
分段线性化
分段线性化是通过设置eli为1来启用的。如果启用,值“LIN##”将以(## / 32)× 360°的角度从传感器输出中减去。例如,“LIN10”的值应用于(10 / 32)× 360°= 112.5°。这些角之间的值是在相邻支撑点之间线性插值的。例如,115°的校正值将根据“LIN10”和“LIN11”的值来确定。
LIN字段是12位有符号值,以2的补码形式写入。分辨率取决于位“ls”,对于“ls”= ' 0 ',分辨率为22.5°/ 2048 LSB,对于“ls”= ' 1 ',分辨率为45°/ 2048 LSB。因为它们是从角度中减去的,LIN场中的负值会增加传感器的角度输出。具体如下表所示:
表4:录制的CONODER和SENSOR_DATA的输出角度
例如,如果将LIN00的值设置为0xD0F,则表示十进制值3343 - 212 = - 753。如果“ls”设置为“0”,这等于角度值22.5°/ 2048 LSB × (753 LSB) = -8.27°。这个值将从测量的角度中减去,因此对于0°的输入,线性化块将输出0°-(- 8.27°)= +8.27°。
抵消调整
传感器的偏移调整级将传感器的零值对准到外部编码器的零值。它由EEPROM字段“ZERO_OFFSET”控制,允许编写12位值。该无符号值表示0°和(4095/4096)×360°之间的角度,从原始角度值中减去。
180°旋转
在最后的处理步骤中,传感器输出可旋转180°:
该功能可以通过偏移级同样良好地执行,从而不会使用本文档中的芯片旋转功能。
参数计算
知道了传感器是如何工作的,表3中描述的校正曲线现在可以用传感器参数表示了。这是通过首先使用由数据确定的旋转方向和偏移量的信息来完成的。然后选择线性化参数尺度,确定完整的线性化值表。
在这段代码的末尾,cell2csv函数用于编写一个CSV表,可以由Allegro AAS33001 / AAS33051 Samples Programmer导入。函数cell2csv在附录b中有重印,许多类似的函数也在使用中,但提供的函数应该足够了。我们示例的结果表如下:%%计算AAS330x1参数
% "zal":零后线性化始终为零
disp(['*** AAS330x1 "zal"参数在EEPROM中应设置为1']);
%“Eli”:启用线性化始终是一个
disp(['*** AAS330x1 "eli"参数在EEPROM中应该设置为1']);
% "ro":当传感器角度方向为时,应使模具旋转
减少。
If (raw_direction == -1) / /输出
sensor_eeprom_val_ro = 1;
其他的
sensor_eeprom_val_ro = 0;
结束
['*** AAS330x1 "ro"参数在EEPROM中应该设置为'
num2str (sensor_EEPROM_val_ro)]);
% "zero_offset": Offset应该设置为最小偏移量和最大偏移量的平均值。
%这将充分利用+/-45度的范围
线性化参数。
zero_offset = mean([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);
线性化_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 (((zero_offset-YI_lin (1: lin_sup_
节点))/ 22.5 * 2048));
Else %更大范围+/- 45.0°
sensor_EEPROM_val_LIN = int16 (((zero_offset-YI_lin (1: lin_sup_
节点))/ 45.0 * 2048));
结束
EEPROM中的"LIN_##"参数应设置为
以下值:']);
disp (num2str (sensor_EEPROM_val_LIN));
%% write csv table for Allegro AAS330x1 Samples Programmer
eptable =细胞(38,2);
EEPtable (1:2) = {eepm, "};
EEPtable (1:2) = {zal, 1};
EEPtable(1:2) ={“艾利”,1};
EEPtable(1:2) ={‘罗’,sensor_EEPROM_val_ro};
EEPtable (1:2) = {zero_offset, sensor_EEPROM_val_zero_offset};
EEPtable(1:2) ={“ls”,sensor_EEPROM_val_ls};
因为I = 1:32
EEPtable{6+i,1} = num2str(['线性化错误段' num2str(i-
1, ' % 2 d '));
EEPtable{6 +我,2}= num2str (sensor_EEPROM_val_LIN(我));
结束
cell2csv (EEP_table.csv, EEPtable);
eepm,
zal 1
伊莱,1
罗依,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
线性化误差段16323
线性化误差段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
性能评估
用所使用的参数线性化后的精度可以在仿真中估计。为此,需要在模拟中应用已确定的线性化参数,并结合可选方向反演:
图19为AAS330x1线性化后的预期角度误差:%%在MATLAB中进行线性化
Restored_linear_signal = mod(raw_direction*sensor_data(:) +…
interp1 (XI_lin YI_lin,国防部(raw_direction * sensor_data(:), 360),“线性”),360);
%%在MATLAB中绘制线性化后的剩余误差
图;
情节(angle_input(:),国防部(180 + restored_linear_signal (:) -angle_input (:), 360)
180年,'。');
网格;图例('线性插值(32个段)');
xlim (360 [0]);ylim ([1]);
包含(“测量角(度)”);
ylabel('线性化后的预期误差[deg]');
使用本文档中所述的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。
保留所有权利。
在符合下列条件的情况下,可以源代码和二进制形式重新分发和使用,不论是否经过修改:
*源代码的重新分配必须保留上述版权声明,此条件清单和以下免责声明。
*以二进制形式重新发布必须在发布的文件和/或其他材料中复制上述版权声明、本条件列表和以下免责声明
该软件由版权所有者和贡献者提供“原样”,并提供任何明示或暗示的保证,包括但不限于默示的默示和特定目的的适应性的暗示保证。在任何情况下,版权所有者或贡献者都应对任何直接,间接,偶然,特殊,示范性或相应的损害负责(包括但不限于采购替代商品或服务;使用丧失,数据或利润;然而,或者业务中断)造成和任何责任理论,无论是在合同,严格的责任或侵权行为(包括疏忽或其他方式),也以任何方式出现在使用本软件的情况下,即使涉及此类损害的可能性也是如此。
function [YI] = lsq_lut_piecwise (x, y, XI)
1-D插值的分段线性插值(查表)
% 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)
%
If size(x,2) ~= 1
错误('Vector x must have dimension n x 1.');
mapname (y,2) = " mapname (y,2) "
错误('Vector y must have dimension n x 1.');
elsefif大小(x,1)〜=尺寸(x,1)
错误('向量x和y必须具有维度n x 1.');
结束
%矩阵由X测量定义
一个=稀疏([]);
向量y的值
Y = [];
j = 2:长度(XI)
%获得箱中的点索引[xi(j-1)xi(j)]
x = x>=XI(j-1) & x检查bin中是否有数据点
如果〜任何(ix)
'Bin [%f %f]没有数据点,检查估计。
',XI(j-1),XI(j)));
结束
%得到x和y数据子集
间= x (ix);
y_ = y (ix);
创建要添加到A的临时矩阵
tmp =(((间+ XI (j - 1)) / (XI (j)习近平(j - 1)) + 1) ((x_-XI (j - 1)) / (XI (j)习近平(j - 1))));
%建立带有约束条件的测量矩阵
(m1, n1) = (A)大小;
[M2,N2] =尺寸(TMP);
a = [[[零(m1,n2-1)]; [零(m2,n1-1)tmp];
连接料仓的尺寸
y = [y;Y_];
结束
%得到最小二乘Y估计
易= \ Y;
附录B:功能Cell2CSV
基于https://uk.mathworks.com/matlabcentral/fileexchange/7601-cell2csv.
函数cell2csv(文件名、cellArray分隔符)
%将单元格数组内容写入*.csv文件。
%
% CELL2CSV(文件名、cellArray分隔符)
%
% filename =要保存的文件名。(即。' text.csv ']
% cellarray =数据所在的单元格数组的名称
% delimiter =分隔符,通常为:','(默认)
%
Sylvain Fiedler, KA, 2004
由Rob Kohr,Rutgers,2005修改% - 改为英语和固定分隔符
%由Allegro MicroSystems公司Dominik雷竞技竞猜下载 Geisler修改,2018年-删除了“eval”功能
如果输入参数个数< 3
分隔符= " ";
结束
文件= fopen(文件名,' w ');
对z = 1:尺寸(cellArray, 1)
s = 1:尺寸(cellArray, 2)
var = cellArray {z s};
If size(var,1) == 0
var ='';
结束
If isnumeric(var) == 1
var = num2str(var);
结束
流(文件,var);
if s ~= size(cellArray,2)
流(文件,(分隔符));
结束
结束
流(文件,' \ n ');
结束
文件关闭(文件);
附录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)
误差('传感器数据必须单调增加或减少')
Elseif sum(diff(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]);
其他的
错误('只允许一个数据溢出')
结束
如果需要,倒转角度方向
If all(diff(sensor_data_2) < 0)
DISP('反相角度方向...')
sensor_data_2 = -sensor_data_2;
raw_direction = 1;
case " mapname ": mapname = " mapname "; mapname = " mapname ";
raw_direction = + 1;
其他的
误差(“检测到非单调的角度变化”)
结束
%正确缠绕传感器数据
Rollovercorrection = round((mean(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];
%扩展输入数据
angle_input_ext = [angle_input (:);angle_input (:) + 360;...
angle_input (:) + 720];
%磁测图经过预处理后完成
人物,情节([angle_input (:)), [sensor_data_2(:)),“啊——”);
包含(“编码器角度(度)”);
ylabel(“输出角(度)”);
网格;
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, angle_input_ext,…)
intermediategrid);
%计算数据所需的校正:
Correction_curve =投影- intermediategrid;
校正_curve = correnction_curve(:);
%分段线性逼近修正曲线
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);
%只使用中心点来计算校正值:
y_lin = y_lin_triple (lin_sup_nodes+1: 2*lin_sup_nodes+1);
XI_lin = linspace(0360年,lin_sup_nodes + 1);
%%计算AAS330x1参数
% "zal":零后线性化始终为零
disp(['*** AAS330x1 "zal"参数在EEPROM中应设置为1']);
%“Eli”:启用线性化始终是一个
disp(['*** AAS330x1 "eli"参数在EEPROM中应该设置为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": Offset应该设置为最小偏移量和最大偏移量的平均值。
%这将充分利用线性化参数具有的+/- 45度的范围。
zero_offset = mean([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);
线性化_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));
%% write csv table for Allegro AAS330x1 Samples Programmer
eptable =细胞(38,2);
EEPtable (1:2) = {eepm, "};
EEPtable (1:2) = {zal, 1};
EEPtable(1:2) ={“艾利”,1};
EEPtable(1:2) ={‘罗’,sensor_EEPROM_val_ro};
EEPtable (1:2) = {zero_offset, sensor_EEPROM_val_zero_offset};
EEPtable(1:2) ={“ls”,sensor_EEPROM_val_ls};
因为I = 1:32
EEPtable{6+i,1} = num2str(['线性化错误段' num2str(i-1,'%02d')]);
EEPtable{6 +我,2}= num2str (sensor_EEPROM_val_LIN(我));
结束
cell2csv (EEP_table.csv, EEPtable);
%%在Matlab中进行线性化
Restored_linear_signal = mod(raw_direction*sensor_data(:) +…
interp1 (XI_lin YI_lin,国防部(raw_direction * sensor_data(:), 360),“线性”),360);
%%在MATLAB中绘制线性化后的剩余错误
图;
情节(angle_input(:),国防部(180 + restored_linear_signal (:) -angle_input(:), 360) -180年,'。');
网格;图例('线性插值(32个段)');
xlim (360 [0]);ylim([-1 1]);xlabel('测量角度[deg]');
ylabel('线性化后的预期误差[deg]');
版权所有©2018,Allegro雷竞技竞猜下载 MicroSystems, LLC
本文档中包含的信息不构成关于本文件主题的Allegro向客户提供的任何代表性,保证,保证,担保或诱导。所提供的信息并不能保证基于此信息的过程是可靠的,或者Allegro探讨了所有可能的失败模式。客户有责任对最终产品进行充分的资格测试,以确保它是可靠的,满足所有设计要求。