尊敬的朋友:
我正在尝试实现 ADS1293数据表中提到的12导联 ECG 读数电路。 (请参阅数据表第67页)。
我能够读取引线1和引线2信号以及电路第二和第三 ADS 的通道2和通道3提供的信号。 但是、我无法从第2个和第3个 ADS 的第1个通道正确读取信号。 在12个导联中、我能够正确读取10个信号、并且我仅在其余2个信号中发现噪声。
实现的电路与数据表中提供的电路完全相似。 有人能帮我了解哪里出错了吗? 提前感谢您的帮助。
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.
尊敬的朋友:
我正在尝试实现 ADS1293数据表中提到的12导联 ECG 读数电路。 (请参阅数据表第67页)。
我能够读取引线1和引线2信号以及电路第二和第三 ADS 的通道2和通道3提供的信号。 但是、我无法从第2个和第3个 ADS 的第1个通道正确读取信号。 在12个导联中、我能够正确读取10个信号、并且我仅在其余2个信号中发现噪声。
实现的电路与数据表中提供的电路完全相似。 有人能帮我了解哪里出错了吗? 提前感谢您的帮助。
您好!
让我理解并重申您的问题:"无法从第2个和第3个 ADS 的第1个通道正确读取信号。"
您是否使用 ECG 模拟器?
V1-WCT 和 V4-WCT 导联的剂量? ECG 模拟器的 V 节点是否正常工作、尤其是那些您认为不正常的节点?
如果是、您是否已尝试将 V1和 V2电极/贴片放置到不同的节点 Vx?
您是否尝试过任何不同的增益设置?
当您说不正确时、您能否提供任何屏幕截图或图表来显示这意味着什么?
我想问您如何推断/调试这一观察结果、即第二个和第三个 ADS 的第一个通道不正确?
您是否在 第二个和第三个 ADS 的第一个通道上尝试过内部测试信号? 并了解它是如何产生的?
谢谢
尊敬的杨:
我已经尝试了一些仿真和测试、我要在这里连接相同的输出。
我在仿真器上选择了一个 ECG 波形、并连接了我获得的与信号相关的输出。 仅当我抑制第2和第3 ADS IC 的通道1的输出时、我才能够正确地绘制信号。

图1。 (输出时所有信号绘制在一起)

图2除 V1和 V2外的所有导联的输出

图3在 ECG 仿真器上 v1与 v2交换、v4与 v5交换时的输出

图例:
蓝色-导联1;红色-导联2;绿色- V2;黄色- V3;粉色- V5;灰色- V6
来自 ECG 模拟器的原始信号: 来自起始 V1、V2、V3、V4、V5和 V6的导联。

