ZHCUC00 May 2024
在每個中斷服務(wù)例程中,四個等距間隔 TMAG5170 的線性位置是按照圖 3-7 中的流程圖以 4kHz 速率采樣率計算的。
讀取四個 TMAG5170 的 Z 軸和 X 軸數(shù)據(jù)。如果這些 Z 軸幅度都不超過最小場強(qiáng),則表示移動磁體超出范圍。否則,會識別 Z 軸上幅度最大的 TMAG5170。可以使用一個遲滯來避免在兩個相鄰的 TMAG5170 之間的切換。當(dāng)感應(yīng)磁體位置位于兩個相鄰 TMAG5170 之間的中心時,就會發(fā)生這種情況,因此兩個 TMAG5170 測量到相似的 Z 軸磁場強(qiáng)度。
僅針對 Z 軸磁場強(qiáng)度最高的 TMAG5170 繼續(xù)進(jìn)行角度計算。
在第一步中,在系統(tǒng)校準(zhǔn)期間校正 Z 軸的失調(diào)電壓和增益。然后,根據(jù)方程式 1,使用校準(zhǔn)后的 Z 軸和 X 軸的 atan2 函數(shù)計算相對于 TMAG5170 的霍爾效應(yīng)元件 X 位置的角度。
在第二步中,根據(jù)方程式 2 計算線性位置。根據(jù) TMAG5170 數(shù)量,還會添加相應(yīng)的線性位置偏移。
在第三步中,由于離軸測量而產(chǎn)生的誤差將使用 X 軸的絕對幅度進(jìn)行補(bǔ)償,并使用在系統(tǒng)校準(zhǔn)期間根據(jù)方程式 3 確定的補(bǔ)償因數(shù)。
下面顯示了用于在參考設(shè)計中計算線性位置的源代碼。
//-------------------------------------------------------
// 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;
}
}
有關(guān)角度和線性位置計算算法的更多信息,請參閱應(yīng)用報告實現(xiàn)更高系統(tǒng)角度檢測精度 和線性位置應(yīng)用的磁體選擇(修訂版 A)。