头文件:

#ifndef _ADS1256_H_
#define _ADS1256_H_

#include <Arduino.h>
#include <SPI.h>

/* ADS1256 register */
enum {
    REG_STATUS = 0,     // x1H
    REG_MUX    = 1,     // 01H
    REG_ADCON  = 2,     // 20H
    REG_DRATE  = 3,     // F0H
    REG_IO     = 4,     // E0H
    REG_OFC0   = 5,     // xxH
    REG_OFC1   = 6,     // xxH
    REG_OFC2   = 7,     // xxH
    REG_FSC0   = 8,     // xxH
    REG_FSC1   = 9,     // xxH
    REG_FSC2   = 10,    // xxH
};

/* Command definition */
enum {
    CMD_WAKEUP  = 0x00,     // Completes SYNC and Exits Standby Mode 0000 0000 (00h)
    CMD_RDATA   = 0x01,     // Read Data 0000 0001 (01h)
    CMD_RDATAC  = 0x03,     // Read Data Continuously 0000 0011 (03h)
    CMD_SDATAC  = 0x0F,     // Stop Read Data Continuously 0000 1111 (0Fh)
    CMD_RREG    = 0x10,     // Read from REG rrr 0001 rrrr (1xh)
    CMD_WREG    = 0x50,     // Write to REG rrr 0101 rrrr (5xh)
    CMD_SELFCAL = 0xF0,     // Offset and Gain Self-Calibration 1111 0000 (F0h)
    CMD_SELFOCAL= 0xF1,     // Offset Self-Calibration 1111 0001 (F1h)
    CMD_SELFGCAL= 0xF2,     // Gain Self-Calibration 1111 0010 (F2h)
    CMD_SYSOCAL = 0xF3,     // System Offset Calibration 1111 0011 (F3h)
    CMD_SYSGCAL = 0xF4,     // System Gain Calibration 1111 0100 (F4h)
    CMD_SYNC    = 0xFC,     // Synchronize the A/D Conversion 1111 1100 (FCh)
    CMD_STANDBY = 0xFD,     // Begin Standby Mode 1111 1101 (FDh)
    CMD_RESET   = 0xFE,     // Reset to Power-Up Values 1111 1110 (FEh)
};

/* ADS1256 gain channel */
typedef enum {
    ADS1256_GAIN_1   = 0,    // GAIN   1
    ADS1256_GAIN_2   = 1,    // GAIN   2
    ADS1256_GAIN_4   = 2,    // GAIN   4
    ADS1256_GAIN_8   = 3,    // GAIN   8
    ADS1256_GAIN_16  = 4,    // GAIN  16
    ADS1256_GAIN_32  = 5,    // GAIN  32
    ADS1256_GAIN_64  = 6,    // GAIN  64
} ADS1256_GAIN_E;

/* ADS1256 data rate */
typedef enum {
    ADS1256_DRATE_30000SPS  = 0xF0,    // ADS1256  30,000SPS
    ADS1256_DRATE_15000SPS  = 0xE0,    // ADS1256  15,000SPS
    ADS1256_DRATE_7500SPS   = 0xD0,    // ADS1256   7,500SPS
    ADS1256_DRATE_3750SPS   = 0xC0,    // ADS1256   3,750SPS
    ADS1256_DRATE_2000SPS   = 0xB0,    // ADS1256   2,000SPS
    ADS1256_DRATE_1000SPS   = 0xA1,    // ADS1256   1,000SPS
    ADS1256_DRATE_500SPS    = 0x92,    // ADS1256     500SPS
    ADS1256_DRATE_100SPS    = 0x82,    // ADS1256     100SPS
    ADS1256_DRATE_60SPS     = 0x72,    // ADS1256      60SPS
    ADS1256_DRATE_50SPS     = 0x63,    // ADS1256      50SPS
    ADS1256_DRATE_30SPS     = 0x53,    // ADS1256      30SPS
    ADS1256_DRATE_25SPS     = 0x43,    // ADS1256      25SPS
    ADS1256_DRATE_15SPS     = 0x33,    // ADS1256      15SPS
    ADS1256_DRATE_10SPS     = 0x23,    // ADS1256      10SPS
    ADS1256_DRATE_5SPS      = 0x13,    // ADS1256       5SPS
    ADS1256_DRATE_2_5SPS    = 0x03,    // ADS1256     2.5SPS
} ADS1256_DRATE_E;

#define ADS1256_CS_LOW()    digitalWrite(5, LOW)
#define ADS1256_CS_HIGH()   digitalWrite(5, HIGH)

class ADS1256 {
public:
    /* Initialize ADS1256 */
    void begin();

    /* Reset ADS1256 */
    void reset();

    /* Start data acquisition */
    void start();

    /* Stop data acquisition */
    void stop();

    /* Read data from ADS1256 */
    int32_t readData();

    /* Set the gain channel of ADS1256 */
    void setGain(ADS1256_GAIN_E gain);

    /* Set the data rate of ADS1256 */
    void setDataRate(ADS1256_DRATE_E dataRate);

    /* Set the input channel of ADS1256 */
    void setInputChannel(uint8_t channel);

    /* Set the reference voltage of ADS1256 */
    void setRefVoltage(double voltage);

private:
    /* Write a byte to ADS1256 */
    void writeByte(uint8_t data);

    /* Read a byte from ADS1256 */
    uint8_t readByte();

    /* Send a command to ADS1256 */
    void sendCommand(uint8_t cmd);

