M5 ATOM Matrix与ADS1256 SPI连接教程:差分模式数据采集
注:由于本人是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);
}
原文地址: https://www.cveoy.top/t/topic/nCxY 著作权归作者所有。请勿转载和采集!