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. 测量 RTD (电阻式温度检测器)值。 应用程序 AIN1和 AIN2 输入通道和配置 IDAC1和 IDAC2 对应的激励电流 1000 μA (1 mA)。 此外、我需要将数据速率设置为 600SPS (每秒采样数) .
我已经配置并验证了 SPI 通信以读取和写入寄存器、但我得到的 ADC 读数是 不稳定和不正确 、我认为这可能是由于 ADS1120寄存器的配置不正确。
以下是关键要求:
下面是有关配置 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)可能是个不错的选择
此致、
天使
尊敬的 Omkar:
此处显示了有关如何配置3线 RTD 的示例。
您如何布置 IDAC 以及您的测量通道是什么? 根据代码、似乎您已将 IDAC 设置为 AIN1和 AIN2、但 RTD 测量的多路复用器设置也是 AIN1-AIN2? 这是不可能的。
您是否阅读了应用手册?
此致、
天使