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.

[参考译文] ADS1120:连接 STM32

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1452665/ads1120-interfacing-with-stm32

器件型号:ADS1120

工具与软件:

我使用的是 ADS1120. 测量 RTD (电阻式温度检测器)值。 应用程序 AIN1和 AIN2 输入通道和配置 IDAC1和 IDAC2 对应的激励电流 1000 μA (1 mA)。 此外、我需要将数据速率设置为 600SPS (每秒采样数) .

我已经配置并验证了 SPI 通信以读取和写入寄存器、但我得到的 ADC 读数是 不稳定和不正确 、我认为这可能是由于 ADS1120寄存器的配置不正确。

以下是关键要求:

  1. AIN1和 AIN2 应配置为差分输入。
  2. IDAC1和 IDAC2 应将1000 μA 激励电流输出到 RTD 传感器。
  3. 数据速率 应设置为600SPS。
  4. 确保正确配置寄存器以实现稳定运行。

下面是有关配置 ADS1120和读取 ADC 值的代码片段。 我怀疑寄存器配置存在问题、如果能帮助调试该问题、我将不胜感激。

#include "stm32f4xx_hal.h"//对于 STM32环境
#include

#define ADS1120_CMD_WREG 0x40 //写入寄存器命令
#define ADS1120_CMD_RREG 0x20 //读取寄存器命令
#define ADS1120_CMD_START 0x08 //开始新的转换
#define ADS1120_CMD_RESET 0x06 //复位命令

#define ADS1120_CS_LOW () HAL_GPIO_WritePin (GPIOA、GPIO_PIN_4、GPIO_PIN_RESET)
#define ADS1120_CS_HIGH () HAL_GPIO_WritePin (GPIOA、GPIO_PIN_4、GPIO_PIN_SET)

// SPI 句柄(之前配置)
extern SPI_HandleTypeDef hspi3;

// ADS1120寄存器地址
#define CONFIG_REG_0 0x00
#define CONFIG_REG_1 0x01
#define CONFIG_REG_2 0x02
#define CONFIG_REG_3 0x03

//函数原型
空 ADS1120_Reset (void);
void ADS1120_Config (void);
uint16_t ADS1120_ReadData (void);
空 ADS1120_WriteRegister (uint8_t reg、uint8_t value);
uint8_t ADS1120_ReadRegister (uint8_t reg);

// ADS1120复位功能
空 ADS1120_Reset (void){
ADS1120_CS_LOW ();
HAL_SPI_TRANSMIT (&hspi3、(uint8_t[]){ADS1120_CMD_RESET}、1、HAL_MAX_DELAY);
HAL_DELAY (2);//等待 ADS1120复位完成
ADS1120_CS_HIGH ();
}

// ADS1120 Configuration 函数
void ADS1120_Config (void){
//配置寄存器0 (MUX、PGA 和数据速率)
// MUX:AIN1-AIN2 (差分)、PGA = 1、数据速率= 600SPS
uint8_t config0 = 0b00110010;// MUX[3:0]=0011、PGA=1x、DR=600SPS

//配置寄存器1 (模式、转换模式和温度传感器)
//模式=正常、转换模式=连续、启用 IDAC
uint8_t config1 = 0b00000010;// MODE =正常、CM =连续、TS =关闭、IDAC =启用

//配置寄存器2 (IDAC 电流)
// IDAC1和 IDAC2设置为1000 μA
uint8_t config2 = 0b00001100;// IDAC1和 IDAC2 = 1000 μA

//配置寄存器3 (IDAC 路由)
//将 IDAC1路由到 AIN1、将 IDAC2路由到 AIN2
uint8_t CONFIG3 = 0b00011011;// I1DIR=AIN1、I2DIR=AIN2

//写入 ADS1120寄存器
ADS1120_WriteRegister (CONFIG_REG_0、CONFIG0);
ADS1120_WriteRegister (CONFIG_REG_1、CONFIG1);
ADS1120_WriteRegister (CONFIG_REG_2、CONFIG2);
ADS1120_WriteRegister (CONFIG_REG_3、CONFIG3);
}