观察结果:即使交换了通道1和通道2的柔性寄存器值、通道2也能够显示正确的信号。 但是、在该测试中、在通道2信号上观察到一些额外的噪声。 在仿真器上进行物理交换时、通道2显示一个有效信号、该信号被馈送至通道1。
此外、还记录了每个 ADS 的错误寄存器、相应的值如下所示:
|
广告1: |
广告2: |
广告3: |
|
|
导联脱落检测错误 (0x18) |
0x00 |
0x00 |
0x00 |
|
错误状态 (0x19) |
0x00 |
0x10 |
0x10 |
|
错误范围1 (0x1A) |
0x34 |
0x40 |
0x40 |
|
错误范围2 (0x1B) |
0x34 |
0x14 |
0x14 |
|
错误范围3 (0x1C) |
0x00 |
0x00 |
0x00 |
|
错误同步 (0x1D) |
0x00 |
0x00 |
0x00 |
|
错误其他 (0x1E) |
0x03 |
0x02 |
0x02 |
请告诉我您可能需要的任何其他信息。 提前感谢您的帮助。
您好!
我看不到输出或屏幕截图。
当您说不正确时、您能否提供任何屏幕截图或图表来显示这意味着什么?
您是否尝试过任何不同的增益设置?
我想问您如何推断/调试这一观察结果、即第二个和第三个 ADS 的第一个通道不正确?
为了确认、ECG 仿真器可以正确输出 V1和 V4、对吧?
当您说 "是的、导联 V1-WCT 和 V4-WCT 导联有问题、我们正在使用 WhaleTec MECG 仿真器时、您会进一步澄清吗? 我们确实尝试将电极放在不同的节点上、我们获得了相同的结果。"
如果您将 V1和 V4从 ECG 模拟器连接到其他输入引脚、即已知良好的通道、该怎么办? 结果和结果如何?
您知道吗?一些 Vx 引线信号可能非常小? 如果有此选项、您是否尝试增大 ECG 模拟器的振幅?
您是否在 第二个和第三个 ADS 的第一个通道上尝试过内部测试信号? 并了解它是如何产生的?
谢谢。
您好!
感谢您的帮助。 建议逐一解决/解决问题/问题。
让我们从这个 "无法从第2个和第3个 ADS 的第1个通道正确读取信号"开始。
您是否可以尝试使用已知良好的 ECG 模拟器并仅向第2个和第3个 ADS 的第1个通道注入已知良好的信号、一次注入一个信号、然后查看结果如何?
您是否还可以尝试将第2个和第3个 ADS 的第1个通道配置为内部测试信号、一次读取/获取一个、并查看结果如何?
还有一个问题、"抑制 第二个和第三个 ADS 的第一个通道的输出"是什么意思?
谢谢
感谢您的回复。 对我的答复拖延表示歉意。 让我按顺序回复。
您是否可以尝试使用已知良好的 ECG 模拟器并仅向第2个和第3个 ADS 的第1个通道注入已知良好的信号、一次注入一个信号、然后查看结果如何?
我们是 WhaleTeq 的 MECG 2000 ECG 模拟器、我们仅注入正确的已知信号。 但是、根据您的建议、我们还没有尝试仅在第2个和第3个 ADS 的第1个通道中注入信号。 我们将在收到这些图后立即与您分享。 为了澄清这一点、我仍然需要将肢体导联信号应用到 IST ADS、以获得威尔逊的中心端子部分、以便测量胸导联。 我将仅从电路板上移除 V2、V3和 V5、V6信号。
您是否还可以尝试将第2个和第3个 ADS 的第1个通道配置为内部测试信号、一次读取/获取一个、并查看结果如何?
我们将尝试进行此操作并向您发送图解。 我们以前曾尝试过使用测试信号、但我们无法理解我们是否获得了正确的图、因此我们已经停止使用了一段时间。 如果可能、您可以向我们分享我们尝试获取测试信号时必须使用的寄存器配置吗? 谢谢你。
还有一个问题、"抑制 第二个和第三个 ADS 的第一个通道的输出"是什么意思?
通过"抑制输出"、我的意思是从代码注释掉这些值、以便将它们从图解中排除。 我在获得输出时编写了代码以绘制所有输出、并观察到、当绘图仪自行调整以在视图中分配信号时、很难看到其他信号的响应。 只有在绘图中未包含第2个和第3个 ADS 的通道1输出时、才能看到正确的输出。
请告诉我您是否需要更多信息。 我们将快速返回图。
谢谢你。
您好、Yang、
我想通知您、在尝试禁用导联脱落和起搏检测后、我发现许多寄存器值在设置过程中未分配、在设置过程中分配了垃圾值。 因此、在 IC 2和 IC3中、起搏信号检测寄存器(0x04)没有预期的0x00。 此外、在 IC2和 IC3的通道1输出中观察到的高输出。 然后、可以看到 AFE_SHUTDOWN_reg (0x14)正在关闭连接到 IC2和 IC3通道1的仪表放大器。 这就是 IC2和 IC3通道1根本不受影响的原因、即使存在信号是否被应用也是如此。 当在通道1上启用仪表放大器时、我们能够在 IC2和 IC3的通道1上看到数据。 我们已在相应的设置例程中应用了相关的更改。 我正在附加屏幕截图、其中所有八个信号(I、II、V1至 V6)都已正确记录在串行监视器中。