    /* Read a register from ADS1256 */
    uint8_t readReg(uint8_t reg);

    /* Write a register to ADS1256 */
    void writeReg(uint8_t reg, uint8_t data);

    /* Wait for DRDY pin to go low */
    void waitForDRDY();

private:
    ADS1256_GAIN_E m_gain;
    ADS1256_DRATE_E m_dataRate;
    double m_refVoltage;
};

#endif

主文件:

#include "ADS1256.h"

#define ADC_BUFFER_SIZE  3

static uint8_t s_adc_buffer[ADC_BUFFER_SIZE];
static SPISettings s_spi_settings(1000000, MSBFIRST, SPI_MODE1);

/* Initialize ADS1256 */
void ADS1256::begin()
{
    pinMode(5, OUTPUT);
    ADS1256_CS_HIGH();
    SPI.begin();
    reset();
}

/* Reset ADS1256 */
void ADS1256::reset()
{
    sendCommand(CMD_RESET);
    delay(10);
    sendCommand(CMD_SDATAC);
    delay(10);
    writeReg(REG_ADCON, 0x20);
}

/* Start data acquisition */
void ADS1256::start()
{
    sendCommand(CMD_SYNC);
    delayMicroseconds(10);
    sendCommand(CMD_WAKEUP);
    delayMicroseconds(10);
}

/* Stop data acquisition */
void ADS1256::stop()
{
    sendCommand(CMD_SDATAC);
    delayMicroseconds(10);
}

/* Read data from ADS1256 */
int32_t ADS1256::readData()
{
    ADS1256_CS_LOW();
    SPI.beginTransaction(s_spi_settings);
    SPI.transfer(CMD_RDATA);
    uint8_t data[3];
    data[0] = SPI.transfer(0xFF);
    data[1] = SPI.transfer(0xFF);
    data[2] = SPI.transfer(0xFF);
    SPI.endTransaction();
    ADS1256_CS_HIGH();
    int32_t result = ((int32_t)data[0] << 16) | ((int32_t)data[1] << 8) | (int32_t)data[2];
    if (result & 0x800000) {
        result |= 0xFF000000;
    }
    return result;
}

/* Set the gain channel of ADS1256 */
void ADS1256::setGain(ADS1256_GAIN_E gain)
{
    m_gain = gain;
    writeReg(REG_ADCON, (0x20 | (m_gain << 1)));
}

/* Set the data rate of ADS1256 */
void ADS1256::setDataRate(ADS1256_DRATE_E dataRate)
{
    m_dataRate = dataRate;
    writeReg(REG_DRATE, m_dataRate);
}

/* Set the input channel of ADS1256 */
void ADS1256::setInputChannel(uint8_t channel)
{
    writeReg(REG_MUX, ((channel << 4) | 0x08));
}

/* Set the reference voltage of ADS1256 */
void ADS1256::setRefVoltage(double voltage)
{
    m_refVoltage = voltage;
}

/* Write a byte to ADS1256 */
void ADS1256::writeByte(uint8_t data)
{
    ADS1256_CS_LOW();
    SPI.transfer(data);
    ADS1256_CS_HIGH();
}

/* Read a byte from ADS1256 */
uint8_t ADS1256::readByte()
{
    ADS1256_CS_LOW();
    uint8_t data = SPI.transfer(0xFF);
    ADS1256_CS_HIGH();
    return data;
}

/* Send a command to ADS1256 */
void ADS1256::sendCommand(uint8_t cmd)
{
    ADS1256_CS_LOW();
    SPI.transfer(cmd);
    ADS1256_CS_HIGH();
}

/* Read a register from ADS1256 */
uint8_t ADS1256::readReg(uint8_t reg)
{
    sendCommand(CMD_RREG | reg);
    sendCommand(0x00);
    return readByte();
}

/* Write a register to ADS1256 */
void ADS1256::writeReg(uint8_t reg, uint8_t data)
{
    sendCommand(CMD_WREG | reg);
    writeByte(0x00);
    writeByte(data);
}

/* Wait for DRDY pin to go low */
void ADS1256::waitForDRDY()
{
    while (digitalRead(22));
}

// M5 ATOM Matrix的控制文件
#include <M5Atom.h>

ADS1256 adc;

void setup()
{
    M5.begin(true, false, true);
    adc.begin();
    adc.setGain(ADS1256_GAIN_1);
    adc.setDataRate(ADS1256_DRATE_500SPS);
    adc.setInputChannel(0);
    adc.setRefVoltage(5.0);
}

void loop()
{
    adc.start();
    adc.waitForDRDY();
    int32_t data = adc.readData();
    adc.stop();
    double voltage = (double)data / 0x7FFFFF * 2 * adc.m_refVoltage / (1 << adc.m_gain);
    M5.Lcd.clear(BLACK);
    M5.Lcd.setCursor(0, 0);
    M5.Lcd.setTextSize(2);
    M5.Lcd.printf("Voltage: %.3fV", voltage);
    delay(100);
}
``
M5 ATOM Matrix作为主控ADS1256作为采集卡通过SPI进行连接连接方式如下:M5 ATOM Matrix的33脚MISO、23脚CLK、19脚MOSI、22脚分别连接到ADS1256的DOUT、SCLK、DIN、DRDY传感器连接到ADS1256的AIN0和AIN1使用Efficient Input Cycling模式采集数据请给出头文件、主文件和M5 atom的控制文件的详细C代

原文地址: https://www.cveoy.top/t/topic/daac 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录