This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] ADS124S08EVM:ADS124S08EVM热电偶不准确的原始计数

Guru**** 2561060 points
Other Parts Discussed in Thread: ADS124S08EVM, ADS124S08

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1092679/ads124s08evm-ads124s08evm-themocouple-inaccurate-raw-count

部件号:ADS124S08EVM
主题中讨论的其他部件: ADS124S08

您好,  

在将ADS124S08EVM的AIN2和AIN4终端修改为与外部Linux处理器配合使用后,IVE将K型热电偶连接到了AIN2和AIN4终端。 参见以下规格。  

我对ASD124S08 EVM  https://www.ti.com/tool/ADS124S08EVM上的JP1进行了短接 ,以便可以使用另一个微控制器对其进行控制。  

微控制器: nrf5340-dk

RTOS:Zephyr.

SDK:nrf SDK 1.8 .........0

SPI时钟:5MHz

IVE遵循 了《热电偶测量基本指南 》中的说明,产生的原始计数似乎非常高。 我将指南中的公式应用于原始计数,我看到电压记录的值非常高。,  

  

请参阅下面的寄存器配置。  

注册地图:  

00>[00:00:00。ADS]<INF> ads124s08:55.13万 124S08检测到ID:8
00>[00:00:00.ad] 55.2062万 <inf> ads124s08:reg: 0,val 8.
00>[00:00:00:00.ad] 55.2124万 <inf> ads124s08:reg: 1, val 80
00>[00:00:00.ad] 55.2185万 <inf> ads124s08:reg: 2,val 24.
00>[00:00:00.ad] 55.2276万 <inf> ads124s08:reg: 3,val 2.
00>[00:00:00.ad] 55.2337万 <inf> ads124s08:reg: 4,val 14.
00>[00:00:00.ad] 55.2429万 <inf> ads124s08:reg: 5,val 10.
00>[00:00:00.ad] 55.249万 <inf> ads124s08:reg: 6,val 0
00>[00:00:00.ad] 55.2581万 <inf> ads124s08:reg: 7,val ff
00>[00:00:00.ad] 55.2642万 <inf> ads124s08:reg: 8,val 10.
00>[00:00:00.ad] 55.2734万 <inf> ads124s08:reg: 9,val 10.
00>[00:00:00.ad] 55.2795万 <inf> ads124s08:reg: a,val 0
00>[00:00:00.ad] 55.2856万 <inf> ads124s08:reg: b , val 0
00>[00:00:00.ad] 55.2947万 <inf> ads124s08:reg: c,val 0
00>[00:00:00.ad] 55.3009万 <inf> ads124s08:reg: d,val 0
00>[00:00:00.ad] 55.307万 <inf> ads124s08:reg: e,val 0
00>[00:00:00.ad] 55.3161万 <inf> ads124s08:reg: F,val 40.
00>[00:00:00.ad] 55.3222万 <inf> ads124s08:reg: 10,val 0
00>[00:00:00.ad] 55.3283万 <inf> ads124s08:reg: 11,val 0