我们感谢您至今提供的支持。 我们还想提醒您、问题的根本原因是 IC 的寄存器不默认为其各自的默认值。 也许其他 ADS1293 IC 也会出现同样的问题。
谢谢、祝您愉快。
您好、Kushal、
您是问我还是问客户?
TI 拥有 ADS1293开发板(EVM)-
它使用 MSP430F5529IPN MCU。
我不能也不允许回答其他客户的问题。
谢谢
实际上、我们将 esp32与 Protocentral 的 ADS 1293开发板一起使用。 使用相同的开发板、我们能够通过 Arduino 获得 ECG 波形。 但是、当我们使用 ESP32时、我们无法获得正确的输出。 我已经测试了 SPI 通信。 它能够将数据读取和写入寄存器。
您能帮您解决这个问题吗?
我已经检查了值、如下所示:
0x12 =4
0x13=0
0x14=36
0x15=0
此外、我还获得了以下输出。

此外、这里是我要使用的代码。
//#include <SPI.h>
/*
Simplest 3-Lead 24-bit ECG with an ads1293 and esp32
SPI conection:
ads1293 Esp32 Pico
DRDYB D4
SDO D12 (slave out - master in )
SDI D13 (slave in - master out)
SCLK D14
CSB D15
ALARMB D2
*/
// #include "Plotter.h"
// Plotter p;
#include <SPI.h>
SPIClass * vspi = NULL;
//SPIClass vspi(VSPI);
static const int spiClk = 1000000; // 1 MHz
const int pin_DRDYB = 4; // data ready
const int pin_ALARMB = 2; // alarm
const int pin_MISO = 19; // MISO
const int pin_MOSI = 23; // MOSI
const int pin_SCLK = 18; // SCLK
const int pin_SS = 5; // CSB
int32_t c1;
int32_t c2;
int32_t c3;
double cd1;
double cd2;
double cd3;
int32_t getValFromChannel(int channel)
{
byte x1;
byte x2;
byte x3;
switch (channel)
{
case 1:
x1 = 0x37;
x2 = 0x38;
x3 = 0x39;
break;
case 2:
x1 = 0x3A;
x2 = 0x3B;
x3 = 0x3C;
break;
case 3:
x1 = 0x3D;
x2 = 0x3E;
x3 = 0x3F;
break;
}
int32_t val;
// 3 8-bit registers combination on a 24 bit number
val = readRegister(x1);
//Serial.println(readRegister(x1));
val = (val << 8) | readRegister(x2);
//Serial.println(readRegister(x2));
val = (val << 8) | readRegister(x3);
//Serial.println(readRegister(x3));
// delay(1000);
//val = val << 8;
//val = (int32_t) (val);
return val;
}
void setup_ECG_2_channel()
{
// datasheet ads1293
//Follow the next steps to configure the device for this example, starting from default registers values.
//1. Set address 0x01 = 0x11: Connect channel 1’s INP to IN2 and INN to IN1.
writeRegister(0x01, 0x11);
//2. Set address 0x02 = 0x19: Connect channel 2’s INP to IN3 and INN to IN1.
writeRegister(0x02, 0x19);
//3. Set address 0x0A = 0x07: Enable the common-mode detector on input pins IN1, IN2 and IN3.
writeRegister(0x05, 0x00);
writeRegister(0x0A, 0x07);
//4. Set address 0x0C = 0x04: Connect the output of the RLD amplifier internally to pin IN4.
writeRegister(0x0C, 0x04);
//5. Set address 0x12 = 0x04: Use external crystal and feed the internal oscillator's output to the digital.
writeRegister(0x12, 0x04);
//6. Set address 0x14 = 0x24: Shuts down unused channel 3’s signal path.
writeRegister(0x14, 0x24);
//7. Set address 0x21 = 0x02: Configures the R2 decimation rate as 5 for all channels.
writeRegister(0x21, 0x02);
//8. Set address 0x22 = 0x02: Configures the R3 decimation rate as 6 for channel 1.
writeRegister(0x22, 0x02);
//9. Set address 0x23 = 0x02: Configures the R3 decimation rate as 6 for channel 2.
writeRegister(0x23, 0x02);
//10. Set address 0x27 = 0x08: Configures the DRDYB source to channel 1 ECG (or fastest channel).
writeRegister(0x27, 0x08);
//11. Set address 0x2F = 0x30: Enables channel 1 ECG and channel 2 ECG for loop read-back mode.
writeRegister(0x2F, 0x30);
//12. Set address 0x00 = 0x01: Starts data conversion.
writeRegister(0x00, 0x01);
}
void setup_ECG_3_channel()
{
// datasheet ads1293
//Follow the next steps to configure the device for this example, starting from default registers values.
//1. Set address 0x01 = 0x11: Connect channel 1’s INP to IN2 and INN to IN1.
writeRegister(0x01, 0x11);
//2. Set address 0x02 = 0x19: Connect channel 2’s INP to IN3 and INN to IN1.
writeRegister(0x02, 0x19);
writeRegister(0x03, 0x2E); //diff
//3. Set address 0x0A = 0x07: Enable the common-mode detector on input pins IN1, IN2 and IN3.
writeRegister(0x0A, 0x07);
//4. Set address 0x0C = 0x04: Connect the output of the RLD amplifier internally to pin IN4.
writeRegister(0x0C, 0x04);
writeRegister(0x0D, 0x01); //diff
writeRegister(0x0E, 0x02); //diff
writeRegister(0x0F, 0x03); //diff
writeRegister(0x10, 0x01); //diff
//5. Set address 0x12 = 0x04: Use external crystal and feed the internal oscillator's output to the digital.
writeRegister(0x12, 0x04);
// //6. Set address 0x14 = 0x24: Shuts down unused channel 3’s signal path.
// writeRegister(0x14, 0x24);
//7. Set address 0x21 = 0x02: Configures the R2 decimation rate as 5 for all channels.
writeRegister(0x21, 0x02);
//8. Set address 0x22 = 0x02: Configures the R3 decimation rate as 6 for channel 1.
writeRegister(0x22, 0x02);
//9. Set address 0x23 = 0x02: Configures the R3 decimation rate as 6 for channel 2.
writeRegister(0x23, 0x02);
writeRegister(0x24, 0x02); //diff
//10. Set address 0x27 = 0x08: Configures the DRDYB source to channel 1 ECG (or fastest channel).
writeRegister(0x27, 0x08);
//11. Set address 0x2F = 0x30: Enables channel 1 ECG and channel 2 ECG for loop read-back mode.
writeRegister(0x2F, 0x70); //diff
//12. Set address 0x00 = 0x01: Starts data conversion.
writeRegister(0x00, 0x01);
}
//===========SPECIALIZED SPI OPTION 1
byte readRegister(byte reg)
{
byte data;
reg |= 1 << 7;
vspi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0));
digitalWrite(vspi->pinSS(), LOW);
vspi->transfer(reg);
data = vspi->transfer(0);
digitalWrite(vspi->pinSS(), HIGH);
vspi->endTransaction();
return data;
}
void writeRegister(byte reg, byte data)
{
reg &= ~(1 << 7);
vspi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0));
digitalWrite(vspi->pinSS(), LOW);
vspi->transfer(reg);
vspi->transfer(data);
digitalWrite(vspi->pinSS(), HIGH);
vspi->endTransaction();
}
//===========SPECIALIZED SPI
void setup()
{
vspi = new SPIClass(VSPI);
vspi->begin();
//vspi->begin(pin_SCLK, pin_MISO, pin_MOSI, pin_SS);
pinMode(pin_DRDYB, INPUT);
pinMode(pin_ALARMB, INPUT);
pinMode(pin_SS, OUTPUT);
pinMode(vspi->pinSS(), OUTPUT);
Serial.begin(115200);
//SPI.begin();
// Wire.begin(25,22);
//vspi->setClockDivider (SPI_CLOCK_DIV16);
//vspi->setBitOrder (MSBFIRST);
//vspi->setDataMode (SPI_MODE0);
//option 1: use vspi specific spi channel
//vspi.begin(pin_SCLK, pin_MISO, pin_MOSI, pin_SS);
//option 2: use default spi class methods
//SPI.begin(pin_SCLK, pin_MISO, pin_MOSI, pin_SS);
setup_ECG_2_channel();
int i = 0x00;
while(i <= 0x3F)
{
Serial.println(i);
Serial.println(readRegister(i));
i++;
}
// Serial.println(readRegister(0x01));
// Serial.println(readRegister(0x02));
// Serial.println(readRegister(0x03));
// Serial.println(readRegister(0x04));
// Serial.println(readRegister(0x05));
// Serial.println(readRegister(0x06));
// Serial.println(readRegister(0x07));
// Serial.println(readRegister(0x08));
// Serial.println(readRegister(0x09));
// Serial.println(readRegister(0x0A));
// Serial.println(readRegister(0x0B));
// Serial.println(readRegister(0x0C));
// Serial.println(readRegister(0x0D));
// Serial.println(readRegister(0x0E));
// Serial.println(readRegister(0x0F));
// Serial.println(readRegister(0x10));
// Serial.println(readRegister(0x11));
// Serial.println(readRegister(0x12));
// Serial.println(readRegister(0x13));
// Serial.println(readRegister(0x14));
// Serial.println(readRegister(0x15));
// Serial.println(readRegister(0x16));
// Serial.println(readRegister(0x17));
// Serial.println(readRegister(0x18));
// Serial.println(readRegister(0x19));
// Serial.println(readRegister(0x1A));
// Serial.println(readRegister(0x1B));
// Serial.println(readRegister(0x1C));
// Serial.println(readRegister(0x1D));
// Serial.println(readRegister(0x1E));
// Serial.println(readRegister(0x1F));
// Serial.println(readRegister(0x20));
// Serial.println(readRegister(0x21));
// Serial.println(readRegister(0x22));
// Serial.println(readRegister(0x23));
// Serial.println(readRegister(0x24));
// Serial.println(readRegister(0x25));
// Serial.println(readRegister(0x26));
// Serial.println(readRegister(0x27));
// Serial.println(readRegister(0x28));
// Serial.println(readRegister(0x29));
// Serial.println(readRegister(0x2A));
// Serial.println(readRegister(0x2B));
// Serial.println(readRegister(0x2C));
// Serial.println(readRegister(0x2D));
// Serial.println(readRegister(0x2E));
// Serial.println(readRegister(0x2F));
// Serial.println(readRegister(0x30));
// Serial.println(readRegister(0x31));
// Serial.println(readRegister(0x32));
// Serial.println(readRegister(0x33));
// Serial.println(readRegister(0x34));
// Serial.println(readRegister(0x35));
// Serial.println(readRegister(0x36));
// Serial.println(readRegister(0x37));
// Serial.println(readRegister(0x38));
// Serial.println(readRegister(0x39));
// Serial.println(readRegister(0x3A));
// Serial.println(readRegister(0x3B));
// Serial.println(readRegister(0x3C));
// Serial.println(readRegister(0x3D));
// Serial.println(readRegister(0x3E));
// Serial.println(readRegister(0x3F));
// Serial.println(readRegister(0x40));
// Serial.println(readRegister(0x50));
delay(1000000);
//setup_ECG_2_channel();
// p.Begin();
// p.AddTimeGraph("3 channel graph", 1000, "c1 label", cd1, "c2 label", cd2, "c3 label", cd3);
}
void loop()
{
// if (digitalRead(pin_ALARMB) == false)
// {
// Serial.println("alarm raised");
// }
if (digitalRead(pin_DRDYB) == false)
{
// sampled data is located at 3 8-bit
//--CHANNEL 1
c1 = getValFromChannel(1);
// cd1 = (double)c1;
Serial.print(c1);
Serial.print(",");
//--CHANNEL 2
c2 = getValFromChannel(2);
// cd2 = (double)c2;
Serial.print(c2);
Serial.print(",");
//--CHANNEL 3
c3 = getValFromChannel(3);
// cd3 = (double)c3;
Serial.println(c3);
// p.Plot();
}
delay(100); //20ms delay
}