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

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

下载PDF版本

作者:Dominik Geisler,
雷竞技竞猜下载Allegro微系统有限责任公司

介绍

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

雷竞技竞猜下载Allegro MicroSystems,LLC提供多种角度传感器IC.适用于不同的应用。这些传感器雷竞技最新网址IC可以测量在一个侧轴或轴端设置径向磁化编码器磁铁的角度,如图1所示。

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

测量误差

All Allegro angle sensor ICs are calibrated at final test in the factory using a homogenous magnetic field. This is done to minimize the native error of the sensor. However, especially in side-shaft applications, the magnetic field angle at the sensor transducer is not identical to the mechanical angle of the shaft that is to be measured. The main contributor to this difference is the shape of the magnetic field emitted from the encoder magnet.

机械和磁场角度不匹配的其他来源包括磁铁错位、磁铁缺陷、传感器剩余不准确和漂移以及铁磁性材料的存在。

可以得出结论,所有系统,尤其是侧轴系统,都存在编码器角度和测量角度不匹配的问题。侧轴应用的典型传递曲线如图2所示。

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

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

线性化

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

This application note will:

  • 解释线性化的基本原理
  • 解释AAS330x1线性化特性
  • 演示如何处理测量数据以计算校正数据
  • 解释如何计算传感器参数
  • 显示线性化后的精度

定义

编码器角度

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

传感器角度

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

角度误差

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

错误=(α\u传感器–α\u编码器)。

但是,如果传感器角度为359°,编码器角度为0°,则误差应为-1°,而不是+359°。若要环绕±180°以外的任何误差,可使用模运算符:

error = mod[(α_sensor – α_encoder) + 180,360] – 180.

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

Maximum Absolute Angle Error

最大绝对角度误差是磁铁实际位置和角度传感器IC在整个旋转过程中测量的磁铁位置之间的最大绝对差值。
在图3中,最大角度误差为21.46°,编码器角度为56°。

Figure 3: Angle error compared to sensor output plot
Figure 3: Angle error compared to sensor output plot


线性化目标

线性化的目标是确定、存储和应用一个函数,该函数使测量的传感器角度误差与编码器角度值相比最小化。这使得测量的传感器角度和实际编码器角度之间的差异最小化。

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

这种目标可以以不同的方式实现。在此应用中将详细介绍三种常见技术。雷竞技最新网址

所提供的技术取决于单个校准阶段(通常在客户的线端测试时执行),然后应用固定的校正功能。

Prerequisites to Linearization

Prerequisites to linearization using the techniques detailed here are the following:

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

线性化限制

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

  • 传感器噪声不会通过线性化进行校正。
  • 校准后传感器的任何漂移都不会被校正。
  • 校准后机械系统的变化不会通过线性化进行校正。一个常见的例子是由于振动和转矩引起的磁铁位置的动态变化。
  • 如果校准期间的输入位置未准确记录,则校正的精度将以相同的方式受到限制。

线性化Method

1.数据记录

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

The recording of values is shown in Figure 5.

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

2传感器角度的坐标变换

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

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

三。校正曲线计算

为了创建一个将传感器测得的角度转换为编码器角度的函数,需要计算校正值。这些校正值计算为[c0…c级]=[x'0…x']–[y'0…是的'].

Figure 7: Correction value calculation
Figure 7: Correction value calculation

最后,这些值描述了校正曲线c,它给出了作为传感器角度函数的校正值。图8显示了传感器角度曲线c的曲线图。

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

4数据校正曲线的应用

要对测量的传感器数据点进行校正,需要根据校正曲线C计算传感器数据点Y的校正值C。这在图9中以图形表示。

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

然后将正确的角度值x确定为x = y + c.这是图形的图10中表示的。
图10:使用校正曲线求值X=Y+C
图10:使用
the correction curve

校正曲线测定

The implementations in this document were implemented in MathWorks MATLAB™. As this is commercial software, licensing costs apply to using it, which may hinder use in production environments. A free software alternative to MATLAB is GNU Octave, which is available under the GNU GPLv3 license free of charge.

