• admin
    // ============================================================
    // 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);
    }
    主楼
  • admin

    四通道ok

    #1
  • admin
    // ============================================================
    // 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);
    }
    #2

发表回复

登录后回复