注:由于本人是AI语言模型,无法进行硬件连接测试和代码编译,以下代码仅供参考。

头文件:

#ifndef _ADS1256_H_
#define _ADS1256_H_

#include <stdint.h>

#define ADS1256_DRAEY_PIN   22

#define ADS1256_DRDY_STATE  1
#define ADS1256_DRDY_PIN    33

#define ADS1256_CLK_PIN     23
#define ADS1256_MOSI_PIN    19
#define ADS1256_MISO_PIN    33

#define ADS1256_CS_PIN      5

#define ADS1256_PGA_1       0x00
#define ADS1256_PGA_2       0x01
#define ADS1256_PGA_4       0x02
#define ADS1256_PGA_8       0x03
#define ADS1256_PGA_16      0x04
#define ADS1256_PGA_32      0x05
#define ADS1256_PGA_64      0x06

#define ADS1256_DRATE_30000SPS  0xF0
#define ADS1256_DRATE_15000SPS  0xE0
#define ADS1256_DRATE_7500SPS   0xD0
#define ADS1256_DRATE_3750SPS   0xC0
#define ADS1256_DRATE_2000SPS   0xB0
#define ADS1256_DRATE_1000SPS   0xA1
#define ADS1256_DRATE_500SPS    0x92
#define ADS1256_DRATE_100SPS    0x82
#define ADS1256_DRATE_60SPS     0x72
#define ADS1256_DRATE_50SPS     0x63
#define ADS1256_DRATE_30SPS     0x53
#define ADS1256_DRATE_25SPS     0x43
#define ADS1256_DRATE_15SPS     0x33
#define ADS1256_DRATE_10SPS     0x23
#define ADS1256_DRATE_5SPS      0x13
#define ADS1256_DRATE_2_5SPS    0x03

#define ADS1256_CMD_WAKEUP      0x00
#define ADS1256_CMD_SLEEP       0x02
#define ADS1256_CMD_SYNC        0x04
#define ADS1256_CMD_RESET       0x06
#define ADS1256_CMD_START       0x08
#define ADS1256_CMD_STOP        0x0A
#define ADS1256_CMD_RDATA       0x12
#define ADS1256_CMD_RREG        0x20
#define ADS1256_CMD_WREG        0x40

#define ADS1256_STATUS_POR      0x01
#define ADS1256_STATUS_RDATAC   0x02
#define ADS1256_STATUS_RDY      0x04
#define ADS1256_STATUS_SYNC     0x08
#define ADS1256_STATUS_ALARM    0x10
#define ADS1256_STATUS_EXTREF   0x20
#define ADS1256_STATUS_MUX      0x40
#define ADS1256_STATUS_PGA      0x80

#define ADS1256_MUXP_AIN0       0x00
#define ADS1256_MUXP_AIN1       0x10
#define ADS1256_MUXP_AIN2       0x20
#define ADS1256_MUXP_AIN3       0x30
#define ADS1256_MUXP_AIN4       0x40
#define ADS1256_MUXP_AIN5       0x50
#define ADS1256_MUXP_AIN6       0x60
#define ADS1256_MUXP_AIN7       0x70

#define ADS1256_MUXN_AIN0       0x00
#define ADS1256_MUXN_AIN1       0x01
#define ADS1256_MUXN_AIN2       0x02
#define ADS1256_MUXN_AIN3       0x03
#define ADS1256_MUXN_AIN4       0x04
#define ADS1256_MUXN_AIN5       0x05
#define ADS1256_MUXN_AIN6       0x06
#define ADS1256_MUXN_AIN7       0x07

#define ADS1256_GAIN_1          0x00
#define ADS1256_GAIN_2          0x01
#define ADS1256_GAIN_4          0x02
#define ADS1256_GAIN_8          0x03
#define ADS1256_GAIN_16         0x04
#define ADS1256_GAIN_32         0x05
#define ADS1256_GAIN_64         0x06

uint8_t ADS1256_Init(uint8_t drate, uint8_t gain);
void ADS1256_SetPGA(uint8_t gain);
void ADS1256_SetDRate(uint8_t drate);
uint8_t ADS1256_ReadChipID(void);
int32_t ADS1256_ReadData(void);

#endif

主文件:

#include "ADS1256.h"
#include <M5Atom.h>
#include <SPI.h>

