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.

[参考译文] ADS1220:使用 ADS1220和 STM32H7测量 RTD Pt100 (通过 SPI 连接)

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1362529/ads1220-measure-of-rtd-pt100-with-ads1220-and-stm32h7-over-spi-connexion

器件型号:ADS1220

尊敬的 TI、尊敬的 Angel Rodriguez、

我们正在测试我在上一个问题[1]中提到的电路板 、以通过 RTD 3线 Pt100传感器使用 ADS1220测量精确温度。

1.原理图
在验证了 EVB 和连接到 Arduino MCU 的 cjmcu-1220后、我们使用此原理图。
ADS1220连接到 SPI 总线和 STM32H7 MCU、用于 MOSI/MISO/CK 和 CS/DRDY 通过 GPIO 扩展器连接。


GPIO 扩展器工作正常、我们可以通过配置寄存器的 SPI 与 ADS1220进行通信、并读取输出代码、不过接收到的数据似乎不正确、但硬件连接似乎正常工作

SPI 通信
SPI 线路上的探测似乎正确
D4=、D5=MISO、D6=MOSI、D7=CS


我们可以观察到传入的 MISO 数据、


软件配置
我们目前正在使用以下代码

#include <Adafruit_MCP23X17.h>
#include <Protocentral_ADS1220.h>
#include <SPI.h>
#include <atomic>

Adafruit_MCP23X17 mcp;

#define PGA          32                // Programmable Gain, confirm that the same as set_pga_gain
#define VREF         2.048            // Internal reference of 2.048V
#define VFSR         VREF/PGA
#define FULL_SCALE   (((long int)1<<23)-1)

#define ADS1220_CS_PIN    PIN_SPI_SS
#define ADS1220_DRDY_PIN  2

// #define NUM_ADS1220 8
#define NUM_ADS1220 1

SPISettings spi_settings(1000000, MSBFIRST, SPI_MODE1);
Protocentral_ADS1220 ads1220[NUM_ADS1220];
int32_t adc_data;
float ADS1220Temperature;

void setup()
{
    Serial.begin(115200);
    while (!Serial) ;

    delay(5000);

    Serial.println("Set up MCP23017");

    // if (!mcp.begin_I2C(0x20, &Wire2)) {
    if (!mcp.begin_I2C(0x20, &Wire2)) {
        Serial.println("Failed to initialize MCP23X17 device at 0x20");
    }
    for (size_t i = 0; i < 8; i++) {
        mcp.pinMode(7 - i, INPUT); // 7-0: port A, DRDY, INPUT
        mcp.pinMode(i + 8, OUTPUT); // 8-15: port B, CS, OUTPUT
    }
    for (size_t i = 0; i < 8; i++) {
        mcp.digitalWrite(i + 8, HIGH); // Set CS to HIGH
    }

    Serial.println("Set up ADS1220");

    SPI.begin();
    for (size_t i = 0; i < NUM_ADS1220; i++) {
        ads1220[i] = Protocentral_ADS1220(spi_settings);
        ads1220[i].begin(
            [i] (bool level) { mcp.digitalWrite(i + 8, level); },
            [i] () -> bool { return mcp.digitalRead(7 - i); }
        );

        ads1220[i].set_pga_gain(PGA_GAIN_1);
        ads1220[i].set_data_rate(DR_600SPS);
        ads1220[i].select_mux_channels(MUX_AIN0_AIN1);  //Configure for differential measurement between AIN0 and AIN1
        ads1220[i].set_VREF(VREF_REFP0);
        ads1220[i].set_IDAC_Current(IDAC_250);
        ads1220[i].set_IDAC2_Route(IDAC2_AIN0);
        ads1220[i].set_IDAC1_Route(IDAC1_AIN1);
        ads1220[i].PrintRegisterValues();

        ads1220[i].set_conv_mode_single_shot(); //Set Single shot mode
    }

    Serial.println("Start");
}

void loop()
{
    for (size_t i = 0; i < NUM_ADS1220; i++) {
        adc_data = ads1220[i].Read_SingleShot_WaitForData();
        Serial.print("\n\nADS1220 No.");
        Serial.print(i);
        Serial.print(" Diff (mV): ");
        Serial.print(convertToMilliV(adc_data));
        delay(500);

        // float temperature = readADS1220Temperature(i);
        // Serial.print("\nADS1220 No.");
        // Serial.print(i);
        // Serial.print(" Temperature in °C: ");
        // Serial.print(temperature);
        // delay(100);
    }
    delay(1000);
}

float convertToMilliV(int32_t i32data)
{
    return (float)((i32data*VFSR*1000)/FULL_SCALE);
}

float readADS1220Temperature(size_t i)
{
    ads1220[i].TemperatureSensorMode_enable();
    delay(50); // waiting time after register changed, for 20SPS
    float temperature = (ads1220[i].Read_Data_Samples() / 1000 * 0.03125); // In °C
    ads1220[i].TemperatureSensorMode_disable();
    delay(50); // waiting time after register changed, for 20SPS
    return temperature;
}


不过、我们会收到以下数据、

ADS1220 0号差分电压(mV):-1.47
读取:0xFFFD0D28 (-193240)

因此、我想知道电流寄存器配置是否正确以便为三线 RTD 测量检索正确的数据。

我的好!

Zabieru.


