ZSSC3241 데이터시트에서 제공하는 보정 공식은 센서 신호 보정을 위한 Sensor Signal Conditioning (SSC) 공식으로, 센서 신호(S)와 온도 신호(T)를 보정하여 정확한 출력을 제공합니다. 이 공식은 비선형성과 온도 영향을 보상하며, 두 가지 SOT_curve 설정(Parabolic 또는 S-shaped)에 따라 다른 계산 방식을 사용합니다.
1. 보정 공식 개요
ZSSC3241은 센서의 원시 데이터(S_Raw)와 온도 데이터(T_Raw)를 사용하여 보정된 센서 출력(S)와 온도 출력(T)을 계산합니다. 보정 공식은 다음 요소를 포함합니다:
- 선형 보정: Gain(이득)과 Offset(오프셋) 계수를 사용하여 선형 보정을 수행.
- 2차 비선형 보정: SOT(S second-Order Term) 계수를 사용하여 센서 및 온도 신호의 비선형성을 보상.
- 온도 보상: 온도 계수(Tcg, Tco)를 사용하여 온도에 따른 센서 신호 변화를 보정.
- 포스트 보정 오프셋: SENS_shift와 T_shift를 사용하여 최종 출력에 추가적인 오프셋 조정을 적용.
보정 공식은 데이터시트의 6.6.3.2절(Digital Sensor-Signal-Conditioning Mathematics)에 정의되어 있으며, Equation 6~22에 상세히 설명됩니다. 공식은 SOT_curve 설정에 따라 Parabolic(SOT_curve = 0) 또는 S-shaped(SOT_curve = 1)로 나뉩니다.
2. 보정 공식의 주요 변수
데이터시트의 Table 36과 Table 37은 보정 공식에 사용되는 계수와 결과의 데이터 형식을 정의합니다. 주요 변수는 다음과 같습니다:
입력 데이터
- S_Raw: ADC에서 얻은 원시 센서 신호(24비트, 범위: -7FFFFFHEX ~ 7FFFFFHEX).
- T_Raw: ADC에서 얻은 원시 온도 신호(24비트, 범위: -7FFFFFHEX ~ 7FFFFFHEX).
- 둘 다 Auto-Zero(AZ) 보정이 적용될 수 있음: \( S_{\text{Raw}} = 0.5 \cdot (SM - AZS) \), \( T_{\text{Raw}} = 0.5 \cdot (TM - AZT) \).
보정 계수
- Gain_S: 센서 이득 계수(24비트, 범위: -7FFFFFHEX ~ 7FFFFFHEX).
- Offset_S: 센서 오프셋 계수(24비트, 범위: -7FFFFFHEX ~ 7FFFFFHEX).
- Tcg: 온도 계수 이득(Temperature Coefficient Gain, 24비트, 범위: -7FFFFFHEX ~ 7FFFFFHEX).
- Tco: 온도 계수 오프셋(Temperature Coefficient Offset, 24비트, 범위: -7FFFFFHEX ~ 7FFFFFHEX).
- SOT_tcg: Tcg의 2차 비선형 보정 계수(24비트, 범위: -7FFFFFHEX ~ 7FFFFFHEX).
- SOT_tco: Tco의 2차 비선형 보정 계수(24비트, 범위: -7FFFFFHEX ~ 7FFFFFHEX).
- SOT_sens: 센서 신호의 2차 비선형 보정 계수(24비트, 범위: -7FFFFFHEX ~ 7FFFFFHEX).
- SENS_shift: 포스트 보정 센서 오프셋 조정(24비트, 범위: -7FFFFFHEX ~ 7FFFFFHEX).
- Gain_T: 온도 이득 계수(24비트, 범위: -7FFFFFHEX ~ 7FFFFFHEX).
- Offset_T: 온도 오프셋 계수(24비트, 범위: -7FFFFFHEX ~ 7FFFFFHEX).
- SOT_T: 온도 신호의 2차 비선형 보정 계수(24비트, 범위: -7FFFFFHEX ~ 7FFFFFHEX).
- T_shift: 포스트 보정 온도 오프셋 조정(24비트, 범위: -7FFFFFHEX ~ 7FFFFFHEX).
출력 데이터
- S: 보정된 센서 출력(24비트, 범위: 0HEX ~ FFFFFFHEX).
- T: 보정된 온도 출력(24비트, 범위: 0HEX ~ FFFFFFHEX).
데이터 형식
Table 36 (24-bit SSC Coefficients): 계수는 24비트로 표현되며, 비트 23은 부호 비트, 비트 22~0은 절대값을 나타냄.
Bit-Number: 23 | 22 | 21 | 20 | ... | 2 | 1 | 0
Meaning: Sign | 2^22 | 2^21 | 2^20 | ... | 2^2 | 2^1 | 2^0
Table 37 (Corrected SSC Results): 출력 S와 T는 24비트 양수로, 범위는 0HEX ~ FFFFFFHEX.
Bit-Number: 23 | 22 | 21 | 20 | ... | 2 | 1 | 0
Meaning: 2^23 | 2^22 | 2^21 | 2^20 | ... | 2^2 | 2^1 | 2^0
3. 보정 공식 상세 설명
3.1 온도 보정 공식 (T 계산)
온도 출력 T는 원시 온도 데이터 T_Raw를 사용하여 다음과 같이 계산됩니다. 이 공식은 모든 SOT_curve 설정에서 동일합니다.
Equation 21:
\[ Z_T = \left[ \left[ \frac{\text{Gain_T}}{2^{21}} \cdot \left( T_{\text{Raw}} + 4 \cdot \text{Offset_T} \right) \right]_{2^{25}}^{2^{25}-1} \right]_0^{2^{25}-1} \]
Equation 22:
\[ T = \left[ \left[ \frac{Z_T}{2^{23}} \cdot \left[ \left[ \frac{\text{SOT_T}}{2^{24}} \cdot Z_T \right]_{2^{25}}^{2^{25}-1} + 2^{23} \right]_{2^{24}}^{2^{25}-1} \right]_{2^{24}}^{2^{25}-1} + \text{T_shift} \right]_0^{2^{24}-1} \]
단계 설명
- 선형 보정: T_Raw에 4배의 Offset_T를 더한 후, Gain_T를 221로 나눠 곱하여 선형 보정을 수행. 결과는 Z_T로, 0 ~ 225-1 범위로 제한.
- 2차 비선형 보정: Z_T에 SOT_T를 적용하여 2차 항을 추가. SOT_T는 224로 나누어 스케일링.
- 최종 조정: Z_T를 223으로 나누고, 2차 항 결과를 더한 후 T_shift를 적용. 결과는 0 ~ 224-1 범위로 제한.
용도: 이 공식은 내부 또는 외부 온도 센서 데이터를 보정하여 정확한 온도 값 T를 출력.
3.2 센서 보정 공식 (S 계산)
센서 출력 S는 SOT_curve 설정에 따라 두 가지 방식으로 계산됩니다.
3.2.1 Parabolic Curve (SOT_curve = 0)
Equation 6:
\[ K_1 = \left[ 4 \cdot \text{Gain_S} + \left[ \frac{\text{S_Raw}}{2^{23}} \cdot \left[ \frac{\text{SOT_tcg}}{2^{21}} \cdot T_{\text{Raw}} \right]_{2^{25}}^{2^{25}-1} \cdot \text{Tcg} \right]_{2^{25}}^{2^{25}-1} \right]_{2^{25}}^{2^{25}-1} \]
Equation 7:
\[ K_2 = \left[ 4 \cdot \text{Offset_S} + \left[ S_{\text{Raw}} + \left[ \frac{T_{\text{Raw}}}{2^{23}} \cdot \left[ \frac{\text{SOT_tco}}{2^{21}} \cdot T_{\text{Raw}} \right]_{2^{25}}^{2^{25}-1} \cdot \text{Tco} \right]_{2^{25}}^{2^{25}-1} \right]_{2^{25}}^{2^{25}-1} \right]_{2^{25}}^{2^{25}-1} \]
Equation 8:
\[ Z_{SP} = \left[ \left[ \frac{\text{Gain_S}}{2^{21}} \cdot \left[ \frac{K_1}{2^{23}} \cdot K_2 \right]_{2^{25}}^{2^{25}-1} \right]_{2^{25}}^{2^{25}-1} \right]_{2^{25}}^{2^{25}-1} \]
Equation 9:
\[ S = \left[ \left[ \frac{Z_{SP}}{2^{23}} \cdot \left[ \frac{\text{SOT_sens}}{2^{21}} \cdot Z_{SP} \right]_{2^{25}}^{2^{25}-1} + 2^{23} \right]_{2^{25}}^{2^{25}-1} + \text{SENS_shift} \right]_0^{2^{24}-1} \]
단계 설명
- K_1 계산 (이득 보정): Gain_S를 4배로 스케일링. T_Raw를 사용하여 SOT_tcg와 Tcg로 온도 의존적 이득 변화를 보정. 결과는 225-1로 제한.
- K_2 계산 (오프셋 보정): Offset_S를 4배로 스케일링. S_Raw와 T_Raw를 사용하여 SOT_tco와 Tco로 온도 의존적 오프셋 변화를 보정. 결과는 225-1로 제한.
- Z_SP 계산: K_1과 K_2를 곱하고, Gain_S를 221로 나눠 추가 이득을 적용. 결과는 225-1로 제한.
- S 계산: Z_SP에 SOT_sens를 적용하여 2차 비선형 보정을 수행. SENS_shift를 더해 최종 오프셋 조정. 결과는 0 ~ 224-1로 제한.
3.2.2 S-shaped Curve (SOT_curve = 1)
Equation 15 (간소화):
\[ Z_{SS} = \frac{4 \cdot \text{Gain_S}}{2^{21}} \cdot \frac{K_1}{2^{23}} \cdot K_2 \]
(K_1과 K_2는 Equation 6, 7과 동일)
Equation 16:
\[ S = \frac{Z_{SS}}{2^{23}} \cdot \left( \frac{4 \cdot \text{SOT_sens}}{2^{23}} \cdot |Z_{SS}| + 2^{23} \right) + 2^{23} + \text{SENS_shift} \]
(결과는 양수 범위로 제한)
Equation 17~20 (완전 공식):
\[ K_1 = \left[ 4 \cdot \text{Gain_S} + \left[ \frac{S_{\text{Raw}}}{2^{23}} \cdot \left[ \frac{\text{SOT_tcg}}{2^{21}} \cdot T_{\text{Raw}} \right]_{2^{25}}^{2^{25}-1} \cdot \text{Tcg} \right]_{2^{25}}^{2^{25}-1} \right]_{2^{25}}^{2^{25}-1} \] \[ K_2 = \left[ 4 \cdot \text{Offset_S} + \left[ S_{\text{Raw}} + \left[ \frac{T_{\text{Raw}}}{2^{23}} \cdot \left[ \frac{\text{SOT_tco}}{2^{21}} \cdot T_{\text{Raw}} \right]_{2^{25}}^{2^{25}-1} \cdot \text{Tco} \right]_{2^{25}}^{2^{25}-1} \right]_{2^{25}}^{2^{25}-1} \right]_{2^{25}}^{2^{25}-1} \] \[ Z_{SS} = \left[ \left[ \frac{4 \cdot \text{Gain_S}}{2^{21}} \cdot \left[ \frac{K_1}{2^{23}} \cdot K_2 \right]_{2^{25}}^{2^{25}-1} \right]_{2^{25}}^{2^{25}-1} \right]_{2^{25}}^{2^{25}-1} \] \[ S = \left[ \left[ \frac{Z_{SS}}{2^{23}} \cdot \left[ \frac{4 \cdot \text{SOT_sens}}{2^{23}} \cdot |Z_{SS}| + 2^{23} \right]_{2^{25}}^{2^{25}-1} + 2^{23} \right]_{2^{25}}^{2^{25}-1} + \text{SENS_shift} \right]_0^{2^{24}-1} \]
단계 설명
- K_1, K_2 계산: Parabolic과 동일.
- Z_SS 계산: K_1과 K_2를 곱하고, 4배의 Gain_S를 221로 나눠 적용.
- S 계산: Z_SS의 절대값에 SOT_sens를 적용하여 S-shaped 비선형 보정을 수행. SENS_shift를 더하고, 결과를 양수 범위로 제한.
Parabolic vs S-shaped 차이점
- Parabolic: 2차 항이 포물선 형태로 보정(SOT_sens가 Z_SP의 제곱에 비례).
- S-shaped: 2차 항이 S자 형태로 보정(SOT_sens가 Z_SS의 절대값에 비례).
#include <stdint.h>
#include <inttypes.h>
#include <stdlib.h>
#include <stdio.h>
static inline int64_t clamp_i64(int64_t v, int64_t lo, int64_t hi){
if(v < lo) return lo;
if(v > hi) return hi;
return v;
}
/* 계수는 int32_t(24-bit sign)로 전달한다고 가정 */
int32_t sign_extend_24(int32_t x){
// input: lower 24 bits valid
if (x & (1<<23)) return x | ~((1<<24)-1); // 음수
return x & ((1<<24)-1);
}
/* 온도 계산 (간략화) */
uint32_t compute_T(int32_t T_Raw, int32_t Gain_T, int32_t Offset_T,
int32_t SOT_T, int32_t T_shift)
{
// sign-extend inputs
int64_t Traw = sign_extend_24(T_Raw);
int64_t gT = sign_extend_24(Gain_T);
int64_t offT = sign_extend_24(Offset_T);
int64_t sotT = sign_extend_24(SOT_T);
int64_t tshift = sign_extend_24(T_shift);
// Step1: Z_T = clamp( (Gain_T / 2^21) * (Traw + 4*Offset_T) ) range ~ [0 .. 2^25-1]
int64_t tmp = Traw + 4 * offT; // might be negative
int64_t ZT = (gT * tmp) >> 21; // use arithmetic shift; ensure gT,tmp fit in 64-bit
ZT = clamp_i64(ZT, 0, ((1LL<<25)-1));
// Step2: T = clamp( (ZT / 2^23) * ( (SOT_T/2^24)*ZT + 2^23 ) + T_shift ) range 0..2^24-1
int64_t term = ( (sotT * ZT) >> 24 ); // (SOT_T/2^24)*ZT
int64_t inner = term + (1LL<<23);
int64_t Tval = ( (ZT >> 23) * inner ) + tshift; // careful with shifting order
Tval = clamp_i64(Tval, 0, ((1LL<<24)-1));
return (uint32_t)Tval;
}
/* Parabolic S 계산(간략화 — 중간 클램핑 생략 가능성 있음) */
uint32_t compute_S_parabolic(int32_t S_Raw, int32_t T_Raw,
int32_t Gain_S, int32_t Offset_S,
int32_t SOT_tcg, int32_t Tcg,
int32_t SOT_tco, int32_t Tco,
int32_t SOT_sens, int32_t SENS_shift)
{
int64_t Sraw = sign_extend_24(S_Raw);
int64_t Traw = sign_extend_24(T_Raw);
int64_t gS = sign_extend_24(Gain_S);
int64_t offS = sign_extend_24(Offset_S);
int64_t sot_tcg = sign_extend_24(SOT_tcg);
int64_t tcg = sign_extend_24(Tcg);
int64_t sot_tco = sign_extend_24(SOT_tco);
int64_t tco = sign_extend_24(Tco);
int64_t sot_sens = sign_extend_24(SOT_sens);
int64_t sens_shift = sign_extend_24(SENS_shift);
// K1 = clamp(4*Gain_S + (S_raw/2^23 * (SOT_tcg/2^21 * T_raw) * Tcg))
int64_t a = (sot_tcg * Traw) >> 21; // SOT_tcg/2^21 * Traw
int64_t b = (Sraw * a) >> 23; // S_raw/2^23 * previous
int64_t k1 = 4 * gS + ((b * tcg) >> 0); // shift depends on intended scale
k1 = clamp_i64(k1, 0, ((1LL<<25)-1));
// K2 = clamp(4*Offset_S + (S_raw + (T_raw/2^23 * (SOT_tco/2^21 * T_raw) * Tco)))
int64_t c = (sot_tco * Traw) >> 21;
int64_t d = (Traw * c) >> 23;
int64_t k2 = 4 * offS + (Sraw + d);
k2 = clamp_i64(k2, 0, ((1LL<<25)-1));
// Z_SP = clamp( (Gain_S/2^21) * ( (K1/2^23) * K2 ) )
int64_t ZSP = ( ( (gS * ((k1 * k2) >> 23)) ) >> 21 );
ZSP = clamp_i64(ZSP, 0, ((1LL<<25)-1));
// S = clamp( (Z_SP/2^23) * ( (SOT_sens/2^21)*Z_SP + 2^23 ) + SENS_shift )
int64_t term = (sot_sens * ZSP) >> 21;
int64_t inner = term + (1LL<<23);
int64_t Sval = ((ZSP >> 23) * inner) + sens_shift;
Sval = clamp_i64(Sval, 0, ((1LL<<24)-1));
return (uint32_t)Sval;
}
- 정수형/비트 해석
- 계수(24비트)는 sign-magnitude/2's complement 형태를 데이터시트 기준으로 해석해야 함(원문은 비트23이 부호로 설명). 입력을 부호있는 int32_t로 변환.
- 중간 연산 비트폭
- 곱·곱·나눗셈이 많으므로 int64_t 또는 __int128(필요 시) 사용. 특히 두 24비트 수 곱하면 48비트가 필요.
- 스케일/시프트 정밀도
- 데이터시트의 /2^{21}, /2^{23} 등은 사실 고정소수점 스케일. 예: Gain/2^21 * x는 (int64_t)Gain * x >> 21로 구현하되, 곱셈 후 시프트 순서와 사인 확장(sign extension)에 주의.
- 클램프(포화 연산)
- 식 곳곳에 [...]_{0}^{2^{24}-1} 등으로 클램프(포화)가 지정되어 있음. 각 단계 규격(예: 0..2^25-1 또는 signed 범위)을 정확히 적용해야 결과가 일치.
- 절댓값(ABS)
- S-shaped에서 |Z_SS| 사용 — 음수 가능성/부호 비트를 고려해 절댓값 취함.
- 테스트 벡터
- 데이터시트 예시(있다면)나 제조사 예제 계수로 단위 테스트를 만들어 단계별(Z_T, K1, K2, Z_SP 등) 중간값을 확인.
4. DAC 보정 공식
ZSSC3241은 아날로그 출력(DAC)을 위한 별도의 보정 공식을 제공합니다. 이는 6.6.3.3절(Separate Correction of the Digital-to-Analog Converter Characteristic)에 설명되어 있습니다.
Equation 25:
\[ \text{DAC_IN} = \left[ \text{S} \text{ or } \text{T} \right]_0^{2^{16}-1} \]
Equation 26:
\[ \text{DAC_OUT} = \left[ \left[ \frac{\text{Gain_DAC}}{2^{16}} \cdot \text{DAC_IN} \right] + 2 \cdot \text{Offset_DAC} + 2^{18} \right]_0^{2^{18}-1} \]
변수
- DAC_IN: 입력값(S 또는 T, 16비트로 제한).
- Gain_DAC: DAC 이득 보정 계수(NVM 주소 2AHEX).
- Offset_DAC: DAC 오프셋 보정 계수(NVM 주소 2BHEX).
- DAC_OUT: 보정된 DAC 출력(18비트, 0 ~ 218-1).
설명
- DAC_IN은 S 또는 T를 16비트로 클리핑한 값.
- Gain_DAC를 216으로 나눠 이득을 조정하고, 2배의 Offset_DAC와 218을 더해 오프셋을 보정.
- 결과는 0 ~ 218-1로 제한.
- 이 보정은 제조 공정 변동으로 인한 DAC의 오프셋 및 이득 편차를 보상.
예외
- DAC 진단 명령(B3HEX) 사용 시 보정 적용 안 됨.
- 진단 이벤트(diagouten 활성화 및 센서 연결 오류 등) 발생 시 보정 적용 안 됨.
- DAC 클리핑 활성화 시 보정 적용 안 됨.
5. 보정 공식 적용 시 고려사항
- NVM 설정:
- 보정 계수는 NVM에 저장(NVM 주소 05HEX ~ 2BHEX, Table 35 참조).
- 예: Gain_S는 05HEX, 06HEX에, SOT_sens는 0EHEX, 0FHEX에 저장.
- SOT_curve는 SSF2 레지스터(04HEX, 비트 15)에 설정.
- 오토 제로(AZ):
- AZ 활성화 시(S_Raw = 0.5 * (SM - AZS), T_Raw = 0.5 * (TM - AZT)) 신호-노이즈 비율이 개선되지만, 업데이트 속도가 약 50% 느려짐.
- AZ 설정은 SSF2 레지스터(AZMs_on, AZMt_on 비트)에서 제어.
- 오버플로우/언더플로우:
- 계산 중간 결과는 지정된 비트 범위(225-1 등)로 제한.
- 최종 출력 S, T는 0 ~ 224-1로 제한되며, 오버플로우/언더플로우는 상태 바이트에 포화(Saturation)로 보고됨.
- 캘리브레이션:
- 캘리브레이션은 다양한 센서 값과 온도에서 원시 데이터를 수집하고, 이를 기반으로 계수를 계산하여 NVM에 저장(7절, Calibration).
- 고유 ID를 NVM에 작성하여 각 ZSSC3241을 식별.
6. 결론
ZSSC3241의 보정 공식은 센서 및 온도 신호의 선형 및 비선형 보정, 온도 보상을 통해 고정밀 출력을 제공합니다. Parabolic 또는 S-shaped SOT_curve 설정을 선택하여 센서 특성에 맞는 보정을 수행할 수 있으며, DAC 보정을 통해 아날로그 출력도 최적화되며 모든 계수는 NVM에 저장되며, Auto-Zero 및 기타 설정을 통해 신호 품질과 업데이트 속도를 조정할 수 있습니다.