本文中使用的所有函数都受MATLAB和GNU-Octave的支持。

传感器输出捕获

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

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

To apply piecewise linear correction with n segments (e.g. 32), recording at least n points will make good use of the available correction points. Recording about 2 × n points results in a nearly ideal performance. A real-life example of recorded points is given in Table 1.

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

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

传感器输出溢出清除

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

%%预处理
%检查是否连续上升/下降,最多一次溢流
如果有(差异(传感器数据2)==0)
错误('传感器数据必须单调递增或递减')
ELESEIF SUM(差异(SENSOR_DATA_2)<0)<= 1
%上升角数据有零或一个溢出,溢出将被纠正
sensor_data_2=sensor_data_2(:)+360*总和([假;差(sensor_data_2(:))
< 0 ]);
elseif sum(差异(传感器数据2)>0)<=1
将校正零或一个溢出的%下降角度数据,溢出将被纠正
sensor_data_2=sensor_data_2(:)-360*cumsum([假;差(sensor_data_2(:))
> 0 ]);
其他的
错误('只允许一个数据溢出')
结束
输入数据的方向可能需要反转。这由以下行检测和执行:
%invert angle direction, if needed
如果所有(差异(Sensor_Data_2)<0)
disp('反转角度方向…')
sensor_data_2 = -sensor_data_2;
raw_direction = -1;
其他所有(差异(传感器数据2)>0)
原始方向=+1;
其他的
错误('检测到非单调角度变化')
结束
数据的平均值应在±180°范围内,以避免后期处理中出现其他问题。这是通过以下几行实现的:
%正确环绕传感器数据
rollovercorrection = round((mean(sensor_data_2) - 180)/360) * 360;
sensor_data_2 = sensor_data_2 - rollovercorrection;
The resulting values are shown in Table 2.

Table 2: Encoder and output angles after removing overflow

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

数据复制

最终,需要基于传感器角度从0°到360°的校正数据。为了避免任何边缘效应,传感器数据将被复制三次。这避免了所有情况下的边缘效应,因为它提供了始终安全地从传感器角度360°到720°提取值的可能性。
%extend sensor data

