- 管理员1
// ============================================================ // ADS1243 4通道差分轮询读取 - Arduino Nano // 硬件: CS 接地, PDWN 接 VDD // 通道定义: // 通道0: AIN0(+) / AIN1(-) // 通道1: AIN2(+) / AIN3(-) // 通道2: AIN4(+) / AIN5(-) // 通道3: AIN6(+) / AIN7(-) // ============================================================ #include <SPI.h> // ---------- 硬件引脚定义 ---------- const int PIN_DRDY = 9; // 数据就绪(低电平有效) const int PIN_LED = 13; // 板载 LED // ---------- 基准电压设置 (请用万用表实测后修改) ---------- // 如果 VREF+ 和 VREF- 之间是 2.5V,则填 2.5;如果是 1.25V,则填 1.25 const float VREF_VALUE = 2.5; // SPI 设置: 250kHz, MSB先传, 模式1 SPISettings spiSettings(250000, MSBFIRST, SPI_MODE1); // ---------- 命令宏定义 ---------- #define RDATA 0x01 #define RREG 0x10 #define WREG 0x50 #define RESET 0xFE // ---------- 寄存器地址 ---------- #define SETUP 0x00 #define MUX 0x01 #define ACR 0x02 // ---------- 增益定义 (需左移至 Bit 6-4) ---------- #define GAIN_1 (0x00 << 4) // 0x00 #define GAIN_2 (0x01 << 4) // 0x10 #define GAIN_4 (0x02 << 4) // 0x20 #define GAIN_8 (0x03 << 4) // 0x30 #define GAIN_16 (0x04 << 4) // 0x40 #define GAIN_32 (0x05 << 4) // 0x50 #define GAIN_64 (0x06 << 4) // 0x60 #define GAIN_128 (0x07 << 4) // 0x70 // 定义4个差分通道的 MUX 配置值 (高4位为正端,低4位为负端) const uint8_t CH_CONFIG[4] = { (0 << 4) | 1, // 通道0: AIN0(+), AIN1(-) (2 << 4) | 3, // 通道1: AIN2(+), AIN3(-) (4 << 4) | 5, // 通道2: AIN4(+), AIN5(-) (6 << 4) | 7 // 通道3: AIN6(+), AIN7(-) }; // ============================================================ // 等待 DRDY 变低(数据就绪) // ============================================================ bool waitDrdy(unsigned long timeout_ms = 1000) { unsigned long t0 = millis(); while (digitalRead(PIN_DRDY) == HIGH) { if (millis() - t0 > timeout_ms) return false; } return true; } // ============================================================ // 写寄存器 // ============================================================ void writeReg(uint8_t reg, uint8_t val) { if (!waitDrdy()) return; SPI.beginTransaction(spiSettings); SPI.transfer(WREG | reg); // 写命令 + 寄存器地址 SPI.transfer(0x00); // 写1个寄存器 (n-1) SPI.transfer(val); SPI.endTransaction(); } // ============================================================ // 读寄存器 (本代码中未直接调用,但保留用于调试) // ============================================================ uint8_t readReg(uint8_t reg) { if (!waitDrdy()) return 0xFF; SPI.beginTransaction(spiSettings); SPI.transfer(RREG | reg); // 读命令 + 寄存器地址 SPI.transfer(0x00); // 读1个寄存器 (n-1) uint8_t v = SPI.transfer(0xFF); SPI.endTransaction(); return v; } // ============================================================ // 读取 ADC 数据(24位有符号) // ============================================================ int32_t readADC() { if (!waitDrdy()) return 0; SPI.beginTransaction(spiSettings); SPI.transfer(RDATA); delayMicroseconds(10); // t6 等待 uint32_t raw = 0; raw |= (uint32_t)SPI.transfer(0xFF) << 16; raw |= (uint32_t)SPI.transfer(0xFF) << 8; raw |= (uint32_t)SPI.transfer(0xFF); SPI.endTransaction(); // 24位有符号扩展 return (int32_t)(raw << 8) >> 8; } // ============================================================ // 设置通道和增益 (此处仅写 MUX) // ============================================================ void setChannel(uint8_t muxConfig, uint8_t gain) { // 1. 设置 MUX 寄存器,切换通道 writeReg(MUX, muxConfig); // 2. 设置 SETUP 寄存器 (增益) writeReg(SETUP, gain); } // ============================================================ // 初始化 // ============================================================ void setup() { pinMode(PIN_DRDY, INPUT); pinMode(PIN_LED, OUTPUT); pinMode(10, OUTPUT); // SS 必须设为输出 SPI.begin(); Serial.begin(115200); // 复位 SPI.beginTransaction(spiSettings); SPI.transfer(RESET); SPI.endTransaction(); delay(50); // 配置 ACR: 双极性 + 缓冲器 + 15SPS + 基准选择 // 0x54: 内部基准。若需外部2.5V基准,改为 0x44 writeReg(ACR, 0x54); // 设置初始增益为 1 (GAIN_1) writeReg(SETUP, GAIN_1); Serial.println("ADS1243 4-Channel Ready"); Serial.println("CH0: AIN0-AIN1 | CH1: AIN2-AIN3 | CH2: AIN4-AIN5 | CH3: AIN6-AIN7"); Serial.println("=========================================="); } // ============================================================ // 主循环 // ============================================================ void loop() { int32_t adcValues[4]; float voltages[4]; // 轮流读取4个通道 for (int i = 0; i < 4; i++) { // 1. 切换到通道 i setChannel(CH_CONFIG[i], GAIN_1); // 2. 等待通道切换稳定 // 在 15SPS 下,一次转换约 66ms。为了保证 PGA 稳定,这里延时 150ms // 如果您发现数据响应太慢,可以尝试减小这个延时 delay(150); // 3. 读取 ADC 值 adcValues[i] = readADC(); // 4. 换算为电压 // 公式: V = (原始值 * VREF) / (2^23 - 1) (差分模式下) voltages[i] = (adcValues[i] * VREF_VALUE) / 8388607.0; } // 打印结果 Serial.print("CH0: "); Serial.print(voltages[0], 6); Serial.print(" V | CH1: "); Serial.print(voltages[1], 6); Serial.print(" V | CH2: "); Serial.print(voltages[2], 6); Serial.print(" V | CH3: "); Serial.print(voltages[3], 6); Serial.println(" V"); // 如果要调试原始 ADC 值,可以取消下面这行的注释 // Serial.print("Raw: "); Serial.print(adcValues[0]); Serial.print(", "); Serial.print(adcValues[1]); Serial.print(", "); Serial.print(adcValues[2]); Serial.print(", "); Serial.println(adcValues[3]); delay(500); }主楼 - 管理员1
四通道ok
- 管理员1
// ============================================================ // ADS1243 4通道差分轮询读取 - Arduino Nano // 硬件: CS 接地, PDWN 接 VDD, 外部 2.5V 基准 // 通道: CH0=AIN0-AIN1, CH1=AIN2-AIN3, CH2=AIN4-AIN5, CH3=AIN6-AIN7 // ============================================================ #include <SPI.h> const int PIN_DRDY = 9; const float VREF_VALUE = 2.5; SPISettings spiSettings(250000, MSBFIRST, SPI_MODE1); #define RDATA 0x01 #define RREG 0x10 #define WREG 0x50 #define RESET 0xFE #define SETUP 0x00 #define MUX 0x01 #define ACR 0x02 #define GAIN_1 (0x00 << 4) const uint8_t CH_CONFIG[4] = { (0 << 4) | 1, // AIN0(+), AIN1(-) (2 << 4) | 3, // AIN2(+), AIN3(-) (4 << 4) | 5, // AIN4(+), AIN5(-) (6 << 4) | 7 // AIN6(+), AIN7(-) }; // 等 DRDY 变低 bool waitDrdy(unsigned long timeout_ms = 1000) { unsigned long t0 = millis(); while (digitalRead(PIN_DRDY) == HIGH) if (millis() - t0 > timeout_ms) return false; return true; } // 写寄存器(保留 waitDrdy,用于对齐时序) void writeReg(uint8_t reg, uint8_t val) { if (!waitDrdy()) return; SPI.beginTransaction(spiSettings); SPI.transfer(WREG | reg); SPI.transfer(0x00); SPI.transfer(val); SPI.endTransaction(); } // 读 ADC(24位有符号) int32_t readADC() { if (!waitDrdy()) return 0; SPI.beginTransaction(spiSettings); SPI.transfer(RDATA); delayMicroseconds(10); uint32_t raw = 0; raw |= (uint32_t)SPI.transfer(0xFF) << 16; raw |= (uint32_t)SPI.transfer(0xFF) << 8; raw |= (uint32_t)SPI.transfer(0xFF); SPI.endTransaction(); return (int32_t)(raw << 8) >> 8; } // 切换通道 + 增益 void setChannel(uint8_t muxConfig, uint8_t gain) { writeReg(MUX, muxConfig); writeReg(SETUP, gain); } void setup() { pinMode(PIN_DRDY, INPUT); pinMode(10, OUTPUT); // SS 必须设为输出 SPI.begin(); Serial.begin(115200); SPI.beginTransaction(spiSettings); SPI.transfer(RESET); SPI.endTransaction(); delay(50); writeReg(ACR, 0x44); // 外部 2.5V 基准 writeReg(SETUP, GAIN_1); Serial.println("ADS1243 4-Channel Ready"); Serial.println("CH0: AIN0-AIN1 | CH1: AIN2-AIN3 | CH2: AIN4-AIN5 | CH3: AIN6-AIN7"); } void loop() { int32_t adcValues[4]; float voltages[4]; for (int i = 0; i < 4; i++) { setChannel(CH_CONFIG[i], GAIN_1); delay(150); // 等 PGA 稳定 adcValues[i] = readADC(); voltages[i] = (adcValues[i] * VREF_VALUE) / 8388607.0; } Serial.print("CH0: "); Serial.print(voltages[0], 6); Serial.print(" V | CH1: "); Serial.print(voltages[1], 6); Serial.print(" V | CH2: "); Serial.print(voltages[2], 6); Serial.print(" V | CH3: "); Serial.print(voltages[3], 6); Serial.println(" V"); Serial.print("Raw: "); Serial.print(adcValues[0]); Serial.print(", "); Serial.print(adcValues[1]); Serial.print(", "); Serial.print(adcValues[2]); Serial.print(", "); Serial.println(adcValues[3]); delay(500); }