IIO firmware for the AD4110

Dependencies:   tempsensors sdp_k1_sdram

app/ad4110_temperature_sensor.cpp

Committer:
Janani Sunil
Date:
2022-07-27
Revision:
0:6ca37a8f8ba9

File content as of revision 0:6ca37a8f8ba9:

/***************************************************************************//*
 * @file    ad4110_temperature_sensor.cpp
 * @brief   AD4110 temperature sensor functionality
 * @details
******************************************************************************
 * Copyright (c) 2022 Analog Devices, Inc. All Rights Reserved.
 *
 * This software is proprietary to Analog Devices, Inc. and its licensors.
 * By using this software you agree to the terms of the associated
 * Analog Devices Software License Agreement.
******************************************************************************/

/******************************************************************************/
/***************************** Include Files **********************************/
/******************************************************************************/

#include <stdint.h>
#include <ptxxx.h>
#include <thermocouple.h>
#include "ad4110_temperature_sensor.h"

#ifdef __cplusplus
extern "C"
{
#endif //  _cplusplus

#include "app_config.h"
#include "ad4110_support.h"

#ifdef __cplusplus  // Closing extern c
}
#endif //  _cplusplus

/******************************************************************************/
/********************* Macros and Constants Definitions ***********************/
/******************************************************************************/

/* NTC thermistor Rsense value (in ohms) */
#define NTC_RSENSE			10000U

/* RTD Rref Resistance value (in ohms) */
#define RTD_RREF			25000U

/* Lead resistance value (in ohms)
* NOTE: There is an RC filter configuration physically in series with the AIN+
* and AIN- terminals, (10 + 10 ohms) that needs to be compensated for during conversion. */
#define LEAD_RESISTANCE			20

/* Scale factor for TMP36 used for CJC */
#define TMP36_SCALE			0.03

/******************************************************************************/
/******************** Variables and User Defined Data Types *******************/
/******************************************************************************/

/******************************************************************************/
/************************** Functions Definitions *****************************/
/******************************************************************************/

/**
 * @brief Convert ADC raw value into equivalent RTD temperature
 * @param rtd_sample[in] - Raw ADC sample for RTD sensor
 * @return RTD temperature
 * @note Fixed PT100 RTD sensor is used
 */
float get_rtd_temperature(uint32_t rtd_sample)
{
	PT100 rtd_sensor;
	float rtd_resistance;

	rtd_resistance = convert_adc_raw_into_rtd_resistance(rtd_sample, RTD_RREF);
	/* The lead resistance value is compensated to achieve accuracy in resistance and temperature
	measurement */
	rtd_resistance = rtd_resistance - LEAD_RESISTANCE;
	return rtd_sensor.convertResistanceToTemperature(rtd_resistance);
}


/**
 * @brief Convert ADC raw value into TC temperature
 * @param tc_sample[in] - Raw TC sample
 * @param tc_channel[in] - Thermocouple channel
 * @param cjc_sample[in] - Raw CJC sample
 * @param cjc_channel[in - CJC channel
 * @param cjc_temp[in, out] - CJC temperature value
 * @return TC temperature
 * @note T type thermocouple used, on board TMP36 is used for CJC.
 */
float get_tc_temperature(uint32_t tc_sample, uint8_t tc_channel,
			 uint32_t cjc_sample, uint8_t cjc_channel,
			 float *cjc_temp)
{
	Thermocouple_Type_T tcSensor;
	float tc_mv;
	volatile float cjc_mv;
	float tc_temperature;
	float cjc_temperature;

	/* Thermocouple temperature calculation */
	tc_mv = convert_adc_sample_into_voltage(tc_sample, tc_channel) * 1000;
	tc_temperature = tcSensor.convert(tc_mv);

	/* CJC Temperature calculation */
	cjc_mv = convert_adc_sample_into_voltage(cjc_sample, cjc_channel) * 1000;
	cjc_temperature  = TMP36_SCALE * cjc_mv;

	/* Get the CJC temperature */
	*cjc_temp = cjc_temperature;

	return (tc_temperature + cjc_temperature);
}