ADS1298: arduino 配合ads1298采集信号发热断连问题

Part Number: ADS1298

你好,我希望使用arduinonano配合ads1298做一个心电信号开发板,目前遇到的问题是刚测试时可以正常读写ads1298的寄存器,但收集不到ads1298的通道测试信号,过一小会nano发烫严重断开和电脑的连接,整个电路板的供电使用nano的3.3V输出。
发烫断开连接之后,把nano拔出来后可以继续和电脑连接了,之后继续插到电路板上,可以运行正常的点灯程序且不会发烫,但运行涉及与ads1298进行通信的程序就又会发烫断连,无法使用。我怀疑是与ads1298进行SPI通信时通信电流较大造成nano过载保护,但也找不到原因。

在nano只运行点灯程序的情况下,测得以下电压值VREFP=0
VREFN=0
VCAP1=0
测量VCAP2串联的1uF电容两边电压时电压值从1.2V开始往下掉
VCAP3=2.5V
VCAP4=0

这是我设计的电路板电路图,左边两个排母是插上ads1298模块,右边两个排母是插上arduino nano单片机电路板设计.pdf  

这是我使用的ads1298模块的电路图ads1298模块.pdf

这是我仅获取设备id采用的程序,仅运行此程序可以获得正确的设备ID0X92,但依旧会导致发烫短连,只把nano插到电路板上通电运行点灯程序并不会引起发烫,因此个人认为发烫原因应不是电路设计短路,与ads1298建立通信后就会导致nano逐渐发烫后与电脑断连,个人猜测问题在ads1298模块设计或ads1298本身,但苦寻无果,特寻求帮助!获取ads1298ID代码.txt 

  • 感谢您对TI产品的关注!
    已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • 可以考虑外部给ADS1298独立供电,避免 Nano 过载。

    或者降低SPI速率,减少通信时的电流峰值,进一步确定原因。

    另外可以检查一下硬件电路,焊接、隔离测试等,也是为了确定原理。

    官方也有开发板,可以参考

    ADS1298ECGFE-PDK 

  • 你好,我重新换了一块供电能力更强的nano单片机,解决了nano发烫断连的问题,但依然采集不到数据,按照官网给出这些引脚进行电压测量,测量结果完全正确,但DADY引脚的电压值一直是0.248V,我是想写一段代码将通道一设置为方波测试模式从而进行检测整个电路功能的实现,但运行代码之后,寄存器可以正常读写,但无法接收到通道1的电压,且ads1298的温度较高,比较烫手。TXT文件的代码是我进行测试的代码,望您给予指导,非常感谢!

    /**
     * ADS1298_TestMode_Fixed.ino
     * 
     * 功能:配置ADS1298为测试模式,输出2Hz方波,通过串口输出通道1的电压值(微伏)
     * 采用 SDATAC + RDATA 模式,避免RDATAC模式下寄存器读写冲突。
     * 包含详细的寄存器回读验证。
     * 
     * 硬件连接(与之前一致):
     *   DIN  -> D11 (MOSI)
     *   DOUT -> D12 (MISO)
     *   SCLK -> D13 (SCK)
     *   CS   -> D10
     *   DRDY -> D2 (中断)
     *   START-> D5
     *   RESET/PWDN -> D9 (共用)
     *   CLKSEL -> 3.3V
     * 
     * 配置:
     *   - 数据速率:250 SPS
     *   - PGA增益:6
     *   - 测试信号:2Hz方波,幅度±1mV
     *   - 关闭所有附加功能
     */
    
    #include <SPI.h>
    #include "ADS129X.h"
    
    // 引脚定义
    const int PIN_DRDY = 2;
    const int PIN_CS   = 10;
    const int PIN_START = 5;
    const int PIN_RESET_PWDN = 9;
    
    ADS129X ads(PIN_DRDY, PIN_CS);
    
    volatile long channelData[8];
    volatile boolean dataReady = false;
    
    const float VREF = 2.4;      // 内部基准2.4V
    const int GAIN = 6;
    const float LSB = VREF / (GAIN * 8388608.0);  // LSB 电压(伏特)
    
    void drdyInterrupt() {
      // 在SDATAC模式下,必须发送RDATA命令才能读取一个新样本
      if (ads.getData(channelData)) {   // 库函数内部应发送RDATA并读取数据
        dataReady = true;
      }
    }
    
    void setup() {
      Serial.begin(9600);
      while (!Serial);
    
      Serial.println(F("=== ADS1298 测试模式(修正版) ==="));
    
      // 复位芯片
      pinMode(PIN_RESET_PWDN, OUTPUT);
      pinMode(PIN_START, OUTPUT);
      digitalWrite(PIN_START, LOW);
      digitalWrite(PIN_RESET_PWDN, LOW);  // 复位/关断
      delay(200);                         // 确保电容充电
    
      digitalWrite(PIN_RESET_PWDN, HIGH); // 退出复位
      delay(200);                         // 等待内部振荡器稳定
    
      // 初始化SPI(低速确保稳定)
      SPI.begin();
      SPI.setDataMode(SPI_MODE1);
      SPI.setClockDivider(SPI_CLOCK_DIV64);  // 250kHz,安全速度
    
      // 步骤1:先发送SDATAC,退出连续读取模式(非常重要!)
      ads.SDATAC();
      delay(10);
    
      // 步骤2:验证设备ID
      byte id = ads.getDeviceId();
      Serial.print(F("设备ID: 0x"));
      Serial.println(id, HEX);
      if (id == 0x92) {
        Serial.println(F("检测到 ADS1298 (8通道)"));
      } else if (id == 0xD2) {
        Serial.println(F("检测到 ADS1298R (带呼吸)"));
      } else {
        Serial.println(F("未知设备,请检查连接!"));
        while (1);
      }
    
      // 步骤3:配置所有寄存器,并回读验证
      Serial.println(F("配置寄存器..."));
    
      // CONFIG1:HR模式,500SPS
      ads.WREG(ADS129X_REG_CONFIG1, 0x83);
      delay(10);
      byte val = ads.RREG(ADS129X_REG_CONFIG1);
      Serial.print(F("CONFIG1 = 0x")); Serial.print(val, HEX);
      Serial.println(val == 0x83 ? F(" (OK)") : F(" (ERROR)"));
    
      // CONFIG2:内部测试信号,2Hz,1倍幅度
      ads.WREG(ADS129X_REG_CONFIG2, 0x11);   // 0x12 = 0001 0010
      delay(10);
      val = ads.RREG(ADS129X_REG_CONFIG2);
      Serial.print(F("CONFIG2 = 0x")); Serial.print(val, HEX);
      Serial.println(val == 0x11 ? F(" (OK)") : F(" (ERROR)"));
    
      // CONFIG3:内部基准2.4V,关闭RLD等
      ads.WREG(ADS129X_REG_CONFIG3, 0xC0);   // 0xC0 = 1100 0000
      delay(10);
      val = ads.RREG(ADS129X_REG_CONFIG3);
      Serial.print(F("CONFIG3 = 0x")); Serial.print(val, HEX);
      Serial.println(val == 0xC0 ? F(" (OK)") : F(" (ERROR)"));
    
      // LOFF:关闭导联脱落
      ads.WREG(ADS129X_REG_LOFF, 0x00);
      delay(10);
      val = ads.RREG(ADS129X_REG_LOFF);
      Serial.print(F("LOFF = 0x")); Serial.print(val, HEX);
      Serial.println(val == 0x00 ? F(" (OK)") : F(" (ERROR)"));
    
      // 配置通道1:上电,增益6,MUX=测试信号
      ads.configChannel(1, false, ADS129X_GAIN_6X, ADS129X_MUX_TEST);
      delay(10);
      val = ads.RREG(ADS129X_REG_CH1SET);
      Serial.print(F("CH1SET = 0x")); Serial.print(val, HEX);
      // 期望值:0x05? 实际上 GAIN=000, MUX=101 -> 二进制 0 000 0 101 = 0x05
      Serial.println(val == 0x05 ? F(" (OK)") : F(" (ERROR)"));
    
      // 其他通道断电并短路输入
      for (int ch = 2; ch <= 8; ch++) {
        ads.configChannel(ch, true, ADS129X_GAIN_6X, ADS129X_MUX_SHORT);
      }
      // 可选:验证通道2设置为0x41? PD=1, GAIN=000, MUX=001 -> 1 000 0 001 = 0x81? 需要根据库实现确认,这里不强制
    
      // 关闭所有附加功能寄存器
      ads.WREG(ADS129X_REG_RLD_SENSP, 0x00);
      ads.WREG(ADS129X_REG_RLD_SENSN, 0x00);
      ads.WREG(ADS129X_REG_LOFF_SENSP, 0x00);
      ads.WREG(ADS129X_REG_LOFF_SENSN, 0x00);
      ads.WREG(ADS129X_REG_LOFF_FLIP, 0x00);
      ads.WREG(ADS129X_REG_PACE, 0x00);
      ads.WREG(ADS129X_REG_RESP, 0x00);
      ads.WREG(ADS129X_REG_CONFIG4, 0x00);
    
      // 步骤4:启动转换(保持SDATAC模式,后续通过RDATA读取)
      digitalWrite(PIN_START, HIGH);   // START置高,连续转换
      delay(1);
    
      // 步骤5:附加中断(下降沿触发)
      attachInterrupt(digitalPinToInterrupt(PIN_DRDY), drdyInterrupt, FALLING);
    
      Serial.println(F("配置完成,开始采集..."));
      Serial.println(F("时间(ms), 通道1电压(uV)"));
    }
    
    void loop() {
      if (dataReady) {
        noInterrupts();
        dataReady = false;
        interrupts();
    
        long raw = channelData[0];          // 通道1数据
        float voltage = raw * LSB * 1e6;    // 微伏
    
        Serial.print(millis());
        Serial.print(", ");
        Serial.println(voltage, 0);         // 输出整数微伏
      }
    }
    
    
    
    
    结果:
    === ADS1298 测试模式(修正版) ===
    设备ID: 0x92
    检测到 ADS1298 (8通道)
    配置寄存器...
    CONFIG1 = 0x83 (OK)
    CONFIG2 = 0x12 (OK)
    CONFIG3 = 0xC0 (OK)
    LOFF = 0x0 (OK)
    CH1SET = 0x5 (OK)
    配置完成,开始采集...
    时间(ms), 通道1电压(uV)
    

  • 关于数据采集问题,请重新发个帖子