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.
尊敬的 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; }
我的好!
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、示波器还将允许您查看这些点是否存在任何明显的噪声。
如果您可以提供配置寄存器的输入和数据读数的逻辑分析仪/存储文件、以确保通信看起来正确、这可能也会有所帮助。
此致、
天使