输出:(时间戳,原始计数,样品和转换电压(应用指南中的公式3):  


00>[00:01:17.mV] 84.1857万 <inf> ads124s08:原始:FF,ff,96,样本:1677.711万,电压319mV
00>[00:01:17.mV] 90.8721万 <inf> ads124s08:原始:FF,ff,99,样本:1677.7113万,电压319mV
00>[00:01:17.mV]<inf> ads124s08:原始:97.5585万 ,ff,9d,样品:1677.7117万,电压319mV
00>[00:01:18.mV] 4.2449万 <inf> ads124s08:原始:FF,ff,98,样本:1677.7112万,电压319mV
00>[00:01:18.mV]<inf> ads124s08:原始:10.9313万 ,ff,99,样品:1677.7113万,电压319mV
00>[00:01:18.mV] 17.6177万 <inf> ads124s08:原始:FF,ff,96,样本:1677.711万,电压319mV
00>[00:01:18.mV] 24.3041万 <inf> ads124s08:原始:FF,ff,96,样本:1677.711万,电压319mV
00>[00:01:18.mV]<inf> ads124s08:原始:30.9906万 ,ff,9a,样品:1677.7114万,电压319mV
00>[00:01:18.mV] 37.677万 <inf> ads124s08:原始:FF,ff,98,样本:1677.7112万,电压319mV
00>[00:01:18.mV] 44.3634万 <inf> ads124s08:原始:FF,ff,97,样本:1677.7111万,电压319mV
00>[00:01:18.mV]<inf> ads124s08:原始:51.0528万 ,ff,9c,样品:1677.7116万,电压319mV
00>[00:01:18.mV] 57.7392万 <inf> ads124s08:原始:FF,ff,98,样本:1677.7112万,电压319mV
00>[00:01:18.mV] 64.4256万 <inf> ads124s08:原始:FF,ff,98,样本:1677.7112万,电压319mV

发送RDATA命令时,请参阅逻辑分析器的以下屏幕截图:  

请参阅下面的ADS124S08.c代码:  

#define DT_DRV_COMPAT ti_ads124s08
#include <init.h>
#include <sys/byteorder.h>
#include <sys/__assert.h>
#include <logging/log.h>

LOG_MODULE_REGISTER(ads124s08, CONFIG_SENSOR_LOG_LEVEL);
#include "ads124s08.h"

#include <devicetree.h>
#include <drivers/gpio.h>

#include <nrf.h>
#include <hal/nrf_gpio.h>

static const struct device *dev_start;
static const struct device *dev_reset;

static int ads124s08_reg_readout(const struct device *dev); 

// configure GPIO Pins for CS, Start and reset

static void init_gpio(void)   {

    int status;

    dev_reset = device_get_binding(ADS124S08_RESET_LABEL);
    if (dev_reset == NULL){ 
      LOG_ERR("dev_reset device_get_binding() failure.");
      return;
    }

    status = gpio_pin_configure(dev_reset, ADS124S08_RESET_PIN, GPIO_OUTPUT_ACTIVE); 
    if (status < 0){ 
      LOG_ERR("dev_reset gpio_pin_configure() failure.");
      return;
    }

	dev_start= device_get_binding(ADS124S08_START_LABEL);
    if (dev_start == NULL){ 
      LOG_ERR("dev_start device_get_binding() failure.");
      return;
    }

    status = gpio_pin_configure(dev_start, ADS124S08_START_PIN, GPIO_OUTPUT_ACTIVE); 
    if (status < 0){ 
      LOG_ERR("dev_start gpio_pin_configure() failure.");
      return;
    }

#ifndef CONFIG_ADS124S08_TRIGGER
	nrf_gpio_cfg_input(DRDY_PIN, NRF_GPIO_PIN_PULLUP); 
#endif 

}


static void ads124s08_set_start_pin(int STATE){ 
  gpio_pin_set(dev_start, ADS124S08_START_PIN, STATE);
}
static void ads124s08_set_reset_pin(int STATE){ 
  gpio_pin_set(dev_reset, ADS124S08_RESET_PIN, STATE);
}



/* 
	Write ADC Values to Sensors Val Stict 
*/

static int ads124s08_channel_get(const struct device *dev,
			      enum sensor_channel chan,
			      struct sensor_value *val)
{
	
	struct ads124s08_data *ads124s08 = dev->data; 

	val->pData = ads124s08->sample.bytes; 

	return 0; 

} 


/*
	Convert internal temperate readings

*/ 

static void convert_internal_temp(const struct device *dev, uint32_t samp){ 

	struct ads124s08_data *ads124s08 = dev->data;


	double scaleFactor = (double)((VREF) / (ADS124S08_PGA_FACTOR * 8388608));  
	double voltage = scaleFactor * (double)samp; 

	ads124s08->cjv = voltage; 

	ads124s08->tempCj =  (((voltage - 129) / 403 ))  + 25;


}

/*
	Convert internal temperate readings

*/ 

static void convert_themocouple_temp(const struct device *dev, uint32_t samp){ 
	struct ads124s08_data *ads124s08 = dev->data;

	double scaleFactor = (double)((VREF) / (ADS124S08_PGA_FACTOR * 32768));  
	double voltage = scaleFactor * (double)samp ; 
		
	ads124s08->chanV = voltage; 

}


/* 	
	Read data from ADC Channels
*/ 

static uint32_t ads124s08_read_data(const struct device *dev){ 

	struct ads124s08_data *ads124s08 = dev->data;

	int status; 
	uint32_t samp; 

	uint8_t sample[RDATA_CMD_READ_BACK_LEN]; 

	status = ads124s08->hw_tf->read_samp(dev,&sample[0]); //send RDATA Command

	if(status < 0){ 
		LOG_ERR("Error. asd124s08_read_data(). Unable to fetch sample" ); 
		return 1; 
	} 

	samp = (uint32_t)(sample[0] << 16 | sample[1] << 8 | sample[2]);

	// record internal temp on every other interval 
	if (ads124s08->internalTempSetBit > 0 ){ 

		convert_internal_temp(dev, samp); 

	}else{ 

		convert_themocouple_temp(dev, samp); 
	
#if !(MODE_CHANNEL_READ_ONLY)
		if (ads124s08->cjv >0){
		
			DEBUG_LOG("ChanV: %dmV,   Internal V:%dmV, CJT:%d C,  V + VCJ: %dmV ", ads124s08->chanV,ads124s08->cjv,ads124s08->tempCj , ads124s08->chanV  + ads124s08->cjv); 
		}
#else 
	DEBUG_LOG("Raw: %x, %x, %x , Sample: %d, Voltage %dmV ", sample[0],sample[1], sample[2], samp, ads124s08->chanV ); 
#endif 
	}


	return 0; 

}


/*

When measuring the internal temperature sensor, the analog inputs are disconnected from the ADC and the
output voltage of the temperature sensor is routed to the ADC for measurement using the selected PGA gain,
data rate, and voltage reference. If enabled, PGA gain must be limited to 4 for the temperature sensor
measurement to remain within the allowed absolute input voltage range of the PGA. As a result of the low device
junction-to-PCB thermal resistance (RθJB), the internal device temperature closely tracks the printed circuit board
(PCB) temperature.

*/ 

static int ads124s08_toggle_internal_temp_settings(const struct device *dev){ 
	struct ads124s08_data *ads124s08 = dev->data;
	static uint8_t ctrl; 
	static uint8_t status; 


	k_sleep(K_MSEC(5)); 

	// Write ref Reg  
	ads124s08->internalTempSetBit ^= 0x1A;  // measures internal temp every other interupt
	ctrl = 0x10 | ads124s08->internalTempSetBit;  
	status = ads124s08->hw_tf->write_reg(dev,ADS124S08_REG_REF, ctrl);

	if (status < 0) {
		LOG_ERR("ads124s08_wreg_config(): Failed to write Ref Reg.\n");		
		return status;
	}


	status = ads124s08->hw_tf->read_reg(dev,ADS124S08_REG_SYS, &ctrl);

	if (status < 0) {
		LOG_ERR("ads124s08_wreg_config(): Failed to write Ref Reg.\n");		
		return status;
	}


	ctrl ^= 0x40;  //toggle the internal sensor reading

	status = ads124s08->hw_tf->write_reg(dev,ADS124S08_REG_SYS, ctrl);

	if (status < 0) {
		LOG_ERR("ads124s08_wreg_config(): Failed to write Ref Reg.\n");		
		return status;
	}

	status = ads124s08->hw_tf->read_reg(dev,ADS124S08_REG_PGA, &ctrl);

	if (status < 0) {
		LOG_ERR("ads124s08_wreg_config(): Failed to write Ref Reg.\n");		
		return status;
	}

	ctrl ^= 0x0A; // Enable PGA and set gain to 4 
	status = ads124s08->hw_tf->write_reg(dev,ADS124S08_REG_PGA, ctrl);

	if (status < 0) {
		LOG_ERR("ads124s08_wreg_config(): Failed to write Ref Reg.\n");		
		return status;
	}

	return 0;//ads124s08_reg_readout(dev); 

}


static int ads124s08_sample_fetch(const struct device *dev,
			       enum sensor_channel chan)
{

	struct ads124s08_data *ads124s08 = dev->data;
	uint32_t sample; 

#ifndef CONFIG_ADS124S08_TRIGGER

	ads124s08->drdyPinStatus =  nrf_gpio_pin_read(DRDY_PIN);

	if (ads124s08->drdyPinStatus == LOW){ 


		while (!nrf_gpio_pin_read(DRDY_PIN)){
			sample = ads124s08_read_data(dev); // read data from ADC
		}

		ads124s08->hw_tf->write_command(dev,ADS124S08_CMD_STOP ); 

		k_sleep(K_MSEC(5));

	#if !(MODE_CHANNEL_READ_ONLY)

		ads124s08_toggle_internal_temp_settings(dev); 
	#endif 
		k_sleep(K_MSEC(5));

		ads124s08->hw_tf->write_command(dev,ADS124S08_CMD_START ); 

		k_sleep(K_MSEC(5));
	}


#else 

	sample = ads124s08_read_data(dev); // read data from ADC

	k_sleep(K_MSEC(5)); 

	// ads124s08_set_internal_temp(dev); // switch to monitor internal temp

#endif 

	return 0; 
}

static const struct sensor_driver_api ads124s08_driver_api = {
#if CONFIG_ADS124S08_TRIGGER
	.trigger_set = ads124s08_trigger_set,
#endif
	.sample_fetch = ads124s08_sample_fetch,
	.channel_get = ads124s08_channel_get,
};



static int ads124s08_reg_readout(const struct device *dev){ 

	
	struct ads124s08_data *ads124s08 = dev->data; 

	uint8_t status; 

	static uint8_t value; 

	
	for ( int i =0; i < 18; i ++){ 

		status = ads124s08->hw_tf->read_reg(dev, i, &value); 

		if (status < 0){ 
			LOG_ERR("ads124s08_reg_readout. Unable to read reg: %x", i);

		}
		
		DEBUG_LOG("REG: %x , val %x", i, value); 
	}

}



static int ads124s08_reset(const struct device *dev){ 

#if ENABLE_SOFT_CONFIGS // software reset 

	struct ads124s08_data *ads124s08 = dev->data; 
	ctrl = ADS124S08_CMD_RESET;
	int status = ads124s08->hw_tf->write_command(dev, ctrl);
	if (status < 0){ 
		LOG_ERR("ads124s08_reset(). Unable to write reset command "); 
	}
#else // hardware reset 
	

  	ads124s08_set_reset_pin(HIGH); 
	k_sleep(K_MSEC(100)); 
	ads124s08_set_reset_pin(LOW);
	k_sleep(K_MSEC(100)); 
	ads124s08_set_reset_pin(HIGH);
	k_sleep(K_MSEC(100)); 
	
	  
#endif 
	return 0; 

}


static int ads124s08_wreg_config(const struct device *dev){ 

	struct ads124s08_data *ads124s08 = dev->data; 

	uint8_t ctrl; 
	int status; 

	// send wreg command to enable register writting 

	// write ID Reg -
	ctrl = 0x08; 
	status = ads124s08->hw_tf->write_reg(dev, ADS124S08_REG_ID,ctrl);

	if (status < 0) {
    	LOG_ERR("ads124s08_wreg_config(): Failed to write ID Reg.\n");		
		return status;
	}

	// // write Status Reg 
	ctrl = 0x80; 
	status = ads124s08->hw_tf->write_reg(dev, ADS124S08_REG_STATUS,ctrl);

	if (status < 0) {
    	LOG_ERR("ads124s08_wreg_config(): Failed to write ID Reg.\n");		
		return status;
	}
	
	// write MUX Reg set channel 2 as positive channel 4 as negative
	ctrl = 0x20 | 0x04; 
	status = ads124s08->hw_tf->write_reg(dev, ADS124S08_REG_INPMUX,ctrl);

	if (status < 0) {
    	LOG_ERR("ads124s08_wreg_config(): Failed to write MUX Reg.\n");		
		return status;
	}

	// Write PGA Reg  (cannot exceed gain of 4 or bit reg of (0x02) for internal temp readings)
	ctrl = 0x00 | ADS124S08_PGA_IDX; 
	status = ads124s08->hw_tf->write_reg(dev,ADS124S08_REG_PGA, ctrl);

	if (status < 0) {
    	LOG_ERR("ads124s08_wreg_config(): Failed to write PGA Reg.\n");		
		return status;
	}

	// Write data rate Reg  
	ctrl = 0x14 | SINGLE_SHOT_MODE_BIT; 
	status = ads124s08->hw_tf->write_reg(dev,ADS124S08_REG_DATARATE, ctrl);

	if (status < 0) {
    	LOG_ERR("ads124s08_wreg_config(): Failed to write  data rate Reg.\n");		
		return status;
	}

	// Write ref Reg  
	ctrl = 0x10; 
	status = ads124s08->hw_tf->write_reg(dev,ADS124S08_REG_REF, ctrl);

	if (status < 0) {
    	LOG_ERR("ads124s08_wreg_config(): Failed to write Ref Reg.\n");		
		return status;
	}

	// Write IDACMAG Reg  
	ctrl = 0x00; 
	status = ads124s08->hw_tf->write_reg(dev,ADS124S08_REG_IDACMAG, ctrl);

	if (status < 0) {
    	LOG_ERR("ads124s08_wreg_config(): Failed to write IDACMAG Reg.\n");		
		return status;
	}
	
	// Write IDACMUX Reg  
	ctrl = 0xFF; 
	status = ads124s08->hw_tf->write_reg(dev,ADS124S08_REG_IDACMUX, ctrl);

	if (status < 0) {
    	LOG_ERR("ads124s08_wreg_config(): Failed to write IDACMUX Reg.\n");		
		return status;
	}

	// Write ADS124S08_REG_SYS *4 bit samples, enable crc and send stat)
	ctrl = 0x10 ;// | 0x02 | 0x01; 
	status = ads124s08->hw_tf->write_reg(dev,ADS124S08_REG_SYS, ctrl);

	if (status < 0) {
    	LOG_ERR("ads124s08_wreg_config(): Failed to write IDACMUX Reg.\n");		
		return status;
	}

	// Write ADS124S08_REG_VBIAS For Thermocouples (Vbias AIN4 for now)
	ctrl = 0x00 | 0x10; 
	status = ads124s08->hw_tf->write_reg(dev,ADS124S08_REG_VBIAS, ctrl);

	if (status < 0) {
    	LOG_ERR("ads124s08_wreg_config(): Failed to write IDACMUX Reg.\n");		
		return status;
	}




#ifdef CONFIG_ADS124S08_TRIGGER
	
	status = ads124s08_init_interrupt(dev);
	if (status < 0) {
		LOG_ERR("Failed to initialize interrupts.");
		return status;
	}

#endif
	return ads124s08_reg_readout(dev); 
}


static int ads124s08_init(const struct device *dev)
{
	struct ads124s08_data *ads124s08 = dev->data;
	const struct ads124s08_config *cfg = dev->config;
	int status;
	uint8_t id; 
	
	ads124s08->bus = device_get_binding(cfg->bus_name);
	if (!ads124s08->bus) {
		LOG_ERR("master not found: %s", cfg->bus_name);
		return -EINVAL;
	}

	cfg->bus_init(dev);

	init_gpio(); 

	//Reset Device 
	status = ads124s08_reset(dev);

	if (status < 0){ 

		LOG_ERR("ads124s08_init(). Unable to reset device"); 
	} 


	status = ads124s08->hw_tf->read_reg(dev, ADS124S08_REG_ID, &id); 

	if (status < 0)
	{ 
		LOG_ERR("ads124s08_init. Unable to read reg: %x", ADS124S08_REG_ID);

	}
	else if (id != ADS124S08_CHIP_ID )
	{
		DEBUG_LOG("Unknown device with ID %x Detected on SPI bus", id); 
	}
	else
	{ 

		DEBUG_LOG("ADS124S08 Detected with ID: %x",id); 
	}
	

#if(INTERNAL_TEMP_TEST)

	ads124s08_toggle_internal_temp_settings(dev);

#else

	//config production registers 
	status = ads124s08_wreg_config(dev); 

	if ( status < 0){ 

		LOG_ERR("ads124s08_init(). Unable to write config registers"); 

	}

#endif

#if (HW_START)

	// toggle start pin 
	ads124s08_set_start_pin(HIGH); 
	k_sleep(K_MSEC(10)); 
	ads124s08_set_start_pin(LOW); 
	k_sleep(K_MSEC(10)); 
	ads124s08_set_start_pin(HIGH); 
#else


	ads124s08_set_start_pin(LOW); 
	k_sleep(K_MSEC(10)); 
	ads124s08->hw_tf->write_command(dev,ADS124S08_CMD_START ); 
	k_sleep(K_MSEC(10)); 
	ads124s08->hw_tf->write_command(dev,ADS124S08_CMD_STOP ); 
	k_sleep(K_MSEC(10)); 
	ads124s08->hw_tf->write_command(dev,ADS124S08_CMD_START ); 


#endif 


	return 0;
}



#if DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT) == 0
#warning "ADS124S08 driver enabled without any devices"
#endif
/*
 * Device creation macro, shared by ADS124S08_DEFINE_SPI() and
 */

#define ADS124S08_DEVICE_INIT(inst)					\
	DEVICE_DT_INST_DEFINE(inst,					\
			    ads124s08_init,				\
			    NULL,					\
			    &ads124s08_data_##inst,			\
			    &ads124s08_config_##inst,			\
			    POST_KERNEL,				\
			    CONFIG_SENSOR_INIT_PRIORITY,		\
			    &ads124s08_driver_api);

#define IS_LSM303AGR_DEV(inst) \
	DT_NODE_HAS_COMPAT(DT_DRV_INST(inst), st_lsm303agr_accel)

#define DISC_PULL_UP(inst) \
	DT_INST_PROP(inst, disconnect_sdo_sa0_pull_up)

/*
 * Instantiation macros used when a device is on a SPI bus.
 */

#define ADS124S08_HAS_CS(inst) DT_INST_SPI_DEV_HAS_CS_GPIOS(inst)

#define ADS124S08_DATA_SPI_CS(inst)					\
	{ .cs_ctrl = {							\
		.gpio_pin = DT_INST_SPI_DEV_CS_GPIOS_PIN(inst),		\
		.gpio_dt_flags = DT_INST_SPI_DEV_CS_GPIOS_FLAGS(inst),	\
		},							\
	}

#define ADS124S08_DATA_SPI(inst)						\
	COND_CODE_1(ADS124S08_HAS_CS(inst),				\
		    (ADS124S08_DATA_SPI_CS(inst)),				\
		    ({}))

#define ADS124S08_SPI_CS_PTR(inst)						\
	COND_CODE_1(ADS124S08_HAS_CS(inst),				\
		    (&(ads124s08_data_##inst.cs_ctrl)),			\
		    (NULL))

#define ADS124S08_SPI_CS_LABEL(inst)					\
	COND_CODE_1(ADS124S08_HAS_CS(inst),				\
		    (DT_INST_SPI_DEV_CS_GPIOS_LABEL(inst)), (NULL))

#define ADS124S08_SPI_CFG(inst)						\
	(&(struct ads124s08_spi_cfg) {					\
		.spi_conf = {						\
			.frequency =					\
				DT_INST_PROP(inst, spi_max_frequency),	\
			.operation = (SPI_WORD_SET(8) |			\
				      SPI_OP_MODE_MASTER |		\
				      SPI_MODE_CPHA ),			\
			.slave = DT_INST_REG_ADDR(inst),		\
			.cs = ADS124S08_SPI_CS_PTR(inst),			\
		},							\
		.cs_gpios_label = ADS124S08_SPI_CS_LABEL(inst),		\
	})

#ifdef CONFIG_ADS124S08_TRIGGER
#define GPIO_DT_SPEC_INST_GET_BY_IDX_COND(id, prop, idx)		\
	COND_CODE_1(DT_INST_PROP_HAS_IDX(id, prop, idx),		\
		    (GPIO_DT_SPEC_INST_GET_BY_IDX(id, prop, idx)),	\
		    ({.port = NULL, .pin = 0, .dt_flags = 0}))

#else
#define ADS124S08_CFG_INT(inst)
#endif /* CONFIG_ADS124S08_TRIGGER */

#define ADS124S08_CONFIG_SPI(inst)						\
	{								\
		.bus_name = DT_INST_BUS_LABEL(inst),			\
		.bus_init = ads124s08_spi_init,				\
		.bus_cfg = { .spi_cfg = ADS124S08_SPI_CFG(inst)	}, \
		ADS124S08_CFG_INT(inst)					\
	}

#define ADS124S08_DEFINE_SPI(inst)						\
	static struct ads124s08_data ads124s08_data_##inst =			\
		ADS124S08_DATA_SPI(inst);					\
	static const struct ads124s08_config ads124s08_config_##inst =	\
		ADS124S08_CONFIG_SPI(inst);				\
	ADS124S08_DEVICE_INIT(inst)

/*
 * Main instantiation macro. Use of COND_CODE_1() selects the right
 * bus-specific macro at preprocessor time.
 */

#define ADS124S08_DEFINE(inst)						\
	COND_CODE_1(DT_INST_ON_BUS(inst, spi),				\
		    (ADS124S08_DEFINE_SPI(inst)),				\
		    )

DT_INST_FOREACH_STATUS_OKAY(ADS124S08_DEFINE)

Ads124S08.h

#ifndef ZEPHYR_DRIVERS_SENSOR_ADS124S08_ADS124S08_H_
#define ZEPHYR_DRIVERS_SENSOR_ADS124S08_ADS124S08_H_


#include <kernel.h>
#include <device.h>
#include <sys/util.h>
#include <stdint.h>
#include <drivers/gpio.h>
#include <drivers/sensor.h>
#include <string.h>


#if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi)
#include <drivers/spi.h>
#endif


#define DEBUG_MODE (1)
#if(DEBUG_MODE)
	#define DEBUG_LOG LOG_INF 
#else
	#define DEBUG_LOG(...)
#endif

#define HIGH (0xFF)
#define LOW  (0x00)


#define MULTI_CHANNEL_READ (0) // read through every channel 
#define ENABLE_SOFT_CONFIGS (0)
#define HW_START (0) // Start through toggling START signal rater than sending start command
#define INTERNAL_TEMP_TEST (0)
#define MODE_CHANNEL_READ_ONLY (1) // Debug mode for reading channels, no internal measurment reading
#define PGA_GAIN_4 
#define VREF (2.5)




// #define SINGLE_SHOT_MODE

#if defined(SINGLE_SHOT_MODE)
	#define SINGLE_SHOT_MODE_BIT (0x20)
#else 
	#define SINGLE_SHOT_MODE_BIT (0x00)
#endif
// GPIO Pins

// #define ADS124S08_CS_LABEL	      DT_GPIO_LABEL(DT_ALIAS(gpiocus0), gpios)
// #define ADS124S08_CS_PIN	      DT_GPIO_PIN(DT_ALIAS(gpiocus0), gpios)
#define ADS124S08_RESET_LABEL 	  DT_GPIO_LABEL(DT_ALIAS(gpiocus1), gpios)
#define ADS124S08_RESET_PIN	      DT_GPIO_PIN(DT_ALIAS(gpiocus1), gpios)
#define ADS124S08_START_LABEL     DT_GPIO_LABEL(DT_ALIAS(gpiocus2), gpios)
#define ADS124S08_START_PIN	      DT_GPIO_PIN(DT_ALIAS(gpiocus2), gpios)


// Interrupt Pins
#if DT_INST_PROP_HAS_IDX(0, irq_gpios, 1)
/* INT1 is configured */
#define ADS124S08_INT1_GPIOS_PIN		DT_INST_GPIO_PIN_BY_IDX(0, irq_gpios, 0)
#define ADS124S08_INT1_GPIOS_FLAGS		DT_INST_GPIO_FLAGS_BY_IDX(0, irq_gpios, 0)
#define ADS124S08_INT1_GPIO_DEV_NAME	DT_INST_GPIO_LABEL_BY_IDX(0, irq_gpios, 0)
#else

#define ADS124S08_INT1_GPIOS_PIN		DT_INST_GPIO_PIN(0, irq_gpios)
#define ADS124S08_INT1_GPIOS_FLAGS		DT_INST_GPIO_FLAGS(0, irq_gpios)
#define ADS124S08_INT1_GPIO_DEV_NAME	DT_INST_GPIO_LABEL(0, irq_gpios)

#endif


#define DRDY_PIN (43)

#define RES (double)((double)VREF/pow(2,23))

// Commands 

#define ADS124S08_CMD_NOP	0x00
#define ADS124S08_CMD_WAKEUP	0x02
#define ADS124S08_CMD_PWRDWN	0x04
#define ADS124S08_CMD_RESET	0x06
#define ADS124S08_CMD_START	0x08
#define ADS124S08_CMD_STOP	0x0A
#define ADS124S08_CMD_SYOCAL	0x16
#define ADS124S08_CMD_SYGCAL	0x17
#define ADS124S08_CMD_SFOCAL	0x19
#define ADS124S08_CMD_RDATA	0x12
#define ADS124S08_CMD_RREG	0x20
#define ADS124S08_CMD_WREG	0x40

#define RDATA_CMD_READ_BACK_LEN (3)

// Registers 

#define ADS124S08_REG_ID 0x00
#define ADS124S08_REG_STATUS 0x01
#define ADS124S08_REG_INPMUX 0x02
#define ADS124S08_REG_PGA 0x03
#define ADS124S08_REG_DATARATE 0x04
#define ADS124S08_REG_REF 0x05
#define ADS124S08_REG_IDACMAG 0x06
#define ADS124S08_REG_IDACMUX 0x07
#define ADS124S08_REG_VBIAS 0x08
#define ADS124S08_REG_SYS 0x09
#define ADS124S08_REG_OFCAL0 0x0A
#define ADS124S08_REG_OFCAL1 0x0B
#define ADS124S08_REG_OFCAL2 0x0C
#define ADS124S08_REG_FSCAL0 0x0D
#define ADS124S08_REG_FSCAL1 0x0E
#define ADS124S08_REG_FSCAL2 0x0F
#define ADS124S08_REG_GPIODAT 0x10
#define ADS124S08_REG_GPIOCON 0x11


/* ADS124S0x common channels */
#define ADS124S08_AIN0		0x00
#define ADS124S08_AIN1		0x01
#define ADS124S08_AIN2		0x02
#define ADS124S08_AIN3		0x03
#define ADS124S08_AIN4		0x04
#define ADS124S08_AIN5		0x05
#define ADS124S08_AINCOM	0x0c
#define ADS124S08_AIN6		0x06
#define ADS124S08_AIN7		0x07
#define ADS124S08_AIN8		0x08
#define ADS124S08_AIN9		0x09
#define ADS124S08_AIN10		0x0a
#define ADS124S08_AIN11		0x0b
#define ADS124S08_MAX_CHANNELS	12

#define ADS124S08_POS_MUX_SHIFT	0x04
#define ADS124S08_INT_REF		0x09

#define ADS124S08_START_REG_MASK	0x1f
#define ADS124S08_NUM_BYTES_MASK	0x1f

#define ADS124S08_START_CONV	0x01
#define ADS124S08_STOP_CONV	0x00
#define ADS124S08_CHIP_ID 0x08 

#if defined(PGA_GAIN_1)
	#define ADS124S08_PGA_IDX		ADS_PGA_GAIN_1
	#define ADS124S08_PGA_FACTOR	1
#elif defined(PGA_GAIN_2)
	#define ADS124S08_PGA_IDX		ADS_PGA_GAIN_2
	#define ADS124S08_PGA_FACTOR	2
#elif defined(PGA_GAIN_4)
	#define ADS124S08_PGA_IDX		ADS_PGA_GAIN_4
	#define ADS124S08_PGA_FACTOR	4
#elif defined(PGA_GAIN_8)
	#define ADS124S08_PGA_IDX		ADS_PGA_GAIN_8
	#define ADS124S08_PGA_FACTOR	8
#elif defined(PGA_GAIN_16)
	#define ADS124S08_PGA_IDX		ADS_PGA_GAIN_16
	#define ADS124S08_PGA_FACTOR	16
#elif defined(PGA_GAIN_32)
	#define ADS124S08_PGA_IDX		ADS_PGA_GAIN_32
	#define ADS124S08_PGA_FACTOR	32
#elif defined(PGA_GAIN_64)
	#define ADS124S08_PGA_IDX		ADS_PGA_GAIN_64
	#define ADS124S08_PGA_FACTOR	64
#elif defined(PGA_GAIN_128)
	#define ADS124S08_PGA_IDX		ADS_PGA_GAIN_128
	#define ADS124S08_PGA_FACTOR	128
#endif


#define ADS_PGA_GAIN_1 0x00 
#define ADS_PGA_GAIN_2 0x01 
#define ADS_PGA_GAIN_4 0x02 
#define ADS_PGA_GAIN_8 0x03 
#define ADS_PGA_GAIN_16 0x04 
#define ADS_PGA_GAIN_32 0x05
#define ADS_PGA_GAIN_64 0x06
#define ADS_PGA_GAIN_128 0x07




#if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi)
struct ads124s08_spi_cfg {
	struct spi_config spi_conf;
	const char *cs_gpios_label;
};
#endif /* DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) */

union ads124s08_bus_cfg {

#if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi)
	const struct ads124s08_spi_cfg *spi_cfg;
#endif /* DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) */
};

struct ads124s08_config {
	const char *bus_name;
	int (*bus_init)(const struct device *dev);
	const union ads124s08_bus_cfg bus_cfg;
};

struct ads124s08_transfer_function {
	int (*read_reg)(const struct device *dev, uint8_t reg_addr,
			uint8_t *value);
	int (*write_reg)(const struct device *dev, uint8_t reg_addr,
			 uint8_t value);
	int (*read_samp)(const struct device *dev, uint8_t *value);
	int (*write_command)(const struct device *dev, uint8_t value);

};


union asd124s08_sample{ 
	uint8_t bytes[3];  
	uint32_t raw[1]; 
}; 

struct ads124s08_data {
	const struct device *bus;
	const struct ads124s08_transfer_function *hw_tf;
	union asd124s08_sample sample;
	uint8_t tempRecordings[18]; // 3 bytes per sample * 6 channels = 18 bytes
	double cjv; 
	double chanV; 
	double tempCj; 
	double tempTC; 
	uint8_t internalTempSetBit; 
	uint32_t drdyPinStatus; 

#ifdef CONFIG_ADS124S08_TRIGGER
	const struct device *dev;
	const struct device *gpio_int1; 
	struct gpio_callback gpio_int1_cb;
	
	sensor_trigger_handler_t handler_drdy;
	atomic_t trig_flags;
	enum sensor_channel chan_drdy;

#if defined(CONFIG_ADS124S08_TRIGGER_OWN_THREAD)
	K_KERNEL_STACK_MEMBER(thread_stack, CONFIG_ADS124S08_THREAD_STACK_SIZE);
	struct k_thread thread;
	struct k_sem gpio_sem;
#elif defined(CONFIG_ADS124S08_TRIGGER_GLOBAL_THREAD)
	struct k_work work;
#endif

#endif /* CONFIG_ADS124S08_TRIGGER */

#if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi)
	struct spi_cs_control cs_ctrl;
#endif /* DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) */
};


#ifdef CONFIG_ADS124S08_TRIGGER
int ads124s08_trigger_set(const struct device *dev,
		       const struct sensor_trigger *trig,
		       sensor_trigger_handler_t handler);

int ads124s08_init_interrupt(const struct device *dev);

#endif

int ads124s08_spi_init(const struct device *dev);

#endif 

如有任何帮助,我们将不胜感激。  

谢谢!  

马特  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Matt,您好!

    获取ADS124S08的24位输出代码并转换为十进制时,需要小心。  ADS124S08的输出是二进制2的补码,其中最重要的位决定符号。  如果位为'1',则值为负。  所以0xFFFF96有一个最重要的位作为'1',所以这个数字实际上是一个负值。

    正范围是0x0万到0x7FFFFFFF,其中0x7FFFFFFF是最大正值或838.8607万小数。  负值范围的最大负值范围为0x80万,0xFFFFFF实际上是-1个十进制数。  因此,当将24位ADC输出代码值转换为带符号的32位值时,您需要正确地对该值进行符号扩展,以正确地保留数字的符号。

    此致,

    Bob B

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bob,您好!  

    感谢您的回复。  

    我实施以下函数以签名扩展原始计数:  

    uint32_t sign_extend_24_32(uint32_t x) {
        const int bits = 24;
        uint32_t m = 1u << (bits - 1);
        return (x ^ m) - m;
    }
    
    
    uint32_t transform(uint8_t *sample) {
    	uint32_t val,val32; 
    	if (sample[0] & 0x80)
    		val = 0xff;
    
    	val = sample[0] << 16 | sample[1] <<8 | sample[2]; 
    
    	val32 = sign_extend_24_32(val); 
    
    	return val32; 
    }

    我仍获得与以前相同的值:  

    00>[00:00:00。ADS]<INF> ads124s08:55.13万 124S08检测到ID:8
    00>[00:00:00.ad] 55.2032万 <inf> ads124s08:reg: 0,val 8.
    00>[00:00:00:00.ad] 55.2124万 <inf> ads124s08:reg: 1, val 80
    00>[00:00:00.ad] 55.2185万 <inf> ads124s08:reg: 2,val 24.
    00>[00:00:00.ad] 55.2276万 <inf> ads124s08:reg: 3,val 3.
    00>[00:00:00.ad] 55.2337万 <inf> ads124s08:reg: 4,val 14.
    00>[00:00:00.ad] 55.2398万 <inf> ads124s08:reg: 5,val 15.
    00>[00:00:00.ad] 55.249万 <inf> ads124s08:reg: 6,val 0
    00>[00:00:00.ad] 55.2551万 <inf> ads124s08:reg: 7,val ff
    00>[00:00:00.ad] 55.2642万 <inf> ads124s08:reg: 8,val 10.
    00>[00:00:00.ad] 55.2703万 <inf> ads124s08:reg: 9,val 10.
    00>[00:00:00.ad] 55.2795万 <inf> ads124s08:reg: a,val 0
    00>[00:00:00.ad] 55.2856万 <inf> ads124s08:reg: b , val 0
    00>[00:00:00.ad] 55.2917万 <inf> ads124s08:reg: c,val 0
    00>[00:00:00.ad] 55.3009万 <inf> ads124s08:reg: d,val 0



    00>[00:00:15.mV] 50.8514万 <inf> ads124s08:原始:7F,ff,ff,样本:838.8607万,电压159mV
    00>[00:00:15.mV] 57.5347万 <inf> ads124s08:原始:7F,ff,ff,样本:838.8607万,电压159mV
    00>[00:00:15.mV] 64.2181万 <inf> ads124s08:原始:7F,ff,ff,样本:838.8607万,电压159mV
    00>[00:00:15.mV] 70.9014万 <inf> ads124s08:原始:7F,ff,ff,样本:838.8607万,电压159mV
    00>[00:00:15.mV] 77.5848万 <inf> ads124s08:原始:7F,ff,ff,样本:838.8607万,电压159mV
    00>[00:00:15.mV] 84.2681万 <inf> ads124s08:原始:7F,ff,ff,样本:838.8607万,电压159mV
    00>[00:00:15.mV] 90.9515万 <inf> ads124s08:原始:7F,ff,ff,样本:838.8607万,电压159mV
    00>[00:00:15.mV] 97.6348万 <inf> ads124s08:原始:7F,ff,ff,样本:838.8607万,电压159mV
    00>[00:00:16.mV] 4.3182万 <inf> ads124s08:原始:7F,ff,ff,样本:838.8607万,电压159mV
    00>[00:00:16.mV] 11.0015万 <inf> ads124s08:原始:7F,ff,ff,样本:838.8607万,电压159mV

    还有其他建议吗?  

    谢谢!  

    马特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Matt,您好!

    返回的ADC值是作为二进制2补码的带符号值,您正在尝试使用无符号数字进行操作。  我个人会保持签名的内容。  有多种方法可以执行符号扩展。  一种方法是将捕获的原始值存储为带符号整数。  将24位值向左偏移(<8),然后向右移(>>8)。  如果该值为负值,则移位会自动将带符号的值调整为正确的带符号小数等效值。

    也可以使用其他方法,例如检查最重要的位,然后如果'1'将0xFF0万添加到原始数字。  再次将该值保留为带符号的32位整数。

    此致,

    Bob B

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bob,您好!  

    我尝试了以下方法:  

    int32_t transform(uint8_t *sample) {
    
    	int32_t val32; 
    
    	val32 = (int8_t)sample[0]; 
    	val32 = (val32 << 8) | (int8_t)sample[1]; 
    	val32 = (val32 << 8) | (int8_t)sample[2]; 
    
    
    	val32 = val32 & 0x800000 ?  0xFF000000  | val32 : val32;
    
    	return val32 ; 
    }
    

    它产生了以下结果(注意,记录器不能显示浮点值,因此它们实际上小数小于零):  

    00>[00:00:00。ADS]<INF> ads124s08:73.6999万 124S08检测到ID:8
    00>[00:00:00.ad] 73.7762万 <inf> ads124s08:reg: 0,val 8.
    00>[00:00:00:00.ad] 73.7854万 <inf> ads124s08:reg: 1, val 80
    00>[00:00:00.ad] 73.7915万 <inf> ads124s08:reg: 2,val 24.
    00>[00:00:00.ad] 73.7976万 <inf> ads124s08:reg: 3,val 3.
    00>[00:00:00.ad] 73.8067万 <inf> ads124s08:reg: 4,val 14.
    00>[00:00:00.ad] 73.8128万 <inf> ads124s08:reg: 5,val 15.
    00>[00:00:00.ad] 73.822万 <inf> ads124s08:reg: 6,val 0
    00>[00:00:00.ad] 73.8281万 <inf> ads124s08:reg: 7,val ff
    00>[00:00:00.ad] 73.8372万 <inf> ads124s08:reg: 8,val 10.
    00>[00:00:00.ad] 73.8433万 <inf> ads124s08:reg: 9,val 10.
    00>[00:00:00.ad] 73.8525万 <inf> ads124s08:reg: a,val 0
    00>[00:00:00.ad] 73.8586万 <inf> ads124s08:reg: b , val 0
    00>[00:00:00.ad] 73.8647万 <inf> ads124s08:reg: c,val 0
    00>[00:00:00.ad] 73.8739万 <inf> ads124s08:reg: d,val 0


    00>[00:00:ff 00.738 ,ff,采样:-1,电压0mV。83.8012万 <inf> ads124s08:原始:7F,ff,ff,采样:-1,电压0mV
    00>[00:00:04.ADS] 90.4876万 <INF> ads124s08:原始:7F,ff,ff,样本:-1,电压0mV
    00>[00:00:04.ADS] 97.174万 <INF> ads124s08:原始:7F,ff,ff,样本:-1,电压0mV
    00>[00:00:05.inf] 3.8604万 <inf> ads124s08:原始:7F,ff,ff,样本:-1,电压0mV
    00>[00:00:05.inf] 10.5468万 <inf> ads124s08:原始:7F,ff,ff,样本:-1,电压0mV
    00>[00:00:05.inf] 17.2332万 <inf> ads124s08:原始:7F,ff,ff,样本:-1,电压0mV
    00>[00:00:05.inf] 23.9196万 <inf> ads124s08:原始:7F,ff,ff,样本:-1,电压0mV
    00>[00:00:05.inf] 30.603万 <inf> ads124s08:原始:7F,ff,ff,样本:-1,电压0mV
    00>[00:00:05.inf] 37.2863万 <inf> ads124s08:原始:7F,ff,ff,样本:-1,电压0mV
    00>[00:00:05.inf] 43.9697万 <inf> ads124s08:原始:7F,ff,ff,样本:-1,电压0mV

    原始值: 7F,FF,FF在我看来仍然不存在。 您是否发现寄存器配置有任何问题或我在读取 热电偶电压时遗漏了任何内容?  

    谢谢!  

    马特  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Matt,您好!

    0x7FFFF为正满刻度。  根据您选择的寄存器设置,参考输入为参考输入。  Ref1是RTD的IDAC派生参考,设置为0V。  请尝试选择内部参考。  尝试将寄存器5更改为0x1A。

    此致,

    Bob B

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bob,您好!  

    我做了你建议的更改,我得到了一些非常小的负值,因为ff,ff,51...原始计数。 看起来不太正确:  

    00>[00:00:02.ads124s08: 76.9744万 reg: 0 , val 8.
    00>[00:00:02.ads124s08: reg: 1, val 80.(76.9805万 :00:00:02.ads124s08:注册:1,val 80。
    00>[00:00:02.ads] 76.9866万 <inf> ads124s08: reg: 2, val 24.
    00>[00:00:02.ads124s08: 76.9958万 reg: 3, val 3.
    00>[00:00:02.ads] 77.0019万 <inf> ads124s08: reg: 4, val 14.
    00>[00:00:02.ads124s08: reg: 5, val 1a.(77.0111万 :00:00:02.ads124s08:注册:5,val 1a。
    00>[00:00:02.ads124s08: 77.0172万 reg: 6, val 0
    00>[00:00:02.ads] 77.0263万 <inf> ads124s08:reg: 7,val ff
    00>[00:00:02.ads] 77.0324万 <inf> ads124s08: reg: 8 , val 10.
    00>[00:00:02.ads124s08: 77.0416万 reg: 9, val 10.(注:00:00:02.ads]<inf>ads124s08: reg: 9,val 10.
    00>[00:00:02.ads124s08: 77.0477万 reg: a , val 0
    00>[00:00:02.ads124s08: 77.0538万 reg: b , val 0
    00>[00:00:02.ads124s08: 77.0629万 reg: c , val 0
    00>[00:00:02.ads124s08: 77.069万 reg: d , val 0


    00>[00:00:FF,54,采样:-172,电压0mV]<inf>ads124s08:原始:02.770 ,ff,84.5092万
    00>[00:00:07.ads124s08 91.1956万 :原始:FF,ff,51,样本:-175,电压0mV
    00>[00:00:07.ads124s08 97.879万 :原始:FF,ff,53,样本:-173,电压0mV
    00>[00:00:08.ads124s08] 4.5623万 <inf> ads124s08:原始:ff,ff,4c,样本:-180,电压0mV
    00>[00:00:08.ads124s08] 11.2457万 <inf> ads124s08:原始:ff,ff,50,样品:-176,电压0mV
    00>[00:00:08.ads124s08] 17.929万 <inf> ads124s08:原始:ff,ff,50,样品:-176,电压0mV
    00>[00:00:08.ads124s08] 24.6124万 <inf> ads124s08:原始:ff,ff,50,样品:-176,电压0mV
    00>[00:00:08.ads124s08] 31.2957万 <inf> ads124s08:原始:ff,ff,50,样品:-176,电压0mV

    还有其他建议吗?  

    感谢您的帮助,  

    马特  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Matt,您好!

    我不确定您的预期结果是什么。  K热电偶输出电压表基于特定的冷接点温度。  当热电偶连接到PCB时,会创建另一个热电偶。  因此,冷接点温度必须转换为电压,然后将电压添加到热电偶自身的ADC测量的电压中。

    我建议查看 热电偶测量基本指南中的信息。  本指南介绍了热电偶的工作原理,以及有关如何正确测量温度的详细信息和电路。

    此致,

    Bob B

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bob,您好!  

    我通读了该指南。 我的缩进结果应该更清楚一点。  

    因此,我使用带有AIN2/AIN4的ADS124S08 EVM作为K型 热电偶的输入,它在大约室温(25°C)下放置在我的桌面上。  

    根据将电压转换为摄氏度的指南,我必须执行以下操作:  

    1.收集通道电压,输入AIN2/AIN4的原始计数(24位2的补码输入),转换为电压

    2.收集CJC电压(我正在使用ADS124S08的内部温度执行此操作,我已确认它的测量温度大约为25摄氏度)  

    3.通过将CJC电压与通道电压相加,获得实际电压  

    4.在 K型转换表中查找产生的电压   

    执行这些步骤时,根据表,我看到大约0.32 V ~ 8°C。  

    用于CJC计算。 我正在执行以下操作:  

    Vcjc =(2.5 /(4 * 2^23)* 原始计数=~ 320mV

    Temp_CJC =((Vcjc- 129)/ 403uV)+ 25 =~ 25.4 C  

    如上所述,通道电压的计算如下所示:

    Vchan =(2.5 /(4 * 2^15))*原始计数=~- 0.0015 V,在我看来,这就是它的位置。  

    如果您发现任何错误,请告诉我。  

    谢谢!  

    马特  

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Matt,您好!

    我不确定你在哪里得到了你的Vchan等式。  如果增益为4,则根据LSB (代码),ADC输出电压为+/- Vref /(GAIN *2^24)或2.5V /(4*2^23)。  如果返回的代码为-175,则电压约为-13uV。

    从K表插入25.4 deg C时,电压约为1.0082mV,加上测得的热电偶电压-13uV (约为995.16uV)或 表中的24.9 deg C。

    此致,

    Bob B

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bob,您好!  

    我明白我的错误。 所以我应该反向查找内部温度传感器测量的电压到k表中以获得Vcjc,然后将其添加到测量的电压中。 这就是为什么比额表似乎没有了。  

    感谢你的帮助。  

    马特