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:尝试读取超过60sps时出现问题

Guru**** 2585275 points
Other Parts Discussed in Thread: ADS1262

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/627185/ads1262-problem-when-trying-to-read-more-than-60sps

部件号:ADS1262

大家好,我正在使用ADS1262使用Arduino UNO从称重传感器读取数据。

我使用的是由原生体设计的电路板:“PROTOCENTRAL ADS1262 32位精密ADC中断板”

当我将读数配置为直到60sps时,它的工作非常完美。

但是当我尝试获得更多的样本时,100多个样本开始在数据中出现大量峰值。

我发现我无法使用超过20 sps的FIR滤波器。  
我使用sinc1到sinc4进行了尝试,但两种方法都不起作用。

我做错了什么?

谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    一些信息:

    ads1262_ReG_Write (电源,0x11);
    ads1262_ReG_Write (接口,0x05);
    ads1262_ReG_Write (MODE0,0x00); //连续转换打开,斩波和IDAC旋转关闭,无延迟
    ads1262_ReG_Write (MODE1,0x60); //syncd 4
    ads1262_ReG_Write (模式2,0x36); //8V/V,60sps... 当我更改为超过60sps时,错误开始出现
    ads1262_ReG_Write (INPMUX,0x01);
    ads1262_ReG_Write (OFCAL0,0x00);
    ads1262_ReG_Write (OFCAL1,0x00);
    ads1262_ReG_Write (OFCAL2,0x00);
    ads1262_ReG_Write (FSCAL0,0x00);
    ads1262_ReG_Write (FSCAL1,0x00);
    ads1262_ReG_Write (FSCAL2,0x40);
    ads1262_ReG_Write (IDACMUX,0xBB);
    ads1262_ReG_Write (IDACMAG,0x00);
    ads1262_ReG_Write (REFMUX,0x00);
    ads1262_ReG_Write (TDACP,0x00);
    ads1262_ReG_Write (TDACN,0x00);
    ads1262_Reg_Write(GPIOCON, 0x00);
    ads1262_Reg_Write(GPIODIR, 0x00);
    ads1262_Reg_Write (GPIODAT,0x00);
    ads1262_ReG_Write (ADC2CFG,0x00);
    ads1262_ReG_Write (ADC2MUX,0x01);
    ads1262_ReG_Write (ADC2OFC0,0x00);
    ads1262_ReG_Write (ADC2OFC1,0x00);
    ads1262_ReG_Write (ADC2FSC0,0x00);
    ads1262_ReG_Write (ADC2FSC1,0x40);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Eduardo,

    欢迎来到TI E2E论坛!

    您是否在读取数据时尝试探测SPI信号?

    由于您只会看到以较高的数据速率读取数据时出现问题,因此我会查看您是否正在及时读取数据(在下一次ADC转换完成之前)。 如果您在没有RDATA1命令的情况下对数据进行时钟处理,则如果您在转换完成时读取数据,则会面临损坏数据的风险。 RDATA1命令会将旧转换数据保存到缓冲输出移位寄存器,这样新数据不会覆盖旧数据。

    另外,它还有助于了解您使用的SCLK频率,以及您是轮询/DRDY引脚还是使用/DRDY中断来确定何时读取数据?

    谢谢!
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好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);
    } 

    出什么问题了吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Eduardo,

    为了消除称重组件的外部偏移,您需要执行"系统"偏移校准(SYOCAL1)。 自偏移校准仅删除ADC的内部偏移,而内部偏移一开始就相当小。

    尝试编程输入多路复用器以选择称重传感器(未施加负载),然后运行SYOCAL1命令。 这应有助于消除来自称重组件的偏移。

    此致,
    Chris