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