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代
头文件:
#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);
}
``
原文地址: https://www.cveoy.top/t/topic/daac 著作权归作者所有。请勿转载和采集!