M5 ATOM Matrix 连接 ADS1256 采集数据:SPI 连接方式及代码示例

本文介绍如何使用 M5 ATOM Matrix 作为主控,通过 SPI 连接 ADS1256 采集卡,并给出头文件、主文件和 M5 atom 控制文件的详细代码。

连接方式:

  • M5 ATOM Matrix 的 33 脚 MISO、23 脚 CLK、19 脚 MOSI、22 脚分别连接到 ADS1256 的 DOUT、SCLK、DIN、DRDY。
  • 传感器连接到 ADS1256 的 AIN0 和 AIN1,使用差分模式采集数据。

代码示例:

头文件:

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

#define CS_PIN 32  //ADS1256 的 CS 引脚
#define RESET_PIN 27 //ADS1256 的 RESET 引脚

class ADS1256 {
  public:
    void begin();
    void reset();
    void setPGA(int pga);
    long readADC(int channel);
  private:
    void writeCmd(byte cmd);
    byte readReg(byte addr);
    void writeReg(byte addr, byte data);
    long read24bit();
    void waitDRDY();
    int _pga;
};

void ADS1256::begin() {
  pinMode(CS_PIN, OUTPUT);
  pinMode(RESET_PIN, OUTPUT);
  SPI.begin();
  reset();
  writeCmd(0x11);  //停止连续转换模式
  writeCmd(0x01);  //选择通道 0
  writeCmd(0x50);  //设置采样率为 10SPS
  setPGA(1);  //设置增益为 1
}

void ADS1256::reset() {
  digitalWrite(RESET_PIN, HIGH);
  delay(10);
  digitalWrite(RESET_PIN, LOW);
  delay(10);
  digitalWrite(RESET_PIN, HIGH);
  delay(10);
}

void ADS1256::setPGA(int pga) {
  byte reg = readReg(0x01);
  reg &= 0xF8;
  switch (pga) {
    case 1:
      reg |= 0x00;
      _pga = 1;
      break;
    case 2:
      reg |= 0x01;
      _pga = 2;
      break;
    case 4:
      reg |= 0x02;
      _pga = 4;
      break;
    case 8:
      reg |= 0x03;
      _pga = 8;
      break;
    case 16:
      reg |= 0x04;
      _pga = 16;
      break;
    case 32:
      reg |= 0x05;
      _pga = 32;
      break;
    case 64:
      reg |= 0x06;
      _pga = 64;
      break;
    default:
      reg |= 0x00;
      _pga = 1;
      break;
  }
  writeReg(0x01, reg);
}

long ADS1256::readADC(int channel) {
  writeCmd(0x08 | channel);  //选择通道
  waitDRDY();  //等待 DRDY 引脚变为低电平
  long val = read24bit();  //读取 24 位数据
  if (val & 0x800000) {
    val |= 0xFF000000;
  }
  val = val * 1000000 / 8388608 / _pga;  //转换为微伏
  return val;
}

void ADS1256::writeCmd(byte cmd) {
  digitalWrite(CS_PIN, LOW);
  SPI.transfer(cmd);
  digitalWrite(CS_PIN, HIGH);
}

byte ADS1256::readReg(byte addr) {
  byte data;
  digitalWrite(CS_PIN, LOW);
  SPI.transfer(0x20 | addr);
  data = SPI.transfer(0x00);
  digitalWrite(CS_PIN, HIGH);
  return data;
}

void ADS1256::writeReg(byte addr, byte data) {
  digitalWrite(CS_PIN, LOW);
  SPI.transfer(0x40 | addr);
  SPI.transfer(data);
  digitalWrite(CS_PIN, HIGH);
}

long ADS1256::read24bit() {
  long data = 0;
  digitalWrite(CS_PIN, LOW);
  SPI.transfer(0x01);
  data = SPI.transfer(0x00) << 16;
  data |= SPI.transfer(0x00) << 8;
  data |= SPI.transfer(0x00);
  digitalWrite(CS_PIN, HIGH);
  return data;
}

void ADS1256::waitDRDY() {
  while (digitalRead(22));
}

主文件:

#include "ADS1256.h"

void setup() {
  Serial.begin(115200);
  while (!Serial);
  ADS1256 ads;
  ads.begin();
  ads.setPGA(1);
}

void loop() {
  ADS1256 ads;
  long val = ads.readADC(0);  //读取 AIN0 的值
  Serial.println(val);
  delay(100);
}

M5 atom 的控制文件:

#include <M5Atom.h>

void setup() {
  M5.begin(true, false, true);
  pinMode(33, OUTPUT);  //MISO
  pinMode(19, OUTPUT);  //MOSI
  pinMode(23, OUTPUT);  //CLK
  pinMode(22, INPUT);   //DRDY
}

void loop() {
  
}

完整代码:

  • 头文件:ADS1256.h
  • 主文件:main.cpp
  • M5 atom 控制文件:M5AtomControl.cpp

注意:

  • 代码中的 #define CS_PIN 32#define RESET_PIN 27 是根据 M5 ATOM Matrix 的引脚定义设置的,请根据实际连接情况修改。
  • 代码中的 readADC(0) 是读取通道 0 的数据,请根据实际连接的传感器通道修改。
  • 为了提高数据精度,建议使用差分模式采集数据。
  • 可以根据需要修改采样率和增益等参数。

相关资源:

希望本文能帮助您成功使用 M5 ATOM Matrix 连接 ADS1256 采集数据。

M5 ATOM Matrix 连接 ADS1256 采集数据:SPI 连接方式及代码示例

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

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