60 lines
1.6 KiB
ObjectPascal
60 lines
1.6 KiB
ObjectPascal
unit TemperatureConverter;
|
|
|
|
interface
|
|
|
|
uses
|
|
System.SysUtils;
|
|
|
|
// ADC 값을 실제 온도(UP35A 재출력 스케일)로 변환하는 함수
|
|
function ConvertADCToTemperature(const ADCValue,TEMP_MIN_VALUE,TEMP_MAX_VALUE: Integer): Double;
|
|
|
|
implementation
|
|
|
|
const
|
|
// ADC 값 범위
|
|
ADC_MIN_VALUE = 0;
|
|
ADC_MAX_VALUE = 767;
|
|
|
|
// UP35A 재출력 스케일 (온도 범위)
|
|
// TEMP_MIN_VALUE = 0.0;
|
|
// TEMP_MAX_VALUE = 1700.0;
|
|
|
|
function ConvertADCToTemperature(const ADCValue,TEMP_MIN_VALUE,TEMP_MAX_VALUE: Integer): Double;
|
|
var
|
|
// ADC 값의 범위를 나타내는 델타 (분모)
|
|
ADC_RANGE: Double;
|
|
// 온도 값의 범위를 나타내는 델타 (최대 온도 - 최소 온도)
|
|
TEMP_RANGE: Double;
|
|
// 정규화된 ADC 값 (0.0 ~ 1.0)
|
|
NormalizedADC: Double;
|
|
begin
|
|
// 1. 입력 유효성 검사 (Guard Clause)
|
|
if (ADCValue < ADC_MIN_VALUE) or (ADCValue > ADC_MAX_VALUE) then
|
|
begin
|
|
// 예외 처리 또는 경고값 반환. 여기서는 최소/최대 범위로 클램핑 처리
|
|
if ADCValue < ADC_MIN_VALUE then
|
|
Exit(TEMP_MIN_VALUE)
|
|
else
|
|
Exit(TEMP_MAX_VALUE);
|
|
end;
|
|
|
|
// 2. 범위 계산
|
|
ADC_RANGE := ADC_MAX_VALUE - ADC_MIN_VALUE; // 767 - 0 = 767
|
|
TEMP_RANGE := TEMP_MAX_VALUE - TEMP_MIN_VALUE; // 1700.0 - 0.0 = 1700.0
|
|
|
|
// 3. 선형 변환 (Linear Mapping)
|
|
|
|
// 3-1. ADC 값을 0.0에서 1.0 사이의 비율로 정규화 (Normalization)
|
|
// (ADCValue - ADC_MIN_VALUE) / ADC_RANGE
|
|
// ADC_MIN_VALUE가 0이므로 (ADCValue / 767)
|
|
NormalizedADC := (ADCValue - ADC_MIN_VALUE) / ADC_RANGE;
|
|
|
|
// 3-2. 정규화된 값을 목표 온도 범위로 스케일링 (Scaling)
|
|
// TEMP_MIN_VALUE + (NormalizedADC * TEMP_RANGE)
|
|
Result := TEMP_MIN_VALUE + (NormalizedADC * TEMP_RANGE);
|
|
|
|
// 최종 결과는 0.0 ~ 1700.0 사이의 실수 (Double) 값
|
|
end;
|
|
|
|
end.
|