void ADS1256_SendCommand(uint8_t cmd);
void ADS1256_WriteReg(uint8_t reg, uint8_t data);
uint8_t ADS1256_ReadReg(uint8_t reg);
void ADS1256_WaitDRDY(void);
void ADS1256_Calculate(uint8_t *buf, int32_t *value);

uint8_t ADS1256_Init(uint8_t drate, uint8_t gain)
{
    pinMode(ADS1256_DRAEY_PIN, OUTPUT);
    digitalWrite(ADS1256_DRAEY_PIN, HIGH);
    
    pinMode(ADS1256_DRDY_PIN, INPUT);
    
    SPI.begin();
    SPI.setBitOrder(MSBFIRST);
    SPI.setDataMode(SPI_MODE1);
    SPI.setClockDivider(SPI_CLOCK_DIV4);
    
    ADS1256_SendCommand(ADS1256_CMD_RESET);
    delay(100);
    
    ADS1256_SendCommand(ADS1256_CMD_WAKEUP);
    delay(100);
    
    ADS1256_SendCommand(ADS1256_CMD_RREG | 0x03);
    ADS1256_SendCommand(0x00);
    ADS1256_SendCommand(0x18);
    delay(100);
    
    ADS1256_SendCommand(ADS1256_CMD_RREG | 0x01);
    ADS1256_SendCommand((gain << 4) | 0x00);
    delay(100);
    
    ADS1256_SetDRate(drate);
    ADS1256_SetPGA(gain);
    
    return ADS1256_ReadChipID();
}

void ADS1256_SetPGA(uint8_t gain)
{
    uint8_t regValue = (gain << 1) & 0x0E;
    ADS1256_WriteReg(0x01, regValue);
}

void ADS1256_SetDRate(uint8_t drate)
{
    ADS1256_WriteReg(0x03, drate);
}

uint8_t ADS1256_ReadChipID(void)
{
    ADS1256_SendCommand(ADS1256_CMD_RREG | 0x00);
    ADS1256_SendCommand(0x00);
    return ADS1256_SendCommand(0x00);
}

int32_t ADS1256_ReadData(void)
{
    uint8_t buf[3] = {0};
    ADS1256_WaitDRDY();
    ADS1256_SendCommand(ADS1256_CMD_RDATA);
    SPI.transfer(buf, 3);
    return ADS1256_Calculate(buf);
}

void ADS1256_SendCommand(uint8_t cmd)
{
    digitalWrite(ADS1256_CS_PIN, LOW);
    SPI.transfer(cmd);
    digitalWrite(ADS1256_CS_PIN, HIGH);
}

void ADS1256_WriteReg(uint8_t reg, uint8_t data)
{
    digitalWrite(ADS1256_CS_PIN, LOW);
    SPI.transfer(ADS1256_CMD_WREG | reg);
    SPI.transfer(0x00);
    SPI.transfer(data);
    digitalWrite(ADS1256_CS_PIN, HIGH);
}

uint8_t ADS1256_ReadReg(uint8_t reg)
{
    digitalWrite(ADS1256_CS_PIN, LOW);
    SPI.transfer(ADS1256_CMD_RREG | reg);
    SPI.transfer(0x00);
    uint8_t data = SPI.transfer(0x00);
    digitalWrite(ADS1256_CS_PIN, HIGH);
    return data;
}

void ADS1256_WaitDRDY(void)
{
    while (digitalRead(ADS1256_DRDY_PIN) != ADS1256_DRDY_STATE);
}

void ADS1256_Calculate(uint8_t *buf, int32_t *value)
{
    uint32_t adc = ((uint32_t)buf[0] << 16) | ((uint32_t)buf[1] << 8) | buf[2];
    if (adc & 0x800000) {
        adc |= 0xFF000000;
    }
    *value = adc;
}

M5 Atom的控制文件:

#include <M5Atom.h>
#include "ADS1256.h"

void setup()
{
    M5.begin(true, false, true);
    M5.IMU.Init();
    
    uint8_t chipID = ADS1256_Init(ADS1256_DRATE_1000SPS, ADS1256_GAIN_1);
    Serial.println("ADS1256 Chip ID: " + String(chipID));
}

void loop()
{
    M5.IMU.getAccelAdc();
    int32_t data = ADS1256_ReadData();
    Serial.println("Accel: " + String(M5.IMU.ax) + ", ADS1256: " + String(data));
    delay(100);
}
M5 ATOM Matrix与ADS1256 SPI连接教程:差分模式数据采集

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

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