[1]: e2e.ti.com/.../ads1220-ads1220-spi-connection-to-stm32h7

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

    尊敬的 Angel Rodriguez:


    我希望你们做得好。 我们一侧的一些更新

    -我们在 ADS1220上连接了引脚
    AIN3/REFN1 <--> AIN0/REFP0
    有问题2          <--> AIN1
    参考 EVB 设计、
    -我们确实有更好的看我们接收到的输出数据(约~0x2BF66)

    不过、我们在 SPI 测量(10Hz 采样)中存在不稳定情况、某些值接近~0x2BF66、但也会导致更高/更低的值。
    我想知道 AIN 和 REF 引脚上是否缺失滤波器元件、但在测试 cjmcu-1220时、它能产生良好的结果。

    我怎么能解决这种不稳定性? 软件/硬件/寄存器设置?

    此致、
    Zabieru.

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

    尊敬的 Zabieru:

    很抱歉这么晚才回复。

    我将更深入地探讨这个问题、并很快与您联系。  

    此致、

    天使

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

    您好,Angel,

    部分更新、以重点介绍 PT100精确测量。

    供参考的是我们的原理图

    R= alone
    b/W=引脚到一起
    在 Pt100 3线 RTD 传感器上

    1.测量1V 差动工作正常
    我们能够准确测量 AIN0和 AIN1之间的差分电压为1V、并且能够在 SPI 链路上进行稳定测量

    在驱动器中按照以下配置插入3线 PT100时

    ADS1220_CONFIG0_PGA_ENABLE | ADS1220_CONFIG0_GAIN_1 | ADS1220_CONFIG0_MUX_AIN0_AIN1
    ADS1220_CONFIG1_BCS_OFF | ADS1220_CONFIG1_TS_DISABLED | ADS1220_CONFIG1_CM_SINGLE_SHOT |ADS1220_CONFIG1_MODE_NORMAL | ADS1220_CONFIG1_DR_45_SPS
    ADS1220_CONFIG2_IDAC_250UA | ADS1220_CONFIG2_PSW_OPEN | ADS1220_CONFIG2_FILTER_NONE | ADS1220_CONFIG2_VREF_EXTERNAL0
    ADS1220_CONFIG3_DRDYM_ONY_DRDY | ADS1220_CONFIG3_I1MUX_AIN2 | ADS1220_CONFIG3_I2MUX_AIN3

    我得到0xFExxxx 输出代码而不是0x2Bxxx (100欧姆参考值)

    可能我在配置中或线路中丢失了某些信息?

    此致、
    Zabieru.

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

    亲爱的天使,

    随着我们不断进步、但并未达到 ads1220能够提供的完美 OUTPUT_CODE 精度、因此会进行更多更新。
    进行一些位移修复后、平均输出代码为0x21A70 (78.87欧姆)、在几 ms 的采样平均值计算后、PT100已连接(使用 Yokogawa CA150输出理想100欧姆)、RTD 值为100欧姆。
    在某个位置、我们具有大约20欧姆的 Δ 值。
    它会在某个地方为你敲响钟吗? 我记得下面的配置

    ADS1220_CONFIG0_PGA_ENABLE | ADS1220_CONFIG0_GAIN_1 | ADS1220_CONFIG0_MUX_AIN1_AIN0;
    ADS1220_CONFIG1_BCS_OFF | ADS1220_CONFIG1_TS_DISABLED | ADS1220_CONFIG1_CM_CONTINUOUS|ADS1220_CONFIG1_MODE_NORMAL | ADS1220_CONFIG1_DR_20_SPS;
    ADS1220_CONFIG2_IDAC_250UA | ADS1220_CONFIG2_PSW_OPEN | ADS1220_CONFIG2_FILTER_BOTH | ADS1220_CONFIG2_VREF_EXTERNAL0;
    ADS1220_CONFIG3_DRDYM_ONY_DRDY | ADS1220_CONFIG3_I1MUX_AIN2 | ADS1220_CONFIG3_I2MUX_AIN3;

    我希望我能尽快完成这一修正,以便能够进行8个并联 ads1220的准确测试。

    此致、

    Zabieru.

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

    尊敬的 Zabieru:

    我已经浏览过这些信息、但不幸的是、我不太确定问题可能是什么。

    原理图/硬件连接似乎正常。

    我将向一些团队成员提出这个问题、以收集他们对该问题的反馈。 我将在我收集到一些反馈后尽快回复您、并将在明天向您通报最新情况。  

    很抱歉没能尽快解决这个问题。

    同时、您方面是否有任何更新?

    此致、

    天使

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

    尊敬的 Zabieru:

    此原理图是否有专为该设计的 PCB、或者此设置是否一起采用 Fly-Wire?  

    仔细观察一下、我们会注意到在原理图的输入引脚上没有抗混叠滤波、并且可能也会出现一些相当大的噪声问题。

    是否可以向我们提供设置的图片、以便我们更好地了解它的外观?

    此致、

    天使

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

    尊敬的 Zabieru:

    您是否曾尝试使用示波器测量 RTD 和基准电阻两端的电压? 当 IDAC 设置为250uA 时、基准电阻器两端的电压应约为1.2V、RTD 两端的电压应约为25mV、示波器还将允许您查看这些点是否存在任何明显的噪声。  

    如果您可以提供配置寄存器的输入和数据读数的逻辑分析仪/存储文件、以确保通信看起来正确、这可能也会有所帮助。  

    此致、

    天使