/** * 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 #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)