基于单片机的角传感器ic线性化
基于单片机的角传感器ic线性化
多米尼克·盖斯勒,
亚博棋牌游戏Allegro MicroSystems, LLC
简介
磁性角度传感器通常是快速、可靠、非接触式测量系统角度位置的好选择,特别是在光学编码器可能不太适合的肮脏环境中。
亚博棋牌游戏Allegro MicroSystems, LLC为不同的应用提供广泛的角度传感器ic[1]。亚博尊贵会员这些传感器集成电路可以测量直径磁化编码器磁体的角度
在侧轴或轴端设置,如图1所示。
测量误差
所有Allegro角度传感器ic都在工厂使用均匀磁场进行最终测试时进行校准。这样做是为了尽量减少传感器的固有误差。然而,特别是在侧轴应用中,传感器换能器处的磁场角度与待测轴的机械角度亚博尊贵会员并不相同。造成这种差异的主要原因是编码器磁铁发出的磁场的形状。
机械和磁场角度不匹配的其他来源是磁体不对中,磁体缺陷,剩余传感器不准确和漂移,以及铁磁性材料的存在。
可以得出结论,所有系统,特别是侧轴系统,遭受编码器角度和测量角度之间的不匹配。侧轴应用的典型传递曲线如图2所示。
这些测量误差被称为非线性,可以通过线性化过程进行补偿。
线性化
一些Allegro传感器ic,如A1335,AAS33001,以及AAS33051具有允许输入数据线性化的嵌入式逻辑。然而,其他传感器ic,如A1330,A1333,A1337,A1338,或A1339,芯片上没有这个功能。在使用没有内置数据线性化功能的传感器IC的情况下,可能需要使用微控制器进行外部线性化,以在特定应用中实现所需的精度。
本申请须知将:
- 解释线性化的基本原理
- 演示如何处理实际测量数据来计算修正数据
- 详细说明存储校正数据的三种方法
- 详细说明如何应用修正
- 比较所提方法的准确性
定义
编码器角度
由精确、高分辨率的外部编码器报告的角度。
传感器的角度
由角度传感器IC报告的角度。
角误差
角度误差是磁体实际位置与角度传感器IC测得的磁体位置之差,由传感器角度减去编码器角度计算得出:
错误= (α_sensor - α_encoder)。
但是,如果传感器角度为359°,编码器角度为0°,则误差应为-1°,而不是+359°。要对±180°以外的任何误差进行环绕,可以使用模运算符:
误差= mod[(α_sensor - α_encoder) + 180,360] - 180。
图3给出了侧轴应用中角度误差的示例图。
最大绝对角度误差
最大绝对角度误差是磁体的实际位置与由角度传感器IC测量的磁体位置之间的最大绝对差。
在图3中,当编码器角度为56°时,最大角度误差为21.46°。
线性化的目标
线性化的目标是确定、存储和应用一个函数,使测量的传感器角度误差与编码器角度值相比最小。这使得测量的传感器角度和实际编码器角度之间的差异最小化。
这个目标可以通过不同的方式来实现。本文将详细介绍三种常用技术。亚博尊贵会员
所介绍的技术依赖于单个校准阶段(通常在客户的线尾测试中执行),在此之后应用固定的校正功能。
线性化的先决条件
使用这里详细介绍的技术进行线性化的先决条件如下:
- 在生产过程中,需要将已知的角度应用到传感器系统中。
- 在生产过程中,需要读出传感器角度。
- 要线性化的系统需要一个微控制器,在生产过程中将线性化信息写入微控制器,并在应用中执行线性化。
线性化的限制
使用这里描述的方法进行线性化有一些限制:
- 传感器噪声不能通过线性化来校正。
- 传感器校准后的任何漂移都不会被修正。
- 校准后机械系统的变化不会通过线性化来校正。一个常见的例子是由于振动和转矩而引起的磁铁位置的动态变化
- 如果在校准过程中没有准确记录输入位置,校正的准确性也会受到同样的限制。
线性化方法
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所示。
修正曲线存储选项
在本文中,将研究三种存储修正曲线的方法。还有很多其他的可能性。然而,这里介绍的方法可以满足广泛的需求,同时需要少量的实现和计算工作。在这些方法中,线性插值是在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 (:);
%检查是否持续上升,最多有一次溢出
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
错误('仅允许一个数据减少为溢出')
结束
%正确包装传感器数据
rolovercorrection = round((mean(sensor_data_2) - 180)/360) * 360;
Sensor_data_2 = Sensor_data_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;...
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 = projection - intermediategrid;
Correction_curve = Correction_curve (:);
可以做一个简单的检查,看看这条曲线是否正确。由表1可以看出,当传感器角度为137.46°时,编码器角度为213.75°。从图16的修正曲线可以看出,当传感器角度为137.5°时,需要进行+76.29°的修正。137.46 + 76.26 = 213.72°≅213.75°,计算出的修正曲线适用。
下一步,需要以有效的方式存储修正曲线,以便对任何输入计算修正值。这将使用谐波近似、线性插值和查找表来完成。
谐波近似
概念
每一个重复信号都可以分为构成它的频率。
修正曲线在每次旋转后重复,因此可以完全描述为一组频率。重复修正曲线可以使修正曲线中包含的各种频率更清楚。
谐波近似的一个优点是,修正曲线可以以可接受的精度描述,只使用几个参数。然而,余弦的计算可能太
对于某些平台或应用程序来说速度较慢。亚博尊贵会员
实现
利用傅里叶变换,可以确定校正曲线的每个组成频率的相位和振幅。校正曲线的4096个数据点导致4096点的FFT结果。然而,大部分能量是在较低的频率。下面只提取偏移值和校正曲线的前16次谐波:
这产生了89.82°的偏移校正,以及以下振幅的谐波:%%对校正值进行傅里叶变换,丢弃第16位之后的值
%和按表长度缩放能量
Fft_table = fft(correction_curve)/length(intermediategrid);
Offset_correction = abs(fft_table(1));
Correction_pha = angle(fft_table(2:17));
Correction_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 +…
Correction_amp (1)*cos(1*(sensor_data/360*2*pi) + correction_pha(1) +…
Correction_amp (2)*cos(2*(sensor_data/360*2*pi) + correction_pha(2)) +…
Correction_amp (3)*cos(3*(sensor_data/360*2*pi) + correction_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'0c0,)…(y'ncn)]。在支撑点之间进行线性插值。在角度传感器线性化应用中,使用等距的传感器角度网格是很有用的亚博尊贵会员。这样,传感器角度值为[y'0y……”n]不需要存储,线性校正的实现变得更加容易。例如,它可以存储32个修正值,然后应用于0°、11.25°、22.50°等传感器角度。
存储的点可以通过不同的标准来确定。
确定它们的最简单的方法是通过在校正曲线上选择所述传感器角度的点,这将被称为“曲线上”线性插值。然而,这些点也可以优化存储修正曲线的最小二乘误差。这将被称为“最小二乘”线性插值。其他优化策略是可能的,但不是
本文档描述。
最小二乘方法在相同的最大误差下减少了约50%的存储参数量,并且对单个测量异常值不太敏感。因此,这里将采用最小二乘法来确定线性插值支撑点。
实现
校正曲线需要用分段线性函数逼近。因为支撑点应以最小二乘误差的方式选择,所以在支撑点之前和之后的数据
点也决定了它的最终价值。
这就给第一点和最后一点带来了问题。在0°处的第一个支撑点只有对该点右侧的修正曲线,因此不考虑接近360°的数据。为了避免这个问题,修正曲线将重复三次,并计算该曲线的分段线性最小二乘近似值。然后,只使用中心部分来选择所使用的参数。这个概念如图21所示。
适合计算
复制修正曲线并计算拟合的代码如下:
%%修正曲线的分段线性逼近
Lin_sup_nodes = 32;
%重复修正表三次以避免
%角影响校正计算。
Triple_correction_curve = repmat(correction_curve,3,1);
Triple_correction_curve (end+1) = Triple_correction_curve (1);
%做同样的角度输入
Triple_output_grid = 0:(360/4096):(3*360);
%计算支撑点
YI_lin_triple = lsq_lut_piecewise(triple_output_grid(:),…
%仅使用中心点来计算修正:
(lin_sup_nodes+1: 2*lin_sup_nodes+1);
lsq_lut_piecewise函数在附录A中重述。
32点线性插值的修正参数列表如下:
表4:线性插值参数
请注意,360°的值也添加了,尽管它与0°的值相同。这需要在不使用技巧的情况下使348.75°和360°之间的角度校正成为可能。
应用程序
在MATLAB中,校正的应用是直接使用内置的1D插值函数:
同样的功能也可以实现如下,以演示如何在微控制器中执行计算:%%执行线性插值
Restored_linear_signal = mod(sensor_data(:) +…
%%执行手动线性插值
Restored_linear_signal_man = 0(长度(sensor_data),1);
Lin_sup_res = 360/lin_sup_nodes;
对于I = 1:length(sensor_data)
获取传感器角度前表项的索引
Baseangle_idx = floor(sensor_data(i)/lin_sup_res);
基本角度= baseangle_idx*lin_sup_res;
% get经过表项的度数
偏移角= sensor_data(i) -基准角;
%修正为基数+
correctionval = YI_lin(baseangle_idx+1) +…
((YI_lin(baseangle_idx+2) -…
(baseangle_idx+1)) * offset /lin_sup_res);
Restored_linear_signal_man (i) = mod(sensor_data(i) +…
correctionval, 360);
结束
这段代码对sensor_data中的所有传感器角度执行校正。
在微控制器实现中,位移位和位屏蔽的有效使用可以消除除法运算的需要。模运算可以被有意使用的整数溢出所取代。但是,仍然需要做减法、加法和乘法。
我们的例子线性化后的剩余输出误差如下所示,超过16个记录的角度。剩余的误差通过增加更多的线性化点来减小。
查找表
概念
对于修正曲线的线性插值,需要在支撑点之间进行插值。这需要一些数学运算,通常会花费很长时间。
可以直接使用最接近的校正值,而不是在两个支持值之间进行插值。此方法在本文档中称为查找表。
每组角度的修正值(或bin)将被选为该bin内修正曲线值的平均值。这将确保修正曲线的最低RMS误差
表示。其他策略,例如在相应的bin的最小和最大修正之间选择平均值,也是可能的,但在本文档中不使用。
使用查找表需要存储大量值才能达到可接受的性能。通常需要大约256个值。值的数量不需要是2的幂;然而,在定点代码中的微控制器实现将受益于对表项的数量使用2的幂。
实现
首先,需要定义容器边界。然后,可以确定该边界内修正曲线值的平均值。
%%查找表的近似修正曲线
Number_table_entries = 64;
%选择bin边界
使用函数bin_lut查找每个bin的平均点:
YI_lut = bin_mean(ordered_output_grid(:),…
函数bin_lut在附录b中打印。应该注意的是,校正曲线值恰好在两个箱子之间的边界上,对于较大的值将包含在箱子的平均值中,对于较小的值则不包含在箱子中。
例如,在64个条目中,180°角度的修正曲线数据用于180°…185.625°的bin值,而不是用于174.375°…180°的bin值。
图23显示了64个表项的示例性修正曲线。
64个条目的结果表可以在表5中找到。
表5:64个条目的查找表
应用程序
在MATLAB中,校正的应用很简单,使用内置的1D插值函数previous-neighbor value:
Restored_lut_signal = mod(sensor_data(:) +…
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:length(sensor_data)
获取传感器角度前表项的索引
Baseangle_idx = floor(sensor_data(i)/table_res);
correctionval = YI_lut(baseangle_idx+1);
Restored_lut_signal_man (i) = mod(sensor_data(i) +…
correctionval, 360);
结束
这段代码对sensor_data中的所有传感器角度执行校正。
在微控制器实现中,位移位和位屏蔽的有效使用可以消除除法运算的需要。该角度可用于移位或屏蔽后直接索引表项。模运算可以被有意使用的整数溢出所取代。只需要一个附加项。
我们的例子线性化后的剩余输出误差如下所示,超过16个记录的角度。通过添加更多的查找表项来减少其余的错误。
性能比较
为了比较本文解释的三种方法的性能,分析了理想修正曲线与使用三种讨论的方法的表示之间的差异。
这是使用图16中的修正曲线完成的。其他曲线会给出不同的结果。
在轴上应用中,所需的修亚博尊贵会员正很小,使用的条目数量可以减少。
为了比较这些方法的存储需求,假设为查找表和线性插值存储的每个值都需要一个存储条目。
对于谐波线性化,每个谐波需要两个存储项(相位和幅值),并且需要存储一个直流偏置。这就带来了n次谐波的存储项的数量
到2 ×n+ 1。
为了进行谐波校正,所施加的谐波是按振幅递减的顺序选择的。这意味着,例如,在添加第7次和第8次谐波(振幅分别为0.0361和0.0257°)的修正之前,添加了第9次谐波的修正(振幅为0.0429°)。对于侧轴应用,通常2次和4次谐亚博尊贵会员波比其他谐波强得多。在这种情况下,只有纠正这两个可能是有用的。
图25确定了一个完整旋转的最大绝对误差,并绘制了存储需求。
结论
本文档详细介绍了使用微控制器线性化角度传感器数据的三种可能方法。这些实现涵盖了广泛的内存和处理时间需求。
接触一个快速的代表任何剩余的问题或支持。
附录a:函数lsq_lut_piecewise
从https://uk.mathworks.com/matlabcentral/fileexchange/40913-piecewise-linear-least-square-fit。
版权所有(c) 2013, Guido Albertin
版权所有。
在满足以下条件的前提下,允许以源代码和二进制形式重新分发和使用,无论是否修改:
*重新发布源代码必须保留上述版权声明、此条件列表和以下免责声明。
*以二进制形式重新发布必须在发布时提供的文件和/或其他材料中复制上述版权声明、此条件列表和以下免责声明
本软件由版权所有者和贡献者“按原样”提供,任何明示或默示保证,包括但不限于对适销性和适合特定目的的默示保证。在任何情况下,版权所有者或贡献者都不对任何直接、间接、附带、特殊、惩戒性或后果性损害负责(包括但不限于采购替代商品或服务;丧失使用、数据或利润;或业务中断),无论造成何种原因,并在任何责任理论,无论是在合同,严格责任,或侵权行为(包括疏忽或其他),以任何方式使用本软件,即使被告知这种损害的可能性。
用于1-D插值的分段线性插值(查找表)
%向量用于线性插值例程。
目标是在给定X的条件下求函数的最小值。
%
%的输入
% x测量数据向量
% y测量数据向量
%
%输出
YI个1-D表插值点
%
如果size(x,2) ~= 1
错误('向量x必须具有n x 1的维数');
Elseif size(y,2) ~= 1
错误('向量y必须有维数n x 1.');
Elseif size(x,1) ~= size(x,1)
错误('向量x和y必须具有n x 1的维数');
结束
%矩阵定义由x个测量值
A = sparse([]);
%向量为y的测量值
Y = [];
%检查bin中是否有数据点
如果~(第九)
sprintf('Bin [%f %f]没有数据点,请检查估计。
结束
%获取x和y数据子集
X_ = x(ix);
Y_ = y(ix);
%创建临时矩阵添加到A
建立约束条件下的测量矩阵
(m1, n1) = (A)大小;
(m2, n2) = (tmp)大小;
A = [A零(m1, n1-1)];[零(m2,n1-1) tmp]];
连接bin的y个测量值
Y = [Y;y_];
结束
得到Y的最小二乘估计
易= \ Y;
附录b:函数bin_mean
版权所有(c) 2018, Dominik Geisler, Allegr亚博棋牌游戏o MicroSystems Germany GmbHvAll rights reserved。
在满足以下条件的前提下,允许以源代码和二进制形式重新分发和使用,无论是否修改:
*重新发布源代码必须保留上述版权声明、此条件列表和以下免责声明。
*以二进制形式重新发布必须在发布时提供的文件和/或其他材料中复制上述版权声明、此条件列表和以下免责声明
本软件由版权所有者和贡献者“按原样”提供,任何明示或默示保证,包括但不限于对适销性和适合特定目的的默示保证。在任何情况下,版权所有者或贡献者都不对任何直接、间接、附带、特殊、惩戒性或后果性损害负责(包括但不限于采购替代商品或服务;丧失使用、数据或利润;或业务中断),无论造成何种原因,并在任何责任理论,无论是在合同,严格责任,或侵权行为(包括疏忽或其他),以任何方式使用本软件,即使被告知这种损害的可能性。
% BIN_LUT 1-D插值的bin查找表(表查找)
If ((size(x,1) ~= 1) && (size(x,2) ~= 1))
错误('向量x必须具有n × 1或1 × n');
(size(y,1) ~= 1) && (size(y,2) ~= 1))
错误('向量y必须具有n × 1或1 × n');
长度(x) ~=长度(y)
错误('向量x和y必须具有相同的长度');
结束
结束
附录c:本应用注释中使用的功能完整脚本
版权所有(c) 2018, Dominik Geisler, Allegr亚博棋牌游戏o MicroSystems Germany GmbH
在满足以下条件的前提下,允许以源代码和二进制形式重新分发和使用,无论是否修改:
*重新发布源代码必须保留上述版权声明、此条件列表和以下免责声明。
*以二进制形式重新发布必须在发布时提供的文件和/或其他材料中复制上述版权声明、此条件列表和以下免责声明
本软件由版权所有者和贡献者“按原样”提供,任何明示或默示保证,包括但不限于对适销性和适合特定目的的默示保证。在任何情况下,版权所有者或贡献者都不对任何直接、间接、附带、特殊、惩戒性或后果性损害负责(包括但不限于采购替代商品或服务;丧失使用、数据或利润;或业务中断),无论造成何种原因,并在任何责任理论,无论是在合同,严格责任,或侵权行为(包括疏忽或其他),以任何方式使用本软件,即使被告知这种损害的可能性。
%%传感器数据定义
Angle_input = [0:11. 25:38 .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];
检查上升参考角
If any(angle_input<0) || any(angle_input>360) || any(diff(angle_input)<=0)
误差('参考角度必须在0到360之间单调上升');
结束
检查正确的传感器角度范围
If any(sensor_data<0) || any(sensor_data>360)
错误('传感器角度必须在0到360之间');
结束
% %预处理
Sensor_data_2 = sensor_data(:);
Angle_input = Angle_input (:);
%检查是否持续上升,最多有一次溢出
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
错误('仅允许一个数据减少为溢出')
结束
%正确包装传感器数据
rolovercorrection = 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(:)),“啊——”);
xlabel('编码器角度[deg]');
ylabel('输出角度[deg]');
网格;
xlim (360 [0]);
title({'输出字段方向超过编码器方向'});
%%使用样条从有序的输入网格中移动数据
%到有序的输出网格上:
Ordered_output_grid = 0:(360/4096):(360-360/4096);
Intermediategrid = ordered_output_grid + 360;
投影=样条(sensor_data_ext, angle_input_ext,…
intermediategrid);
%计算所需的数据修正:
Correction_curve = projection - intermediategrid;
Correction_curve = Correction_curve (:);
%%对校正值进行傅里叶变换,丢弃第16位之后的值
%和按表长度缩放能量
亚博棋牌游戏Allegro MicroSystems, LLC
周界道955号
美国曼彻斯特,NH 03103-3353
www.wangzuanquan.com
Fft_table = fft(correction_curve)/length(ordered_output_grid);
Offset_correction = abs(fft_table(1));
Correction_pha = angle(fft_table(2:17));
Correction_amp = 2*abs(fft_table(2:17));
对四个谐波进行谐波校正
Restored_signal_4_harmonics = mod(sensor_data +(…)
Offset_correction +…
Correction_amp (1)*cos(1*(sensor_data/360*2*pi) + correction_pha(1) +…
Correction_amp (2)*cos(2*(sensor_data/360*2*pi) + correction_pha(2)) +…
Correction_amp (3)*cos(3*(sensor_data/360*2*pi) + correction_pha(3)) +…
Correction_amp (4)*cos(4*(sensor_data/360*2*pi) + correction_pha(4))…
), 360);
%%修正曲线的分段线性逼近
Lin_sup_nodes = 32;
%重复修正表三次以避免
%角影响校正计算。
Triple_correction_curve = repmat(correction_curve,3,1);
Triple_correction_curve (end+1) = Triple_correction_curve (1);
%做同样的角度输入
Triple_output_grid = 0:(360/4096):(3*360);
%计算支撑点
YI_lin_triple = lsq_lut_piecewise(triple_output_grid(:),…
%仅使用中心点来计算修正:
(lin_sup_nodes+1: 2*lin_sup_nodes+1);
%%执行线性插值
Restored_linear_signal = mod(sensor_data(:) +…
%%执行手动线性插值
Restored_linear_signal_man = 0(长度(sensor_data),1);
Lin_sup_res = 360/lin_sup_nodes;
对于I = 1:length(sensor_data)
获取传感器角度前表项的索引
Baseangle_idx = floor(sensor_data(i)/lin_sup_res);
基本角度= baseangle_idx*lin_sup_res;
% get经过表项的度数
偏移角= sensor_data(i) -基准角;
%修正为基数+
correctionval = YI_lin(baseangle_idx+1) +…
((YI_lin(baseangle_idx+2) -…
(baseangle_idx+1)) * offset /lin_sup_res);
Restored_linear_signal_man (i) = mod(sensor_data(i) +…
correctionval, 360);
结束
执行查找表更正
Number_table_entries = 64;
%选择bin边界
使用函数bin_lut查找每个bin的平均点:
YI_lut = bin_mean(ordered_output_grid(:),…
应用查找表线性化
Restored_lut_signal = mod(sensor_data(:) +…
YI_lut sensor_data(:),‘以前’,‘extrap’),360);
手动应用查找表线性化
Restored_lut_signal_man = 0(长度(sensor_data),1);
Table_res = 360/number_table_entries;
对于I = 1:length(sensor_data)
获取传感器角度前表项的索引
Baseangle_idx = floor(sensor_data(i)/table_res);
correctionval = YI_lut(baseangle_idx+1);
Restored_lut_signal_man (i) = mod(sensor_data(i) +…
correctionval, 360);
结束
%%绘制三种方法进行lienalize后的剩余误差
图;
情节(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]);xlabel('测量角度[度]');
ylabel('线性化后的预期误差[deg]');
本文件中包含的信息不构成Allegro就本文件主题事项对客户的任何陈述、保证、保证、担保或诱导。所提供的信息并不能保证基于这些信息的流程是可靠的,也不能保证Allegro已经探索了所有可能的故障模式。客户有责任对最终产品进行充分的合格测试,以确保其可靠并满足所有设计要求。
1]快板角度位置传感器集成电路,/ zh /产品/磁性-
Linear-And-Angular-Position-Sensor-ICs / Angular-Position-Sensor-ICs.aspx