ZHCUC00 May 2024
在每个中断服务例程中,四个等距间隔 TMAG5170 的线性位置是按照图 3-7 中的流程图以 4kHz 速率采样率计算的。
读取四个 TMAG5170 的 Z 轴和 X 轴数据。如果这些 Z 轴幅度都不超过最小场强,则表示移动磁体超出范围。否则,会识别 Z 轴上幅度最大的 TMAG5170。可以使用一个迟滞来避免在两个相邻的 TMAG5170 之间的切换。当感应磁体位置位于两个相邻 TMAG5170 之间的中心时,就会发生这种情况,因此两个 TMAG5170 测量到相似的 Z 轴磁场强度。
仅针对 Z 轴磁场强度最高的 TMAG5170 继续进行角度计算。
在第一步中,在系统校准期间校正 Z 轴的失调电压和增益。然后,根据方程式 1,使用校准后的 Z 轴和 X 轴的 atan2 函数计算相对于 TMAG5170 的霍尔效应元件 X 位置的角度。
在第二步中,根据方程式 2 计算线性位置。根据 TMAG5170 数量,还会添加相应的线性位置偏移。
在第三步中,由于离轴测量而产生的误差将使用 X 轴的绝对幅度进行补偿,并使用在系统校准期间根据方程式 3 确定的补偿因数。
下面显示了用于在参考设计中计算线性位置的源代码。
//-------------------------------------------------------
// Angle calculation
//-------------------------------------------------------
// z_max_num
// 0: Out of range (Z-field too small)
// 3: TMAG5170[0] has highest Z-field
// 5: TMAG5170[1] has highest Z-field
// 7: TMAG5170[2] has highest Z-field
// 9: TMAG5170[3] has highest Z-field
//-------------------------------------------------------
void calcLinPos(int16_t zmax_num_index)
{
float tnom;
float tdenom;
PositionRead.LinPosRef_cm = LC415LinPos_cm; // Absolute linear position reference
if (zmax_num_index==0) // Magnet is out of range
{
PositionRead.LinPos_cm = 0; // Measured absolute linear position
PositionRead.LinPosError_cm = 0; // Measured position error
}
else
{
// Gain and offset compensated Z-axis
tnom = TMAGS_ARRAY[(zmax_num_index-3)/2].Z_mT-PositionCalc.OffsetZ_mT[(zmax_num_index-3)/2];
tnom = tnom*PositionCalc.GainComp[(zmax_num_index-3)/2];
tdenom = TMAGS_ARRAY[(zmax_num_index-3)/2].X_mT; // X-axis
PositionRead.Angle_deg = (180/3.1415)*atan2f(tdenom,tnom);
PositionRead.LinPos_cm = PositionRead.Angle_deg/90*PositionCalc.DistanceTMAG5170_cm/2;
PositionRead.LinPos_cm += PositionCalc.DistanceTMAG5170_cm * ((zmax_num_index-3)/2);
PositionRead.LinPos_cm += -PositionCalc.RefOffset_cm;
// Nonlinear position error compensation using X-field
PositionRead.LinPos_cm += PositionCalc.PosXfieldComp * abs(TMAGS_ARRAY[(zmax_num_index-3)/2].X_mT);
// calculate position error versus reference
PositionRead.LinPosError_cm = PositionRead.LinPos_cm - PositionRead.LinPosRef_cm;
}
}
有关角度和线性位置计算算法的更多信息,请参阅应用报告实现更高系统角度检测精度 和线性位置应用的磁体选择(修订版 A)。