JAJU934 May 2024
等間隔で配置された 4 個の TMAG5170 の線形位置は、下に示す 図 3-7 のフローチャートに従い、4kHz レートのサンプル レートで各割り込みサービス ルーチンにより計算されます。
4 個の TMAG5170 の Z 軸と X 軸のデータが読み取られます。Z 軸方向の大きさがどれも最小磁界強度を超えない場合、ムービング磁石は範囲外です。そうでない場合は、Z 軸で振幅が最大の TMAG5170 を特定します。ヒステリシスを使用して、隣接する 2 つの TMAG5170 の間の切り替えを回避できます。これは、検出磁石の位置が 2 つの隣接する TMAG5170 の間の中央にあるため、両方の TMAG5170 で同程度の Z 軸の磁界強度が測定される場合に発生します。
角度の計算は、Z 軸の磁界強度が最大の TMAG5170 についてのみ続行されます。
最初のステップでは、システム較正中に識別されたように、Z 軸のオフセットとゲインを補正します。次に、式 1 に従って、較正済みの Z 軸および X 軸の atan2 関数を使用して、対応する TMAG5170 のホール効果素子の X 位置に対する角度を計算します。
2 番目のステップでは、線形位置は 式 2 に従って計算されます。TMAG5170 の番号に応じて、対応するリニア位置オフセットも追加されます。
3 番目のステップでは、システム キャリブレーション中に 式 3 に従って特定された補償係数により、X 軸の絶対振幅を使用して軸外測定による誤差を補償します。
リファレンス デザインで線形位置を計算するために使用したソース コードを以下に示します。
//-------------------------------------------------------
// 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;
}
}
角度および線形位置計算のアルゴリズムの詳細については、アプリケーション レポート「最大のシステム角度検出精度を達成する」と「線形位置アプリケーション用磁石の選択 (Rev. A)」を参照してください。