大家好,我正在使用ADS1262使用Arduino UNO从称重传感器读取数据。
我使用的是由原生体设计的电路板:“PROTOCENTRAL ADS1262 32位精密ADC中断板”
当我将读数配置为直到60sps时,它的工作非常完美。
但是当我尝试获得更多的样本时,100多个样本开始在数据中出现大量峰值。
我发现我无法使用超过20 sps的FIR滤波器。
我使用sinc1到sinc4进行了尝试,但两种方法都不起作用。
我做错了什么?
谢谢你。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好,我正在使用ADS1262使用Arduino UNO从称重传感器读取数据。
我使用的是由原生体设计的电路板:“PROTOCENTRAL ADS1262 32位精密ADC中断板”
当我将读数配置为直到60sps时,它的工作非常完美。
但是当我尝试获得更多的样本时,100多个样本开始在数据中出现大量峰值。
我发现我无法使用超过20 sps的FIR滤波器。
我使用sinc1到sinc4进行了尝试,但两种方法都不起作用。
我做错了什么?
谢谢你。
您好Christopher:
很抱歉,我花了很长时间才回答您的回复,我必须在重放之前研究非常深入的ADS1262数据表。
当我创建帖子时,我做了很多操作系统错误的事情,包括不调用RDATA1命令。
我做了一些很好的改变,直到7200 sps我才能实现。
SCLK频率配置为200万Hz (SPI_CLOCK DIV8)。
我正在监控/DRDY pin以查看何时可以读取数据,但在此期间我没有执行任何数据传输。 这是错了吗?
问题是,我不确定是否因为我使用的是我创建的通用代码进行计数,并且我不验证数据是否是新数据,仍然不知道如何操作。
此外,当我设置为1.44万 sps时,大约是1.2万 sps,当我尝试得到更多时,最多需要1.5万 sps。
我是否需要查看或更改其他配置?
我的代码(Arduino)写在下面。
谢谢您Chirs。
爱德华多。
/*连接到Arduino
example.ino
此示例提供了AN0和AN1之间的差分电压(mV
),与Arduino连接
---------------------------
|ads1262引脚标签|引脚功能 |Arduino Connection|
|----------- |:----------- :|----------- :||DRDY
|数据就绪输出引脚| D6. |
|味增 |从机输出 | D12. |
| MOSI |从机进入 | D11. |
| SCLK. |串行时钟 | D13. |
| CS |芯片选择 | D7. |
|开始 |开始转换 | D5. |
| PWDN |关机/重置 | D4. |
| DVDD |数字VDD |+5V |
| DGND |数字接地 | GND |
| AN0-AN9 |模拟输入 |模拟输入|
| AINCOM |模拟输入通用| |
| AVDD |模拟VDD |- |
| AGND |模拟接地 |- |
----------------------------------
*/
#include <SPI.h>
#include <SoftwareSerial.h>
#include <mathing.h>
#define 2.50 1 //可编程增益= 1
#define VREF 2.50 // 2.048V的内部参考
#define VFSR VVREF/GPA/PVA/1 = 2.50
#define FSR ((((long int)1<23)-1)
int config_spi_master_dummy = 0xFF;
//寄存器读取命令
#define RREG 0x20
#define WREG 0x40
#define start 0x08
#define stop 0x0A
#define RDATA 0x12
//PIN用于与传感器的连接,您需要的另一个由SPI库控制)
:const_DSD_6
const int ADS1262_CS_PIN =7;
const int ADS1262_start_PIN =5;
const int ADS1262_PWDN_PIN =4;
//注册地址
#define power 0x01 //11h (默认值)
#define interface 0x02 //05h (默认值)
#define MODE0 0x03 //00h (默认值)
#define MODE1 0x04 //80h (默认值)
#define Mode2 0x05 //04h (默认值)
#define INPMUX 0x06 //01h (默认值)
#define OFC0 /0x1h (
默认值)#define OFC08/08/0x1h 0 (默认值)#define OFC0 (默认值)#define OFC08/0x0 (默认值) 0x0)#define OFC0 (默认值
)
0x0 (默认值/0x0) 0x0 ( //00h (默认值)
#define FSCAL1 0x0B //00h (默认值)
#define FSCAL2 0x0C //40h (默认值)
#define IDACMUX 0x0D //BBH (默认值)
#define IDACOD0x0E //00h (默认值)
#define IOREFMUx 0x19 /0x19 (
默认值)#IPC /0x00h /0x19 (默认值)#IDE /0x19 /IDE /0x13
//00h (默认值)
#define ADC2CFG 0x15 //00h (默认值)
#define ADC2MUX 0x16 //01h (默认值)
#define ADC2OFC0 0x17 //00h (默认值)
#define ADC2C1 0x18 //00h (默认值)
#define ADC2FSC0 0x19 //00h (默认值)#define ADC2Frx1A/float_float
1f0;float_0;
float_1f0 (默认值
)
volatile long ads1262_RX_Data[10];
volatile static int SPI_RX_bufer_Count =0;
volatile char *SPI_RX_bufer_PTR;
volatile int Responsebyte = false;
volatile signed long s1262Count =0;
volatile signed long uads1262Count=0;
double resolution;
unsigned long inicio=0;
int contor1,contor2;
Int celula = 1;
void setup()
Comunicação //初始化数据就绪和芯片选择引脚:pinMode (ADS1262_DRDY_PIN,输入);//数据就绪输入线pinMode (ADS1262_CS_PIN,输出);//芯片启用输出线pinMode (ADS1262_START_PIN,输出)//开始模式(ADS1262_PIN,低功耗,低功耗Código pin_pino)
//Manter o Pino low para manter Comunicação sempre possível
Serial.begin(11.52万);//inicia Comunicação serial
SPI.begin();//启动SPI库:
SPI.beginTransaction(SPISettings(2000万,MSBFIRST,SPI_MODE1);
ads1262_Init();//初始化ads1262 slave
inicio = millis ();
}
void loop()
{
while (digitalRead (ADS1262_DRDY_PIN)== high){//while data is not ready-不执行任何操作
//Serial.print(",");
}
//LER OS Dados
SPI_RX_Buf_PTR = ads1262_Read_Data();//6Bytes <status|Data1|DATA2|DATA3|DATA4|checks>
for (i = 0;i <5;I++)//删除状态字节?
{
SPI_RX_buff [SPI_RX_bufer_Count+]=*(SPI_RX_bufer_PTR + I);
}
IF (SPI_RX_Buy_Count >= 5){
ads1262_Rx_Data[0]=(无符号字符) SPI_RX_buff [1];//读取4字节ADC计数
ads1262_rx_Data[1]=(无符号字符) SPI_RX_buff [2];
ads1262_Rx_Data[2]=(无符号字符) SPI_RX_buff [3];
ads1262_Rx_Data[3]=(无符号字符) SPI_RX_buff [4];
uads1262Count =(signed long)(((unsigned long) ads1262_rx_Data[0]<24)|(unsigned long) ads1262_rx_Data[1]<16)|(ads1262_rx_Data[2]<8)|ads1262_rx_Data[3])1262);//通过转换32位ADC来获取原始数
sads1262Count =(签名长)(uads1262Count); //获取签名值
分辨率=(双精度)((双精度) VREF/pow (2,31)); //resolution = Vref/(2^n-1),Vref= 2.5 ,n=位数
Vol_V =(分辨率)*(浮点) sads1262计数; //电压=分辨率* ADC计数
VOLT_mV = VOLT_V*1000; //电压(mV)
serial.println (volt_mV);
//Serial.println("mV");
}
SPI_RX_buff计数=0;
//验证采样率输出的数量
contador1++;
如果(millis ()- inicio > 1000){
serial.println(contador1);
inicio = millis ();
contador1=0;
}
}
浮动mapfloat (float x,float in_min,float in_max,float out _min,float out _max)
{
RETURN (x - IN_MIN)*(OUT - OUT _MIN)/(IN_max - IN_MIN)+ OUT分钟;
}
void ads1262_Init()
{
ads1262_Reset();DELAY (100);DELAY (100);DELAY (100);
ads1262_ReG_Write (power,0x11);DELAY (10);//11h (默认)启用内部参考
ads1262_ReG_Write (interface,0x0D);DELAY (10);//05h (默认)状态字节已启用,
Reg enableWrite ads1262_Write (MODE0,0x00);DEDelay (10);Reg模式0
;0 (默认) 0;0;0
;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0 //04h (默认) PGA启用1V/V 20sps| 5Ch 32V/V 7200sps | 5Fh 32V/V 3.84万sps
ads1262_ReG_Write (INPMUX,0x01);Delay(10);//01h (默认)多路复用器,AIN0 e AIN1 | 23h AIN2 e AIN2 e AIN0,0x01h
;Reg寄存器(
默认值);写入(10)寄存器1262/ 0 (默认);写入(默认)寄存器1262_AIN0);F0062/ 0 (默认)寄存器0 (默认)寄存器0 (写入(默认);写入);0 (默认);0 (写入)寄存器0 (默认);0);0 (默认);0 (写入);0;0);0;0;0;0;0;0;0;0 (写入,0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0 //00h (默认值)满刻度校准寄存器
ads1262_ReG_Write(FSCAL1, 0x00);Delay(10);//00h (默认值)满刻度校准寄存器
ads1262_ReG_Write(FSCAL2, 0x40);Delay(10);//40h (默认值)全刻度校准
寄存器ads1262_Reg;
Reg读数(RE62_ReG_Multiplex)读数(0x10;读数(DEFAUL)
//00h (默认)参考多路复用器,2.5V,2.5V
ads1262_ReG_Write (TDACP,0x00);Delay(10);//00h (默认) TDACP,无连接
ads1262_ReG_Write (TDACN, 0x00);DELAY (10);//00h (默认) TDACN,无连接
ads1262_Rego_Write (GPIOCON,0x00);DELAY (10);//00h (默认) GPIO未连接
ads1262_GPIO _Write (GPIODIR,0x00);//00Reg
Reg
Reg (默认)
写入,写入(默认) 0x1262_1262_OD01262_OD01200;1262;AD01262_OD012620.1262万AD01262_OD01262 (0.12万 (默认0.1262万默认)0.1262万) Reg;AD_OD0.1262万_D (默认) Reg 1262_OD01262_D (0.1262万 (默认) 0x00);DELAY (10);//00h (默认)
ads1262_ReG_Write (ADC2FSC0,0x00);DELAY (10);//00h (默认)
ads1262_ReG_Write (ADC2FSC1,0x40);DELAY (10); //40h (默认)
SPI.transfer (start);//inicia a conversão通过Código 08h
}
char* ads1262_read_Data()
{
SPI.transfer (RDAA);
static char SPI_Dummy _buf_[6];
对于(int i = 0;i < 6;+I)
{
SPI_Dummy Buff [i]= SPI.transfer (config_SPI_MASTER_DUMP);//config_SPI_MASTER_DUMPLE - FFh
}
RETURN SPI_DUMP_Buff;// 6Bytes <status|Data1|DATA2|Write A3|italA4|ADS>
void ads1262_Reset()//PWDN_PQ_POST_PST_PIN{; DD_PREFN_DE_POST_POST_DE_DE_1.2862万, ADDE_PIN, ADDE_PIN_POST_POST_POST_362;
ADDE_PDIF, AD_PDI
DELAY (100);
digitalWrite(ASD1262_PWDN_PIN, HIGH);DELAY (100);
}
void ads1262_ReG_Write (unsigned char read_write_address,unsigned char data)
{//
现在将寄存器地址和命令合并为一个字节:
byte dataToSend = read_write_address | WREG;
//将芯片选择设为低以选择设备:
spI.transfer(dataToSend);//发送寄存器位置
spI.transfer(0x00);//向wr
spI.transfer(data)的寄存器数;//发送值以记录到寄存器
delayMicroseconds(2);
}
您好,Eduardo,
我注意到您正在轮询数据准备就绪,然后执行数据处理/串行输出。 串行输出操作可能需要很长时间,并阻止您以更快的数据速率捕获数据。 您可以尝试禁用串行输出,并使用示波器查看您是否能够以全吞吐量读取数据;但是,当通过串行接口输出此数据时,您可能无法捕获和显示所有数据...
我会尝试将数据捕获到内存中,并分批输出串行数据(例如,一次输出10个数据样本)。 这可能会使您的数据吞吐量提高一点。
此致,
Chris
感谢Chris的回复。
现在,我尝试按照主题9.4。9.8 校准命令程序从称重组件中删除偏移错误。 根据数据表,我必须遵循以下步骤:
/*校准命令程序 * 1)启用连续转换(模式0) * 2)选择所需增益和参考电压(REFMUX) * 3)选择校准类型 * A)偏移自校准(自动) * 将INPMUX设置为FFh,以在发送校准命令 * 4)开始转换(发送ADC1启动命令) * 5)发送所需的校准命令(校准期间保持CS和SCLK低电平) * A)偏移自校准 * 发送SFOCAL1 (19h) * 根据Table 32*6)将 INPMUX设置为所需的通道
*/
我在“void setup()”下做这些工作,并在SFOCAL命令后设置延迟1秒,除了设置SCLK低值(不知道如何操作)。
它似乎什么都没有,这种偏移仍然存在。
void arrauda1262:::arrauda1262_Offset_Calibration (void)
{
arrauda1262_ReG_Write (INPMUX,0xFF);
Delay (10);
SPI.transfer (start);
Delay (10);
SPI.transfer (SFOCALL1);
delay(1000);
arrauda1262_ReG_Write(INPMUX, 0x01);
}
出什么问题了吗?