传感器数据扩展=[传感器数据2(:);传感器数据2(:)+360。。。
sensor_data_2(:) + 720];
%扩展输入数据
discle_input_ext = [Anight_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;
投影=样条曲线(传感器\数据\外部,角度\输入\外部。。。
intermediategrid);
This step is graphically illustrated in Figure 13.

图13:将编码器角度(“投影”)作为固定网格传感器角度(“中间网格”)的投影
图13:查找编码器角度(“投影”)为
固定网格传感器角度的投影(“中间网格”)
角度编码器值和传感器输出之间的差值是校正曲线,可以通过从计算的匹配编码器角度减去固定栅格传感器角度来计算。
%计算所需的数据修正:
校正曲线=投影-中间整体;
校正曲线=校正曲线(:);
校正曲线如下图14所示。
Figure 14: Correction curve for our example
Figure 14: Correction curve for our example

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

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

线性插值

概念

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

在图8中,这些对是[(y'0,c级0,)…(y',c级)].

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

在角度传感器线性化应用中,使用等距传感器角度网格非常有用。这雷竞技最新网址样,不需要存储传感器角度值y'0…y'n,并且线性校正的实现变得更容易。例如,可以存储32个校正值,然后将其应用于0°、11.25°、22.50°等传感器角度。

The points to be stored can be determined by different criteria. The simplest way to determine them is by choosing points on the correction curve at said sensor angles, which will be referred to as “on-curve” linear interpolation. However, the points can also be optimized for a least-squares error of the stored correction curve. This will be referred to as “least-squares” linear interpolation.

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

图15显示了本例曲线的曲线上和最小二乘校正参数之间的差异。

图15:通过曲线和最小二乘法确定参数的理想校正曲线与线性插值的比较
图15:理想校正曲线与线性插值的比较,参数由
曲线最小二乘法

The least-squares method reduces the amount of storage parameters needed by about 50% for the same maximum error and is less sensitive to single measurement outliers. Therefore, the leastsquares method will be used here to determine the linear interpolation support points.

Implementation

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

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

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

Fit Calculation

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

%%校正曲线的分段线性逼近
lin\U sup\U节点=32;
%重复校正表三次以避免
%角点对校正计算的影响。
triple_correction_curve = repmat(correction_curve,3,1);
三重校正曲线(end+1)=三重校正曲线(1);
%对角度输入执行相同的操作
三重输出网格=0:(360/4096):(3*360);
%计算支撑点
XI\u lin\u triple=linspace(0,3*360,lin\u sup\u nodes*3+1);
YI\u lin\u triple=lsq\u lut\u分段(三重输出网格(:)。。。
三重校正曲线,西林三重曲线);
%仅使用中心点来计算校正:
YIïlin=YIïlinïtriple(linïsupïnodes+1:2*linïsupïnodes+1);
XI_lin = linspace(0,360,lin_sup_nodes+1);

lsq\u lut\u分段函数在附录A中重新打印。

32点线性插值的校正参数列表如下:

表3:线性插值参数

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

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

图17:线性化后的剩余角度误差,以本文中的示例为例,线性支持节点数量增加
图17:线性化后的剩余角度误差
随着线性支撑节点数量的增加
the example in this document

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

AAS330x1线性化特性

使用32位AAS330x1存储修正曲线segment piecewise linear approximation. The correction values are applied at equidistant sensor angles of 0°, 11.25°, 22.50°, …, 348.75°. Between these points, linear interpolation between the two adjacent supporting points is applied. The sensor performs the linearization in 188 ns, which is much faster than most microcontroller
实施。

硬件特性

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

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

旋转方向

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

分段线性化

分段线性化通过将“eli”设置为“1”来启用。如果启用,则以(##/32)×360°的角度从传感器输出中减去值“LIN##”。例如,“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:传感器数据的记录编码器和输出角度

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

抵销调整

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



180°旋转

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

此功能可由偏置台同样良好地执行,因此不使用本文档中的模具旋转功能。

参数计算

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

%%计算AAS330x1参数
%“zal”:线性化后的零总是零
disp(EEPROM中的['***AAS330x1“zal”参数应设置为1']);
%“eli”:使能线性化总是一个
disp(EEPROM中的['***AAS330x1“eli”参数应设置为1']);
%"ro": Die rotation should be enabled if direction of sensor angles was
减少。
if(raw_direction == -1)
传感器\u EEPROM \u val \u ro=1;
其他的
传感器\u EEPROM \u val \u ro=0;
结束
disp(['***AAS330x1“ro”EEPROM中的参数应设置为'
num2str(传感器\ EEPROM \值\ ro)];
%“零偏移”:偏移应设置为最小和最大偏移的平均值。
%这将充分利用
线性化参数已经确定。
零点偏移=平均值([最小值(YIïlin)最大值(YIïlin)]);
从角度数据中减去%传感器偏移。如果传感器方向是
倒转,这发生在角度倒转之前,
%使传感器偏移标志必须在这种情况下反转
传感器\u EEPROM \u val \u zero \u offset=uint16(mod(圆形)(-zero_
偏移/360*4096),4096);
应将EEPROM中的disp(['***AAS330x1“zero\u offset”参数设置为'
num2str(传感器\ EEPROM \值\零点\偏移量)];
%“ls”:必须根据最大参数设置线性化比例
价值观。
线性化范围=22.5*(2047/2048);
linearization_range_large = 45.0 *(2047/2048);
如果是圆形(最大值(abs(YI\u lin-zero\u offset))<线性化\u范围\u小
传感器\u EEPROM \u val \u ls=uint16(0);
elseif round(最大值(abs(YI\u lin-零偏移))<线性化\u范围\u大
传感器\u EEPROM \u val \u ls=uint16(1);
其他的
误差('线性化参数超出+/-45°范围;
线性化不可能')
结束
disp(['***AAS330x1“ls”EEPROM中的参数应设置为'
num2str(传感器\ EEPROM \值\ ls));
%“LIN###”参数
if (sensor_EEPROM_val_ls == 0) % small range of +/- 22.5°
sensor_EEPROM_val_LIN = int16(round((zero_offset-YI_lin(1:lin_sup_
节点)))/ 22.5 * 2048));
其他的%larger range of +/- 45.0°
sensor_EEPROM_val_LIN = int16(round((zero_offset-YI_lin(1:lin_sup_
节点))/45.0*2048);
结束
应将EEPROM中的disp(['***AAS330x1“LIN###”参数设置为
下列值:']);
显示(num2str(传感器\ EEPROM\ val\ LIN));
%%为Allegro AAS330x1示例程序员编写csv表
EEPtable=单元格(38,2);
EEPtable(1,1:2)={EEPROM',''};
EEPtable(2,1:2)={'zal',1};
EEPtable(3,1:2)={eli',1};
效果(4,1:2)= {'ro',sensor_eeprom_val_ro};
EEPtable(5,1:2)={zero\u offset',sensor\u EEPROM\u val\u zero\u offset};
效果(6,1:2)= {'ls',sensor_eeprom_val_ls};
对于i=1:32
EEPtable{6+i,1}=num2str(['线性化错误段'num2str(i-
1,'%02d')];
EEPtable{6+i,2}=num2str(传感器\ EEPROM \值\ LIN(i));
结束
单元格2CSV('EEP_表格.csv',表);
在这段代码的末尾,函数cell2csv用于编写一个CSV表,该表可以由Allegro AAS33001/AAS33051 Samples程序员导入。cell2csv函数在附录B中再版。许多类似的函数正在流通,但提供的函数应该足够了。我们示例的结果表如下所示:
电可擦可编程只读存储器,
扎尔,1
伊莱,1
ro,0
零点偏移,3103
负载感应,0
线性化误差段00,-973
线性化误差段01,-1009
线性化误差段02,-981
线性化误差段03,-881
线性化误差段04,-701
线性化误差段05,-492
线性化误差段06,-278
线性化误差段07,-18
线性化误差段08245
线性化误差段09487
线性化误差段10701
线性化误差段11875
线性化Error Segment 12,994
线性化Error Segment 13,1009
线性化误差段14924
线性化Error Segment 15,699
线性化误差段16323
线性化Error Segment 17,-54
线性化误差段18,-402
线性化误差段19,-600
线性化误差段20,-707
线性化Error Segment 21,-744
线性化误差段22,-694
线性化误差段23,-627
线性化误差段24,-558
线性化误差段25,-474
线性化误差段26,-428
线性化误差段27,-411
线性化误差段28,-494
线性化误差段29,-578
线性化误差段30,-748
线性化误差段31,-865

性能评估

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

%%在MATLAB中进行线性化
恢复的\线性\信号=mod(原始\方向*传感器\数据(:)+。。。
interp1(XI_lin,YI_lin,mod(原始方向*传感器数据(:),360),‘线性’),360);
%%在MATLAB中绘制线性化后的剩余错误
数字;
绘图(Aligh_Input(:),Mod(180 + Restored_Linear_Linear_SigneR_Linear_Signal(:) - Angle_Input(:),360) -
180,'.-');
网格;legend('Linear interpolation (32 segments)');
XLIM([0 360]);ylim([ - 1 1]);
Xlabel('测量角度°');
ylabel('线性化后的预期误差[deg]');
Figure 19 shows the expected angle error after linearization in the AAS330x1:
图19:使用本文档中描述的AAS330x1线性化后的剩余角度误差,例如来自本文档的示例
图19:线性化后的剩余角度误差
with AAS330x1 as described in this document,
例如本文档中的示例

结论

本文解释了一般线性化背后的理论,并描述了如何进行线性近似校正。

AAS33001和AAS33051允许分段线性化。这种线性化方法由传感器在0.2μs的时间内完成,32段精度很高。

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

Contact an Allegro representative for any remaining questions or support.

附录A:函数LSQ\u LUT\u分段

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\u lut\u分段(x,y,XI)获得最优(最小二乘法)
%与线性插值程序一起使用的向量。
%目标是求Y,给定X函数的极小值
%f=| y-interp1(XI,YI,x)|^2
%
%输入
%x测量数据矢量
%y测量数据矢量
%XI一维表的断点
%
%输出
%一维表的YI插值点
%y=interp1(XI,YI,x)
%
如果尺寸(x,2)~=1
错误('向量x必须具有维度n x 1.');
其他的if size(y,2) ~= 1
error('Vector y must have dimension n x 1.');
elseif size(x,1)~=大小(x,1)
误差('向量x和y必须有维数nx1');
结束
%由x个测量值定义的矩阵
A=稀疏([]);
%vector for y measurements
Y=[];
对于j=2:长度(XI)
%获取bin中点的索引[XI(j-1)XI(j)]
ix = x> = xi(j-1)&x %检查箱子里是否有数据点
如有(九)
警告(sprintf('Bin[%f%f]没有数据点,请检查估计。
请相应地重新定义X向量',XI(j-1),XI(j));
结束
%get x and y data subset
x_ux=x(ix);
y=y(ix);
%创建要添加到
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=[[A零(m1,n2-1)];[零(m2,n1-1)tmp]];
%连接bin的y测量值
Y=[Y;Y琰];
结束
%获得最少的平方Y估计
YI=A\Y;

附录B:功能单元2CSV

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

函数cell2csv(文件名、数组、分隔符)
%将单元格数组内容写入*.csv文件。
%
%CELL2CSV(filename,cellArray,delimiter)
%
%filename =要保存的文件的名称。[即'text.csv']
%Cellarray =数据中的小区数组的名称
%delimiter = Seperating sign, normally:',' (it's default)
%
%作者:西尔万·菲德勒,卡州,2004年
%由Rob Kohr,Rutgers,2005修改-改为英语并固定分隔符
%由Dominik Geisler修改,Allegro Mic雷竞技竞猜下载roSystems,2018-删除“eval”函数
如果纳金<3
分隔符=',';
结束
file=fopen(文件名,'w');
for z=1:size(cellArray,1)
对于S = 1:尺寸(Cellarray,2)
var=射线{z,s};
如果大小(var,1)==0
var=“”;
结束
如果isnumeric(var)==1
var=num2str(var);
结束
fprintf(file,var);
如果s~=大小(2)
fprintf(文件,[分隔符]);
结束
结束
fprintf(文件,“\n”);
结束
fclose(文件);

附录C:本应用程序中使用的函数完整脚本说明

版权所有(c)2018,Dominik Geisler,Allegro M雷竞技竞猜下载icroSystems Germany GmbH

版权所有。

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

*重新分发源代码必须保留上述版权声明、此条件列表和以下免责声明。

*以二进制形式进行的再分配必须复制上述版权声明、本条件列表以及随分配提供的文档和/或其他材料中的以下免责声明

本软件由版权所有人和贡献者“按原样”提供,不接受任何明示或暗示的保证,包括但不限于对适销性和特定用途适用性的暗示保证。在任何情况下,版权所有人或贡献者均不对任何直接、间接、偶然、特殊、惩戒性或后果性损害(包括但不限于购买替代货物或服务;使用、数据或利润损失;或业务中断)承担责任,无论是因何种原因或基于任何责任理论,无论是在合同中,严格的责任,或侵权行为(包括疏忽或其他)所产生的任何方式使用本软件,即使通知的可能性,这种损害。

%%传感器数据定义
角度输入=[0:11.25:348.75];
传感器数据=[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];
%%检查上升参考角
如果有(角度输入<0)| |任何(角度输入>360)| |任何(差异(角度输入)<=0)
误差('参考角必须在0和360之间单调上升');
结束
%%检查传感器角度范围是否正确
如果有(传感器数据<0)| |任何(传感器数据>360)
错误('传感器角度必须介于0和360'之间');
结束
%%预处理
sensor_data_2=传感器_数据(:);
%检查是否连续上升/下降,最多一次溢流
如果有(差异(传感器数据2)==0)
错误('传感器数据必须单调递增或递减')
ELESEIF SUM(差异(SENSOR_DATA_2)<0)<= 1
%上升角数据有零或一个溢出,溢出将被纠正
sensor_data_2=sensor_data_2(:)+360*总和([假;差(sensor_data_2(:))< 0 ]);
elseif sum(差异(传感器数据2)>0)<=1
将校正零或一个溢出的%下降角度数据,溢出将被纠正
sensor_data_2 = sensor_data_2(:) - 360 * cumsum([false; diff(sensor_data_2(:))> 0]);
其他的
错误('只允许一个数据溢出')
结束
%invert angle direction, if needed
如果所有(差异(Sensor_Data_2)<0)
disp('反转角度方向…')
sensor_data_2 = -sensor_data_2;
raw_direction = -1;
其他所有(差异(传感器数据2)>0)
原始方向=+1;
其他的
错误('检测到非单调角度变化')
结束
%正确环绕传感器数据
rollovercorrection = round((mean(sensor_data_2) - 180)/360) * 360;
sensor_data_2 = sensor_data_2 - rollovercorrection;
%extend sensor data
传感器数据扩展=[传感器数据2(:);传感器数据2(:)+360。。。
sensor_data_2(:) + 720];
%扩展输入数据
discle_input_ext = [Anight_Input(:);Angle_Input(:) + 360;......
angle_input(:)+720];
%%预处理完成后绘制磁铁测量值
图;绘图([角度输入(:)],[传感器数据2(:)],'o-');
Xlabel('编码器角度°');
ylabel('输出角度[deg]');
网格;
XLIM([0 360]);
if(原始方向==+1)
title('输出字段方向超过编码器方向');
其他的
title('方向反转后编码器方向上的输出字段方向');
结束
%%使用样条线从有序输入网格中移动数据
%在有序输出网格上:
ordered_output_grid = 0:(360/4096):(360-360/4096);
intermediateGrid = Ordered_output_grid + 360;
投影=样条曲线(传感器\数据\外部,角度\输入\外部。。。
intermediategrid);
%计算所需的数据修正:
校正曲线=投影-中间整体;
校正曲线=校正曲线(:);
%%校正曲线的分段线性逼近
lin\U sup\U节点=32;
%重复校正表三次以避免
%角点对校正计算的影响。
triple_correction_curve = repmat(correction_curve,3,1);
三重校正曲线(end+1)=三重校正曲线(1);
%对角度输入执行相同的操作
三重输出网格=0:(360/4096):(3*360);
%计算支撑点
XI\u lin\u triple=linspace(0,3*360,lin\u sup\u nodes*3+1);
YI\u lin\u triple=lsq\u lut\u分段(三重输出网格(:)。。。
三重校正曲线,西林三重曲线);
%仅使用中心点来计算校正:
YIïlin=YIïlinïtriple(linïsupïnodes+1:2*linïsupïnodes+1);
XI_lin = linspace(0,360,lin_sup_nodes+1);
%%计算AAS330x1参数
%“zal”:线性化后的零总是零
disp(EEPROM中的['***AAS330x1“zal”参数应设置为1']);
%“eli”:使能线性化总是一个
disp(EEPROM中的['***AAS330x1“eli”参数应设置为1']);
%"ro": Die rotation should be enabled if direction of sensor angles was decreasing.
if(raw_direction == -1)
传感器\u EEPROM \u val \u ro=1;
其他的
传感器\u EEPROM \u val \u ro=0;
结束
disp(['***AAS330x1“ro”EEPROM中的参数应设置为'num2str(传感器\ EEPROM \值\ ro)];
%“零偏移”:偏移应设置为最小和最大偏移的平均值。
%这将充分利用线性化参数的+/-45度范围。
零点偏移=平均值([最小值(YIïlin)最大值(YIïlin)]);
%从角度数据中减去传感器偏移。如果传感器方向反转,则在角度反转之前发生,
%使传感器偏移标志必须在这种情况下反转
sensor_eeprom_val_zero_offset = uint16(mod(round(-zero_offset / 360 * 4096),4096));
disp(['***AAS330x1“zero\u offset”参数在EEPROM中应设置为'num2str(sensor\u EEPROM\u val\u zero\u offset)]);
%“ls”:必须根据最大参数值设置线性化比例。
线性化范围=22.5*(2047/2048);
linearization_range_large = 45.0 *(2047/2048);
如果是圆形(最大值(abs(YI\u lin-zero\u offset))<线性化\u范围\u小
传感器\u EEPROM \u val \u ls=uint16(0);
elseif round(最大值(abs(YI\u lin-零偏移))<线性化\u范围\u大
传感器\u EEPROM \u val \u ls=uint16(1);
其他的
误差('线性化参数超出+/-45°范围;线性化不可能')
结束
disp(EEPROM中的['***AAS330x1“ls”参数应设置为'num2str(传感器\ EEPROM \值\ ls)]);
%“LIN###”参数
if (sensor_EEPROM_val_ls == 0) % small range of +/- 22.5°
sensor_EEPROM_val_LIN=int16(圆形((零偏移量-一个LIN(1:LIN_sup_节点))/22.5*2048));
其他的%larger range of +/- 45.0°
sensor_EEPROM_val_LIN=int16(圆形((零偏移量-YI_LIN(1:LIN_sup_节点))/45.0*2048));
结束
disp(['***AAS330x1“LIN###”EEPROM中的参数应设置为以下值:']);
显示(num2str(传感器\ EEPROM\ val\ LIN));
%%为Allegro AAS330x1示例程序员编写csv表
EEPtable=单元格(38,2);
EEPtable(1,1:2)={EEPROM',''};
EEPtable(2,1:2)={'zal',1};
EEPtable(3,1:2)={eli',1};
效果(4,1:2)= {'ro',sensor_eeprom_val_ro};
EEPtable(5,1:2)={zero\u offset',sensor\u EEPROM\u val\u zero\u offset};
效果(6,1:2)= {'ls',sensor_eeprom_val_ls};
对于i=1:32
EEPtable{6+i,1}=num2str(['线性化错误段'num2str(i-1,'%02d')]);
EEPtable{6+i,2}=num2str(传感器\ EEPROM \值\ LIN(i));
结束
单元格2CSV('EEP_表格.csv',表);
%%在Matlab中进行线性化
恢复的\线性\信号=mod(原始\方向*传感器\数据(:)+。。。
interp1(XI_lin,YI_lin,mod(原始方向*传感器数据(:),360),‘线性’),360);
%%在Matlab中绘制线性化后的剩余误差
数字;
绘图(角度输入(:),mod(180+恢复的线性信号(:)-角度输入(:),360)-180,'.-');
网格;legend('Linear interpolation (32 segments)');
xlim([0 360]);ylim([-1 1]);xlabel('Measured angle[deg]');
ylabel('线性化后的预期误差[deg]');

版权所有©2018,Allegro雷竞技竞猜下载 MicroSystems,LLC

本文件中包含的信息不构成Allegro就本文件主题向客户作出的任何陈述、保证、保证、担保或诱因。所提供的信息不能保证基于此信息的过程是可靠的,或者Allegro已经探索了所有可能的故障模式。客户有责任对最终产品进行充分的鉴定测试,以确保其可靠并满足所有设计要求。