主题中讨论的其他器件: ADS1256
你好!
关于 ADS1255:我一直在尝试使其与 ESP32 (但平台并不重要)配合使用、其最大电位为30kSPS。
遗憾的是、在连续模式(RDATAC)下读取数据会产生一些奇怪的行为: 与使用正常读取模式(RDATA)相比、我获得的原始 ADC 值在很大程度上不稳定(幅度超过5000000)、其变化不超过数千(对应于指定的噪声性能)。
我正在使用 Arduino IDE 和通过 SPI 连接的 ESP32与 ADC 进行通信。
其他一些组件包括 AD8555运算放大器和+2.5V 低噪声电压源 ADR431BRZ。 (请参阅折页 原理图)。
我用于设置 ADC 的代码可在下面找到、它是 Darioslavi 在这里发布的代码的自适应值。
显然、这些寄存器似乎没有正确设置。 例如、在状态寄存器(0x00h)中写入0B00000001后、我将读回0而不是1。 为什么会这样?
此外、在 LOOP 函数中、我是否 以正确的方式连续读取 ADC 输出? 我缺少什么吗?
感谢您的帮助! 这里是我使用的代码。
#include
#include
#define SCK 14
#define MOSI 12
#define MISO 27
#define DRDY 26
#define CS 5
#define SPISPEED 1200000
#define WREG 0x50
#define RDATA 0x01
#define RDATAC 0x03
#define RREG 0x10
#define ENABLE_OP_AMP_SETUP 0
unsigned long ADC_val = 0;//存储读
数 outPIN = 19; //引脚
AD8555运算放大器(outpin)中的运算放大器数据;
void setup()
{
Serial.begin(2000000);
if (ENABLE_OP_AMP_Setup){
//Start--------------- 运算放大器设置---
//获取第二级增益代码
serial.println ("输入第二级增益代码(0..7)");
//等待用户输入值
while (!Serial.available ());
//设置第二级增益代码
if (!opamp.setSecondStageGain(Serial.parseInt ()){
//如果代码超出范围,运算放大器将返回 false
serial.println ("第二级增益代码无效。 有效范围为0..7");
返回;
}
//第一级增益代码
serial.println ("输入第一级增益代码(0..127)");
while (!Serial.available ());
if (!opamp.setFirstStageGain(Serial.parseInt ()){
serial.println ("第一级增益代码无效。 有效范围为0..127");
返回;
}
//偏移代码
serial.println ("输入偏移代码(0..255)");
while (!Serial.available ());
if (!opamp.setOffset(Serial.parseInt ()){
serial.println ("偏移代码无效。 有效范围为0..255");
返回;
}
//编程模式
serial.println ("选择编程模式:输入"0\"进行仿真、输入"1\"进行永久编程");
while (!Serial.available ());
int mode = Serial.parseInt();
如果(MODE = 0){
//模拟模式
OPAMP.Simulate();
serial.println ("完成!");
} 如果(MODE = 1){
//永久编程模式
serial.println ("确保满足 AD8555数据表中描述的编程要求:");
serial.println ("需要5.5V 电源");
serial.println ("电源必须能够提供250mA 的电流");
serial.println ("-器件电源引脚上需要至少0.1uF 的去耦电容);
serial.println ("\n 警告:此操作无法撤消、所有编程值都是永久性的");
serial.println ("继续吗? [Y/N]");
while (!Serial.available ());
if (Serial.read ()='y'){
opamp.program();
serial.println ("编程...完成");
} 否则{
serial.println ("操作已取消");
}
}
//完成--- 运算放大器设置--------------------------------}-->
引脚模式(MISO、输入);
引脚模式(MOSI、输出);
引脚模式(SCK、 输出);
pinMode (CS、输出);
pinMode (DRDY、输入);
延迟(1);
延迟(500);
SPI.begin(SCK、MISO、MOSI、 cs);//启动 SPI 总线
延迟(500);
//初始
化 while (digitalRead (DRDY)){}//等待 READY_LINE 变为低
电平 SPI.beginTransaction(SPISettings(SPISPEED、MSBFIRST、SPI_MODE1);//启动 SPI
delayMicroseconds (10);
//重置为加电值(FEH);{sbid_transfer
(
SPI.beginTransaction(SPISettings(SPISPEED);//等待 SPI deleMicro 秒(SPI);//待传输(SPI deleMicro);(SPI deleMicro);//待传输();// DDIRx) //开始 SPI
字节 STATUS_reg = 0x00;//状态寄存器的地址(数据表第30页)
字节 STATUS_DATA = 0B0000001;
字节 STATUS_READ;
//000 0 0 0 1
//000 -出厂编程标识位
//0 -设置 MSB 传输
//0 -自动校准禁用
//0 -缓冲器禁用
//1 - DRDY 引脚
SPI.transfer (WREG | STATUS_reg)的重复状态;
SPI.transfer (0x00);//第二个命令字节、仅写入一个寄存器
SPI.transfer (STATUS_DATA); //将数据字节写入寄存
器 delayMicroseconds (10);
Serial.println ("状态寄存器值:");
spi.transfer (RREG | STATUS_reg);
spi.transfer (0x00);//第二个命令字节,只读一个寄存器
spi.transfer (status_read);
delayMicroseconds (10);
Serial.print ("
status);print"应为 Serial in (data.);
serial.print ("已接收:");
serial.println (STATUS_READ);
//PGA 设置
//1±5V
/2±2.5V
///4±1.25V
// 8±0.625V
// 16±312.5mV
// 32±156.25mV
// 64±78.125mV
0000adcon_reg = 0x02;/0000控制寄存
器字节0x02 =/A/D
// 0 00 00 000
// 0始终保留0
// 00 -时钟输出关闭
// 00 -传感器锁定关闭
// 000 - PGA 增益= 1
SPI.transfer (WREG | adcon_reg);
SPI.transfer (0x00);//第二个命令字节,只写一个寄存器
SPI.transfer (adcon_data);//将数据库写入微
秒(10);
字节 drate_reg = 3;//数据速率寄存器地址:0x03
字节 drate_data = 0B11110000;
// 11110000
//将数据速率设置为最大值 (30000 SPS)
SPI.transfer (WREG | DRAT_reg);
SPI.transfer (0x00);//第二个命令字节、只写入一个寄存器
SPI.transfer (DRAT_DATA);//将数据字节写入寄存
器 delayMicroseconds (10);
字节 mux_reg = 0x01;// Mux 寄存器(地址01h);//将数据
写入 IDMx (01111)/ IN0000 - IN01111 / INREG/ IN01111 / INx (默认值) //多路复用器寄存
器 SPI.transfer (0x00);//第二个命令字节,只写入一个寄存器
SPI.transfer (mux_data);//将数据字节写入寄存器
delayMicroseconds (10);
字节通道= 0;
字节数据= 0B00001000;// AINCHANNEL 和 AINCOM
//配置为 AIN0V/REVFP
= 2.5V
spi.transfer (0x50 | mux_reg);//多路复用器寄存
器 spi.transfer (0x00);//第二个命令字节,只写入一个寄存器
spi.transfer (data);//将数据字节写入寄存
器 delayMicroseconds (10);
//同步命令1111 1100
spi.transfer (0xFC);
delayMicroseconds (10);
// SPI rewait_transfer
(sble.SPI);// SPI rewakeSPI (dle.0000);// SPI rewake1 (dumn);// SPI rewakeSPI (dle.deltend
SPI.beginTransaction(SPISettings(SPISPEED);// SPI (dle.deleSPI) //启动 SPI
spi.transfer (RDATAC);//读取数据连续命令0000 0011 (03h)
delayMicroseconds (10);
spi.endTransaction ();
Serial.println ("ADC configured、starting sampling");
}
void loop ()
{
while (digitalRead (DRDY));};
SPI.beginTransaction(SPISettings(SPISPEED、MSBFP_transfer
=
0;spi_transfer =
0;/spi_transfer = 0;/spi_transfer = nval (spi_transfer = 0)
;
SPI.endTransaction ();
//ADS1255/6以二进制二进制
/补码格式输出24位数据。 LSB 的权重为
/2VREF/(PGA (223−1))。 正满量程输入会产生
输出代码7FFFFFh、负满量程
//输入会产生输出代码800000h。
如果(ADC_val > 0x7fff){//if MSB = 1
ADC_val =(16777215ul - ADC_val)+ 1;//do 2的补码
}
Serial.println (ADC_val);
}