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.