//此函数用于写入寄存器
void ADS1120_WriteRegister (uint8_t reg、uint8_t value){
uint8_t command = ADS1120_CMD_WREG |(reg & 0x03);//带寄存器地址的写入命令
ADS1120_CS_LOW ();
HAL_SPI_TRANSMIT (&hspi3、&COMMAND、1、HAL_MAX_DELAY);
HAL_SPI_TRANSMIT (&hspi3、&value、1、HAL_MAX_DELAY);
ADS1120_CS_HIGH ();
}

//从 ADC 读取数据的函数
uint16_t ADS1120_ReadData (void){
uint8_t 命令= ADS1120_CMD_START;//发送启动命令
uint8_t data[2]={0};
uint16_t adcResult = 0;

ADS1120_CS_LOW ();
HAL_SPI_TRANSMIT (&hspi3、&COMMAND、1、HAL_MAX_DELAY);
HAL_SPI_RECEIVE (&hspi3、DATA、2、HAL_MAX_DELAY);
ADS1120_CS_HIGH ();

//组合 MSB 和 LSB
adcResult =((uint16_t) data[0]<< 8)| data[1];
Return adcResult;
}

int main (void){
HAL_Init ();//初始化 HAL
//在此处配置外设、时钟、SPI 和 GPIO

ADS1120_Reset ();//复位 ADS1120
ADS1120_Config ();//配置 ADS1120

while (1){
uint16_t adcValue = ADS1120_ReadData ();
printf ("ADC 值:%u\n"、adcValue);
HAL_DELAY (100);//根据需要调整延迟
}
}

静态空 MX_SPI3_Init (void)

/*用户代码 begin SPI3_Init 0 */

/*用户代码 end SPI3_Init 0 */

/*用户代码 begin SPI3_Init 1 */

/*用户代码 end SPI3_Init 1 */
/* SPI3参数配置*/
hspi3.instance = SPI3;
hspi3.Init.Mode = SPI_MODE_MASTER;
hspi3.Init.direction = SPI_DIRECTION_2LINE;
hspi3.Init.DataSize = SPI_DATASIZE_16BIT;
hspi3.Init.CLKPolarity = SPI_POLARIT_LOW;
hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi3.Init.NSS = SPI_NSS_soft;
hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi3.Init.CRCPolynomial = 10;
if (HAL_SPI_Init (&H)(&H 3)!= HAL_OK)

Error_Handler ();
}
/*用户代码 begin SPI3_Init 2 */

/*用户代码 end SPI3_Init 2 */

}

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

    尊敬的 Omkar:

    您能否提供使用 ADS1120的 RTD 电路原理图?

    它是2线、3线还是4线 RTD?

    如何为 IDAC 布线?

    是否使用外部基准电阻进行比例式测量?

    此致、

    天使

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

    我使用内部基准。  

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

    尊敬的 Omkar:

    您能否提供图像而不是谷歌驱动链接?

    RTD 电路需要使用外部基准以及 IDAC 电流通过基准电阻器生成的基准电压、以进行比例式测量。 改用内部基准可能是 ADC 读数不稳定的原因。 下面是一个示例:

    查看以下应用手册以了解有关如何实现 RTD 电路的信息和示例: RTD 测量基本指南(修订版 A)可能是个不错的选择

    此致、

    天使

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

    我正在为我的应用使用3线 RTD。  

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

    尊敬的 Omkar:

    此处显示了有关如何配置3线 RTD 的示例。

    您如何布置 IDAC 以及您的测量通道是什么? 根据代码、似乎您已将 IDAC 设置为 AIN1和 AIN2、但 RTD 测量的多路复用器设置也是 AIN1-AIN2? 这是不可能的。

    您是否阅读了应用手册?

    此致、

    天使

x 出现错误。请重试或与管理员联系。