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.

[参考译文] ADS1158:未发生 ADS1158 单通道读取!

Guru**** 2411700 points
Other Parts Discussed in Thread: ADS1158

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1530107/ads1158-ads1158-single-channel-reading-not-happening

部件号:ADS1158

工具/软件:

您好、

我无法 在固定通道模式下、读取 ADC 通道中的数据、数据不正确。

 

我向通道 o 的输入通道施加 0.5V 电压、该值不对应于 0.5V。

 

请指导我 出现任何配置问题或此处的阅读方法错误。

 

为了快速陈述和我觉得通道选择和指定读取的通道是错误的好处,但我不确定,你可以把一些光照.

  

如果我在这里找到解决方案,这将是很大的帮助。提前感谢。

相匹配

PWDN 和 RESET — 在 3.3V、100k 的电压下上拉引脚

AVDD -+5V

 

VREFP — 在软件中配置为内部基准

VREFN - DGND_/如果我使用内部基准、是否需要连接?

 

AVSS、VREFN、 AINCOM - GND

 

CLKSEL — 未连接

 

XTAL1- XTAL2 - ADS1258EVM 板中的 32.768kHz 晶体连接//默认连接

 

DRDY — 控制器通用输入//用于监控数据就绪时的引脚就绪

 

SPI 连接 — 与微控制器的标准连接

 

//软件配置

SPI — 模式 0、1Mhz

 

//Registry Configuration

#define DAQ_DRV_REG_ADDR_CONFIG0                    ((uint8_t) 0x00)
#define DAQ_DRV_REG_ADDR_CONFIG1                    ((uint8_t) 0x01)
#define DAQ_DRV_REG_ADDR_MUXSCH                     ((uint8_t) 0x02)
#define DAQ_DRV_REG_ADDR_MUXDIF                     ((uint8_t) 0x03)
#define DAQ_DRV_REG_ADDR_MUXSG0                     ((uint8_t) 0x04)
#define DAQ_DRV_REG_ADDR_MUXSG1                     ((uint8_t) 0x05)
#define DAQ_DRV_REG_ADDR_SYSRED                     ((uint8_t) 0x06)

#define DAQ_DRV_OPCODE_READ_DIRECT			        ((uint8_t) 0x00)
#define DAQ_DRV_OPCODE_READ_COMMAND			        ((uint8_t) 0x30)    // Includes MUL bit
#define DAQ_DRV_OPCODE_RREG							((uint8_t) 0x40)
#define DAQ_DRV_OPCODE_WREG							((uint8_t) 0x60)
#define DAQ_DRV_OPCODE_PULSE_CONVERT		        ((uint8_t) 0x80)
#define DAQ_DRV_OPCODE_RESET						((uint8_t) 0xC0)
    
    /* Commands byte masks */
    #define DAQ_DRV_OPCODE_C_MASK                       ((uint8_t) 0xE0)
    #define DAQ_DRV_OPCODE_MUL_MASK                     ((uint8_t) 0x10)
    #define DAQ_DRV_OPCODE_A_MASK                       ((uint8_t) 0x0F)    

static void daq_drv_ADS1158Init()
{
    // Want to configure the Internal Reference for the Voltage, Single ended ADC, want to read all 16 channels one after the other once ADC read command triggered and Ready pin goes low and High,indicating Ready tor ead the Data

    uint8_t l_ucRegDataArray[10];

    l_ucRegDataArray[DAQ_DRV_REG_ADDR_CONFIG0]   =   0b00100000;//Fixed Channel Mode,Rest all Disabled(SPIRST,

    
    l_ucRegDataArray[DAQ_DRV_REG_ADDR_CONFIG1]   =   0;
    l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSCH]    =   0xFF;//Not sure , this should be enabled, no proper description in the datasheet
    l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXDIF]    =   0;//Since its not diffrention ADC to be read
    l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSG0]    =   0;//Initially diasbled
    l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSG1]    =   0;//Initially diasbled
    l_ucRegDataArray[DAQ_DRV_REG_ADDR_SYSRED]    =   0b00100000;//Internal Reference for the ADC is Enabled
 
    // SInce GPIO's are not used Not configured for any pins
   daq_drv_WriteMultipleRegisters(0, 7,l_ucRegDataArray);// For to Write Multiple registry 

}
static void daq_drv_WriteMultipleRegisters(uint8_t startAddress, uint8_t count, const uint8_t *regData)
{
    s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | DAQ_DRV_OPCODE_MUL_MASK | (startAddress & DAQ_DRV_OPCODE_A_MASK);
    memcpy(&s_ucDataTx[1],regData,count);//Copy the dat for Writing Multiple registries

    daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,(1 + count));//Transmit through SPI
}

static int32_t daq_drv_AdcRead(uint8_t l_ucAdcChId, uint8_t l_ucTimeoutVal)
{
    uint8_t l_ucRdyStatus;
    unsigned long runningms;
    static uint8_t s_ucRegistrySwitched;

    //Select Channel 
    if(l_ucAdcChId < 8)
    {
      if( s_ucRegistrySwitched )
      {
        // Clear the DAQ_DRV_REG_ADDR_MUXSG1
        s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | (DAQ_DRV_REG_ADDR_MUXSG1 & DAQ_DRV_OPCODE_A_MASK);
        s_ucDataTx[1] =  0;//Clear the Previous Selection of Registry
        /* Initiate transfer */
        daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
        s_ucRegistrySwitched = 0;
      }
      s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | (DAQ_DRV_REG_ADDR_MUXSG0 & DAQ_DRV_OPCODE_A_MASK);
      s_ucDataTx[1] =  (1 << l_ucAdcChId);

      /* Initiate transfer */
      daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
    }
    else
    {
      if( s_ucRegistrySwitched == 0 )
      {
        // Clear the DAQ_DRV_REG_ADDR_MUXSG0
        s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | (DAQ_DRV_REG_ADDR_MUXSG0 & DAQ_DRV_OPCODE_A_MASK);
        s_ucDataTx[1] =  0;//Clear the Previous Selection of Registry
        /* Initiate transfer */
        daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
        s_ucRegistrySwitched = 1;
      }
      s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | (DAQ_DRV_REG_ADDR_MUXSG1 & DAQ_DRV_OPCODE_A_MASK);
      s_ucDataTx[1] =  (1 << (l_ucAdcChId % 8) );

      /* Initiate transfer */
      daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);      
    }

    s_ucDataTx[0] = DAQ_DRV_OPCODE_PULSE_CONVERT| DAQ_DRV_OPCODE_MUL_MASK;

    daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataTx,1);

    runningms = xTaskGetTickCount();
    l_ucRdyStatus=daq_drv_GPIOGet(s_stGPIOMappings,0);//Check ADC_DRDY_PIN 
    while( l_ucRdyStatus )
    {
      l_ucRdyStatus=daq_drv_GPIOGet(s_stGPIOMappings,0);

      if( (runningms + l_ucTimeoutVal) < xTaskGetTickCount() )
      {
        return ADC_ERROR;//Error state
      }
    }

    // Dummy bytes for reading the Data
    s_ucDataTx[0] = 0;
    s_ucDataTx[1] = 0;

    daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);

    //printf("\nD:%d",((s_ucSpiDataRx[0] << 8) | s_ucSpiDataRx[1]));

    return ((s_ucDataRx[0] << 8) | s_ucDataRx[1]);  
}

void main()
{
    unsigned char l_ucChannel = 0;
    InitDevice();
    InitSpi();//SPI - MODE 0,1Mhz
    daq_drv_ADS1158Init();
    
    while(1)
    {
        
        printf("\n ADC: %d",daq_drv_AdcRead(l_ucChannel, 100));
        
        l_ucChannel ++;
        if(l_ucChannel>15)
            l_ucChannel = 0;
        
            
    }

}

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

    尊敬的 Bharadwaj M N:

    您能否提供系统原理图以及展示通信的逻辑分析仪捕获结果? 请包含所有相关的 SPI 信号 (CS、SCLK、DOUT、DIN、DRDY)

    -布莱恩

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

    尊敬的 

    感谢您的回答。

    我正在使用 ADS1158 的评估板、请查找 https://mm.digikey.com/Volume0/opasdata/d220001/medias/docus/2208/ADS1158EVM_1258EVM_-PDK_Gde.pdf (评估板请遵循第 37 页)、如上所述的所有配置、因为它有这么多的跳线配置、上面我已经解释了连接、如果有任何更好的事情、请告诉我。

    另外,请您查看这些代码,它主要包括注册表的配置和 ADC 的读取,我在其中 怀疑我的注册表配置 ADC 通道的读取结果似乎不正确。

    另外、请查找随附的 命令和响应波形。(我将 1.6V 连接到 ADC 通道 0)、始终获取 0 的读取响应。

    读取命令 0x64 // 0b01100100 (011 — 注册表写入命令) (0 — 无多个注册表)( 0100 — 选择了注册表 4)  

    通道选择 — 0x01

    后跟 0x90、// DAQ_DRV_OPCODE_PULSE_CONVERT| DAQ_DRV_OPCODE_MUL_MASK;

    后跟虚拟字节、用于读取注册表 0x00,0x00 以准备 2 字节的数据

    //Registry Configuration
    
    #define DAQ_DRV_REG_ADDR_CONFIG0                    ((uint8_t) 0x00)
    #define DAQ_DRV_REG_ADDR_CONFIG1                    ((uint8_t) 0x01)
    #define DAQ_DRV_REG_ADDR_MUXSCH                     ((uint8_t) 0x02)
    #define DAQ_DRV_REG_ADDR_MUXDIF                     ((uint8_t) 0x03)
    #define DAQ_DRV_REG_ADDR_MUXSG0                     ((uint8_t) 0x04)
    #define DAQ_DRV_REG_ADDR_MUXSG1                     ((uint8_t) 0x05)
    #define DAQ_DRV_REG_ADDR_SYSRED                     ((uint8_t) 0x06)
    
    #define DAQ_DRV_OPCODE_READ_DIRECT			        ((uint8_t) 0x00)
    #define DAQ_DRV_OPCODE_READ_COMMAND			        ((uint8_t) 0x30)    // Includes MUL bit
    #define DAQ_DRV_OPCODE_RREG							((uint8_t) 0x40)
    #define DAQ_DRV_OPCODE_WREG							((uint8_t) 0x60)
    #define DAQ_DRV_OPCODE_PULSE_CONVERT		        ((uint8_t) 0x80)
    #define DAQ_DRV_OPCODE_RESET						((uint8_t) 0xC0)
        
        /* Commands byte masks */
        #define DAQ_DRV_OPCODE_C_MASK                       ((uint8_t) 0xE0)
        #define DAQ_DRV_OPCODE_MUL_MASK                     ((uint8_t) 0x10)
        #define DAQ_DRV_OPCODE_A_MASK                       ((uint8_t) 0x0F)    
    
    static void daq_drv_ADS1158Init()
    {
        // Want to configure the Internal Reference for the Voltage, Single ended ADC, want to read all 16 channels one after the other once ADC read command triggered and Ready pin goes low and High,indicating Ready tor ead the Data
    
        uint8_t l_ucRegDataArray[10];
    
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_CONFIG0]   =   0b00100000;//Fixed Channel Mode,Rest all Disabled(SPIRST,
    
        
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_CONFIG1]   =   0;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSCH]    =   0xFF;//Not sure , this should be enabled, no proper description in the datasheet
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXDIF]    =   0;//Since its not diffrention ADC to be read
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSG0]    =   0;//Initially diasbled
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSG1]    =   0;//Initially diasbled
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_SYSRED]    =   0b00100000;//Internal Reference for the ADC is Enabled
     
        // SInce GPIO's are not used Not configured for any pins
       daq_drv_WriteMultipleRegisters(0, 7,l_ucRegDataArray);// For to Write Multiple registry 
    
    }
    static void daq_drv_WriteMultipleRegisters(uint8_t startAddress, uint8_t count, const uint8_t *regData)
    {
        s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | DAQ_DRV_OPCODE_MUL_MASK | (startAddress & DAQ_DRV_OPCODE_A_MASK);
        memcpy(&s_ucDataTx[1],regData,count);//Copy the dat for Writing Multiple registries
    
        daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,(1 + count));//Transmit through SPI
    }
    
    static int32_t daq_drv_AdcRead(uint8_t l_ucAdcChId, uint8_t l_ucTimeoutVal)
    {
        uint8_t l_ucRdyStatus;
        unsigned long runningms;
        static uint8_t s_ucRegistrySwitched;
    
        //Select Channel 
        if(l_ucAdcChId < 8)
        {
          if( s_ucRegistrySwitched )
          {
            // Clear the DAQ_DRV_REG_ADDR_MUXSG1
            s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | (DAQ_DRV_REG_ADDR_MUXSG1 & DAQ_DRV_OPCODE_A_MASK);
            s_ucDataTx[1] =  0;//Clear the Previous Selection of Registry
            /* Initiate transfer */
            daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
            s_ucRegistrySwitched = 0;
          }
          s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | (DAQ_DRV_REG_ADDR_MUXSG0 & DAQ_DRV_OPCODE_A_MASK);
          s_ucDataTx[1] =  (1 << l_ucAdcChId);
    
          /* Initiate transfer */
          daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
        }
        else
        {
          if( s_ucRegistrySwitched == 0 )
          {
            // Clear the DAQ_DRV_REG_ADDR_MUXSG0
            s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | (DAQ_DRV_REG_ADDR_MUXSG0 & DAQ_DRV_OPCODE_A_MASK);
            s_ucDataTx[1] =  0;//Clear the Previous Selection of Registry
            /* Initiate transfer */
            daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
            s_ucRegistrySwitched = 1;
          }
          s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | (DAQ_DRV_REG_ADDR_MUXSG1 & DAQ_DRV_OPCODE_A_MASK);
          s_ucDataTx[1] =  (1 << (l_ucAdcChId % 8) );
    
          /* Initiate transfer */
          daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);      
        }
    
        s_ucDataTx[0] = DAQ_DRV_OPCODE_PULSE_CONVERT| DAQ_DRV_OPCODE_MUL_MASK;
    
        daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataTx,1);
    
        runningms = xTaskGetTickCount();
        l_ucRdyStatus=daq_drv_GPIOGet(s_stGPIOMappings,0);//Check ADC_DRDY_PIN 
        while( l_ucRdyStatus )
        {
          l_ucRdyStatus=daq_drv_GPIOGet(s_stGPIOMappings,0);
    
          if( (runningms + l_ucTimeoutVal) < xTaskGetTickCount() )
          {
            return ADC_ERROR;//Error state
          }
        }
    
        // Dummy bytes for reading the Data
        s_ucDataTx[0] = 0;
        s_ucDataTx[1] = 0;
    
        daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
    
        //printf("\nD:%d",((s_ucSpiDataRx[0] << 8) | s_ucSpiDataRx[1]));
    
        return ((s_ucDataRx[0] << 8) | s_ucDataRx[1]);  
    }
    
    void main()
    {
        unsigned char l_ucChannel = 0;
        InitDevice();
        InitSpi();//SPI - MODE 0,1Mhz
        daq_drv_ADS1158Init();
        
        while(1)
        {
            
            printf("\n ADC: %d",daq_drv_AdcRead(l_ucChannel, 100));
            
            l_ucChannel ++;
            if(l_ucChannel>15)
                l_ucChannel = 0;
            
                
        }
    
    }

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

    尊敬的 Bharadwaj M N:

    为什么您在发送脉冲转换命令后立即读取数据? 此时 ADC 仍在转换。 应该等待 DRDY 下降至低电平、然后读取数据。 它位于下图中的红色箭头处

    您是否可以监控 EVM 的行为、因为您已经拥有该器件? 您可以通过 GUI 发送命令、然后在 Saleae 上监控这些命令。 您的代码应该最终模拟 GUI 的作用。

    -布莱恩

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

    您好  Bryan、

    非常感谢你的时间和你的建议,我正在详细阐述我的步骤和观察我的程序,请引导我解决它,我感谢你的宝贵建议。

    根据您的建议、就绪引脚 从低电平转换到高电平后、我进行了读数。

    参考波形也是如此。

    我认为读取的值不正确。

    以下是硬件和软件配置。

    这里重点介绍几个方面

    1.注册表的配置如下,相同的是回读和确认的配置是成功的(读取注册表代码不在这里共享,但尝试没有配置,读取默认值,因此确认的配置是成功的)。

    施加到 A0 引脚以连接到 1.661vDC

    ADC @A0 通道读取值 760(十进制)
    对 A1 引脚施加 GND、接地

    L_ucRegDataArray[REG_ADDR_CONFIG0]= 0b00100000;//Fixed ChannelMode
    L_ucRegDataArray[REG_ADDR_CONFIG1]= 0;
    L_ucRegDataArray[REG_ADDR_MUXSCh]= 0xFF;//选择多路复用器固定通道
    L_ucRegDataArray[REG_ADDR_MUXDIF]= 0;;//因为其非差分线路变为 0
    L_ucRegDataArray[REG_ADDR_MUXSG0]= 0xFF;//因为要读取所有通道的单端启用;
    L_ucRegDataArray[REG_ADDR_MUXSG1]= 0xFF;//因为要读取所有通道的单端启用;;
    L_ucRegDataArray[REG_ADDR_SYSRED]= 0x20;//内部 ADC 基准

    2.连接符合以下原理图,但不包括 基准电压 未连接 ( 保持悬空、因为对 ADC 使用内部电压基准 )

    static void ADS1158Init()
    {
        l_ucRegDataArray[REG_ADDR_CONFIG0]   =   0b00100000;//Fixed ChannelMode    
        l_ucRegDataArray[REG_ADDR_CONFIG1]   =   0;
        l_ucRegDataArray[REG_ADDR_MUXSCH]    =   0xFF;//MULTIPLEXER FIXED CHANNEL IS SELECTED
        l_ucRegDataArray[REG_ADDR_MUXDIF]    =   0;;//SINCE ITS NOT DIFFERENTIAL LINES MADE 0
        l_ucRegDataArray[REG_ADDR_MUXSG0]    =   0xFF;//SINCE WANT TO READ SINGLE ENDED ENABLED ALL CHANNEL;
        l_ucRegDataArray[REG_ADDR_MUXSG1]    =   0xFF;//SINCE WANT TO READ SINGLE ENDED ENABLED ALL CHANNEL;;
        l_ucRegDataArray[REG_ADDR_SYSRED]    =   0x20;//Internal ADC Reference
     
       WriteMultipleRegisters(0, 7,l_ucRegDataArray);//CS AND SENDING OF DATA
    }
     static void WriteMultipleRegisters(uint8_t startAddress, uint8_t count, const uint8_t *regData)
    {
        
        //Dummy Bytes
        memset(&s_ucDataTx,0,10);
        SpiTxRx(SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,10);
        vTaskDelay(1);    
        
        s_ucDataTx[0] = OPCODE_WREG | OPCODE_MUL_MASK | (startAddress & OPCODE_A_MASK);
        
        memcpy(&s_ucDataTx[1],regData,count);
        SpiTxRx(SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,(1 + count));
        //vTaskDelay(1);
    }
    
    static int32_t AdcRead(uint8_t l_ucAdcChId, uint8_t l_ucTimeoutVal)
    {
        uint8_t l_ucRdyStatus = 0;
        unsigned long runningms;
        static uint8_t s_ucRegistrySwitched;
        uint8_t l_ucRegisterMap[8];
    
      
    
        //Select Channel 
        if(l_ucAdcChId < 8)
        {
          if( s_ucRegistrySwitched )
          {
            // Clear the REG_ADDR_MUXSG1
            s_ucDataTx[0] = OPCODE_WREG | (REG_ADDR_MUXSG1 & OPCODE_A_MASK);//0x62
            s_ucDataTx[1] =  0;//Clear the Previous Selection of Registry
            /* Initiate transfer */
            SpiTxRx(SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
            s_ucRegistrySwitched = 0;
          }
          s_ucDataTx[0] = OPCODE_WREG | (REG_ADDR_MUXSG0 & OPCODE_A_MASK);//0x62
          s_ucDataTx[1] = ( l_ucAdcChId ) ;//channel selection
    
          /* Initiate transfer */
          SpiTxRx(SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
        }
        else
        {
          if( s_ucRegistrySwitched == 0 )
          {
            // Clear the REG_ADDR_MUXSG0
            s_ucDataTx[0] = OPCODE_WREG | (REG_ADDR_MUXSG0 & OPCODE_A_MASK);//0x62
            s_ucDataTx[1] =  0;//Clear the Previous Selection of Registry
            /* Initiate transfer */
            SpiTxRx(SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
            s_ucRegistrySwitched = 1;
          }
          s_ucDataTx[0] = OPCODE_WREG | (REG_ADDR_MUXSG1 & OPCODE_A_MASK);////0x62
          s_ucDataTx[1] =  (((l_ucAdcChId % 8));//channel selection
    
          /* Initiate transfer */
          SpiTxRx(SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);      
        }
    
        //vTaskDelay(1);
    
        s_ucDataTx[0] = OPCODE_PULSE_CONVERT| OPCODE_MUL_MASK;//0x90
    
        SpiTxRx(SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataTx,1);
    
        runningms = xTaskGetTickCount();
        l_ucRdyStatus=GPIOGet(s_stGPIOMappings,0);//Check ADC_DRDY_PIN 
        while( l_ucRdyStatus )
        {
          l_ucRdyStatus=GPIOGet(s_stGPIOMappings,0);
    
          if( (runningms + l_ucTimeoutVal) < xTaskGetTickCount() )
          {
            return ADC_ERROR;//Error state
          }
        }
        vTaskDelay(12);
    
        // Dummy bytes for reading the Data
        s_ucDataTx[0] = 0;
        s_ucDataTx[1] = 0;
    
        SpiTxRx(SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
    
        printf("\nA[%d]:%d",l_ucAdcChId,((s_ucDataRx[0] << 8) | s_ucDataRx[1]) ) ;
    
        l_ucRdyStatus=GPIOGet(s_stGPIOMappings,0);//Check ADC_DRDY_PIN 
    
    
        return ((s_ucDataRx[0] << 8) | s_ucDataRx[1]);  
    }

    我的查询、

    1.注册表配置我对单通道选择和通过选择通道读取注册表的方法没有信心,显示错误。

    2.在启用内部 ADC 电压基准时、单通道读数的连接似乎正确(根据我对数据表的理解,内部基准将变为 2.048V,如果我错了,请更正我)。

    下面是计算和预期值以及读取值详细信息。

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

    尊敬的 Bharadwaj M N:

    为了便于说明、ADS1158 没有可用于转换数据的内部电压基准。 ADC 使用 VREFP 和 VREFN 之间的基准电压、如数据表中所示

    某些方框图中显示的“内部电压基准“实际上仅用于 ADC 内的某些内部功能。  但是、它不能用作 ADC 本身的基准、因此您需要将 4.096V 基准重新连接到 VREFP、才能获得良好数据。

    -布莱恩

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

    您好  Bryan、

    非常感谢您的答复和澄清。

    我的问题仍然存在,这是对相同的详细解释。

    下面是我施加了精确的 4.096V 基准电压的电路。

    //Configured for Status enabled, with Channel 0 & 1 is Enabled, with Single Ended inputs only
    static void daq_drv_ADS1158Init()
    {
        uint8_t l_ucRegDataArray[10];
    
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_CONFIG0]   =   0b00000010;//Auto scan mode, with Status
         l_ucRegDataArray[DAQ_DRV_REG_ADDR_CONFIG1]   =   0;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSCH]    =   0;//DAQ_DRV_MUXSCH_DEFAULT;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXDIF]    =   0;;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSG0]    =   3;//DAQ_DRV_MUXSG0_DEFAULT;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSG1]    =   0x00;//DAQ_DRV_MUXSG1_DEFAULT;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_SYSRED]    =   0x00;//Internal Refremce
     
       daq_drv_WriteMultipleRegisters(0, 7,l_ucRegDataArray);//Chip selects and sends data and disables
    
    }
    
    // Read ADC Data
    
    static int32_t daq_drv_AdcRead(uint8_t l_ucAdcChId, uint8_t l_ucTimeoutVal)
    {
        uint8_t l_ucRdyStatus = 0;
        unsigned long runningms;
        static uint8_t s_ucRegistrySwitched;
        uint8_t l_ucRegisterMap[8];
    
        
        s_ucDataTx[0] = DAQ_DRV_OPCODE_PULSE_CONVERT| DAQ_DRV_OPCODE_MUL_MASK;//Pulse convert for Reading
    
        daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataTx,1);
    
        
        //Wait for Ready Signal
        runningms = xTaskGetTickCount();
        l_ucRdyStatus=daq_drv_GPIOGet(s_stGPIOMappings,0);//Check ADC_DRDY_PIN 
        while( l_ucRdyStatus )
        {
          l_ucRdyStatus=daq_drv_GPIOGet(s_stGPIOMappings,0);
    
          if( (runningms + l_ucTimeoutVal) < xTaskGetTickCount() )
          {
            return ADC_ERROR;//Error state
          }
        }
        // Further wait, which actually not needed still kept
        vTaskDelay(12);
    
    
        // Dummy bytes for reading the Data
        s_ucDataTx[0] = 0;
        s_ucDataTx[1] = 0;
        s_ucDataTx[2] = 0;
    
        daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,3);
    
        printf("\nA[%d]:%d ",((s_ucDataRx[0] & 0x1f) - 8)/*Extract channel*/,((s_ucDataRx[1] << 8) | s_ucDataRx[2])  /*Extract Data*/) ;
        
    
        return ((s_ucDataRx[0] << 8) | s_ucDataRx[1]);  
    }

    我应用了通道 A0 连接了 1.628V、读取的值为 11528(对应于 0.72V,几乎是一半)。

    对于 A1 通道应用的 GND、ADC 读取为 65535。

    我的目的是逐个选择通道并读取它。

    当我尝试读像这样的东西时 始终提供 65535 .下面是我的代码相同。 因此进行了自动扫描 调整 RTD 电阻值。

    static void daq_drv_ADS1158Init()
    {
        uint8_t l_ucRegDataArray[10];
    
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_CONFIG0]   =   0b00100000;//Fixed ChannelMode
    
        
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_CONFIG1]   =   0;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSCH]    =   0;//DAQ_DRV_MUXSCH_DEFAULT;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXDIF]    =   0;;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSG0]    =   0;//DAQ_DRV_MUXSG0_DEFAULT;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSG1]    =   0x00;//DAQ_DRV_MUXSG1_DEFAULT;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_SYSRED]    =   0x00;//Internal Refremce
     
       daq_drv_WriteMultipleRegisters(0, 7,l_ucRegDataArray);
    
    }
    
    //Read ADC Data
    static int32_t daq_drv_AdcRead_(uint8_t l_ucAdcChId, uint8_t l_ucTimeoutVal)
    {
        uint8_t l_ucRdyStatus = 0;
        unsigned long runningms;
        static uint8_t s_ucRegistrySwitched;
        uint8_t l_ucRegisterMap[8];
    
    
        //Select Channel 
    
        if(l_ucAdcChId < 8)
        {
          if( s_ucRegistrySwitched )
          {
            // Clear the DAQ_DRV_REG_ADDR_MUXSG1
            s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | (DAQ_DRV_REG_ADDR_MUXSG1 & DAQ_DRV_OPCODE_A_MASK);
            s_ucDataTx[1] =  0;//Clear the Previous Selection of Registry
            /* Initiate transfer */
            daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
            s_ucRegistrySwitched = 0;
          }
          s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | (DAQ_DRV_REG_ADDR_MUXSG0 & DAQ_DRV_OPCODE_A_MASK);
          s_ucDataTx[1] =  (1 << l_ucAdcChId) ;
    
          /* Initiate transfer */
          daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
        }
        else
        {
          if( s_ucRegistrySwitched == 0 )
          {
            // Clear the DAQ_DRV_REG_ADDR_MUXSG0
            s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | (DAQ_DRV_REG_ADDR_MUXSG0 & DAQ_DRV_OPCODE_A_MASK);
            s_ucDataTx[1] =  0;//Clear the Previous Selection of Registry
            /* Initiate transfer */
            daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
            s_ucRegistrySwitched = 1;
          }
          s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | (DAQ_DRV_REG_ADDR_MUXSG1 & DAQ_DRV_OPCODE_A_MASK);
          s_ucDataTx[1] =  ( 1 << (l_ucAdcChId % 8) );
    
          /* Initiate transfer */
          daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);      
        }
    
    
        vTaskDelay(1);
    
        s_ucDataTx[0] = DAQ_DRV_OPCODE_PULSE_CONVERT| DAQ_DRV_OPCODE_MUL_MASK;
    
        daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataTx,1);
    
        runningms = xTaskGetTickCount();
        l_ucRdyStatus=daq_drv_GPIOGet(s_stGPIOMappings,0);//Check ADC_DRDY_PIN 
        while( l_ucRdyStatus )
        {
          l_ucRdyStatus=daq_drv_GPIOGet(s_stGPIOMappings,0);
    
          if( (runningms + l_ucTimeoutVal) < xTaskGetTickCount() )
          {
            return ADC_ERROR;//Error state
          }
        }
        vTaskDelay(12);
    
        // Dummy bytes for reading the Data
        s_ucDataTx[0] = 0;
        s_ucDataTx[1] = 0;
    
        daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
    
        printf("\nA[%d]:%d ",l_ucAdcChId,((s_ucDataRx[0] << 8) | s_ucDataRx[1]) ) ;
    
        return ((s_ucDataRx[0] << 8) | s_ucDataRx[1]);  
    }

    您的宝贵建议有助于我解决问题。

    提前感谢您的贡献 Slight smile

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

    尊敬的 Bharadwaj M N:

    您能否以十六进制形式提供正在接收的实际 ADC 代码、而不是等效的十进制代码?

    请注意、ADC 使用双极性二进制补码编码方案、因此代码范围从–2^15 扩展至+2^15。 因此、如果代码是 FFFFh、则对应于十进制值–1 代码。 此值基本上为 0、因此接地测量似乎有效

    -布莱恩

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

    您好  Bryan、

    非常感谢您的答复和澄清。

    我的问题仍然存在,这是对相同的详细解释。

    下面是我施加了精确的 4.096V 基准电压的电路。

    //Configured for Status enabled, with Channel 0 & 1 is Enabled, with Single Ended inputs only
    static void daq_drv_ADS1158Init()
    {
        uint8_t l_ucRegDataArray[10];
    
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_CONFIG0]   =   0b00000010;//Auto scan mode, with Status
         l_ucRegDataArray[DAQ_DRV_REG_ADDR_CONFIG1]   =   0;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSCH]    =   0;//DAQ_DRV_MUXSCH_DEFAULT;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXDIF]    =   0;;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSG0]    =   3;//DAQ_DRV_MUXSG0_DEFAULT;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSG1]    =   0x00;//DAQ_DRV_MUXSG1_DEFAULT;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_SYSRED]    =   0x00;//Internal Refremce
     
       daq_drv_WriteMultipleRegisters(0, 7,l_ucRegDataArray);//Chip selects and sends data and disables
    
    }
    
    // Read ADC Data
    
    static int32_t daq_drv_AdcRead(uint8_t l_ucAdcChId, uint8_t l_ucTimeoutVal)
    {
        uint8_t l_ucRdyStatus = 0;
        unsigned long runningms;
        static uint8_t s_ucRegistrySwitched;
        uint8_t l_ucRegisterMap[8];
    
        
        s_ucDataTx[0] = DAQ_DRV_OPCODE_PULSE_CONVERT| DAQ_DRV_OPCODE_MUL_MASK;//Pulse convert for Reading
    
        daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataTx,1);
    
        
        //Wait for Ready Signal
        runningms = xTaskGetTickCount();
        l_ucRdyStatus=daq_drv_GPIOGet(s_stGPIOMappings,0);//Check ADC_DRDY_PIN 
        while( l_ucRdyStatus )
        {
          l_ucRdyStatus=daq_drv_GPIOGet(s_stGPIOMappings,0);
    
          if( (runningms + l_ucTimeoutVal) < xTaskGetTickCount() )
          {
            return ADC_ERROR;//Error state
          }
        }
        // Further wait, which actually not needed still kept
        vTaskDelay(12);
    
    
        // Dummy bytes for reading the Data
        s_ucDataTx[0] = 0;
        s_ucDataTx[1] = 0;
        s_ucDataTx[2] = 0;
    
        daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,3);
    
        printf("\nA[%d]:%d ",((s_ucDataRx[0] & 0x1f) - 8)/*Extract channel*/,((s_ucDataRx[1] << 8) | s_ucDataRx[2])  /*Extract Data*/) ;
        
    
        return ((s_ucDataRx[0] << 8) | s_ucDataRx[1]);  
    }

    我应用了通道 A0 连接了 1.628V、读取的值为 11528(对应于 0.72V,几乎是一半)。

    对于 A1 应用的通道 GND、ADC 读取为 64983。

    我的目的是逐个选择通道并读取它。

    当我尝试读取像这样,它总是提供 65535。下面是我的代码相同。 因此、提供了适当值的自动扫描。

    static void daq_drv_ADS1158Init()
    {
        uint8_t l_ucRegDataArray[10];
    
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_CONFIG0]   =   0b00100000;//Fixed ChannelMode
    
        
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_CONFIG1]   =   0;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSCH]    =   0;//DAQ_DRV_MUXSCH_DEFAULT;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXDIF]    =   0;;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSG0]    =   0;//DAQ_DRV_MUXSG0_DEFAULT;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSG1]    =   0x00;//DAQ_DRV_MUXSG1_DEFAULT;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_SYSRED]    =   0x00;//Internal Refremce
     
       daq_drv_WriteMultipleRegisters(0, 7,l_ucRegDataArray);
    
    }
    
    //Read ADC Data
    static int32_t daq_drv_AdcRead_(uint8_t l_ucAdcChId, uint8_t l_ucTimeoutVal)
    {
        uint8_t l_ucRdyStatus = 0;
        unsigned long runningms;
        static uint8_t s_ucRegistrySwitched;
        uint8_t l_ucRegisterMap[8];
    
    
        //Select Channel 
    
        if(l_ucAdcChId < 8)
        {
          if( s_ucRegistrySwitched )
          {
            // Clear the DAQ_DRV_REG_ADDR_MUXSG1
            s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | (DAQ_DRV_REG_ADDR_MUXSG1 & DAQ_DRV_OPCODE_A_MASK);
            s_ucDataTx[1] =  0;//Clear the Previous Selection of Registry
            /* Initiate transfer */
            daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
            s_ucRegistrySwitched = 0;
          }
          s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | (DAQ_DRV_REG_ADDR_MUXSG0 & DAQ_DRV_OPCODE_A_MASK);
          s_ucDataTx[1] =  (1 << l_ucAdcChId) ;
    
          /* Initiate transfer */
          daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
        }
        else
        {
          if( s_ucRegistrySwitched == 0 )
          {
            // Clear the DAQ_DRV_REG_ADDR_MUXSG0
            s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | (DAQ_DRV_REG_ADDR_MUXSG0 & DAQ_DRV_OPCODE_A_MASK);
            s_ucDataTx[1] =  0;//Clear the Previous Selection of Registry
            /* Initiate transfer */
            daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
            s_ucRegistrySwitched = 1;
          }
          s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | (DAQ_DRV_REG_ADDR_MUXSG1 & DAQ_DRV_OPCODE_A_MASK);
          s_ucDataTx[1] =  ( 1 << (l_ucAdcChId % 8) );
    
          /* Initiate transfer */
          daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);      
        }
    
    
        vTaskDelay(1);
    
        s_ucDataTx[0] = DAQ_DRV_OPCODE_PULSE_CONVERT| DAQ_DRV_OPCODE_MUL_MASK;
    
        daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataTx,1);
    
        runningms = xTaskGetTickCount();
        l_ucRdyStatus=daq_drv_GPIOGet(s_stGPIOMappings,0);//Check ADC_DRDY_PIN 
        while( l_ucRdyStatus )
        {
          l_ucRdyStatus=daq_drv_GPIOGet(s_stGPIOMappings,0);
    
          if( (runningms + l_ucTimeoutVal) < xTaskGetTickCount() )
          {
            return ADC_ERROR;//Error state
          }
        }
        vTaskDelay(12);
    
        // Dummy bytes for reading the Data
        s_ucDataTx[0] = 0;
        s_ucDataTx[1] = 0;
    
        daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
    
        printf("\nA[%d]:%d ",l_ucAdcChId,((s_ucDataRx[0] << 8) | s_ucDataRx[1]) ) ;
    
        return ((s_ucDataRx[0] << 8) | s_ucDataRx[1]);  
    }

    您的宝贵建议有助于我解决问题。

    提前感谢您的贡献 Slight smile

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

    尊敬的 Bharadwaj M N:

    正如我在上一篇文章中提到的、您没有正确地将代码转换为电压

    您看到的值大致正确、因此我不太理解您的问题是什么。 您复制同一个回复将不起作用

    -布莱恩

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

    您好 Bryan、

    非常感谢您的答复。

    我明白了你所说的。 但我 还有一个问题

    1.我已经提供了 3.3V 基准电压的第二个等级 VREFP (之前我给出了 4.096,如上面的共享示意图中所示,所有连接都按原样保留)。

    我已启用 Austo 扫描模式、因此在读取数据第一个字节时、我将获得 Status 字节 、后跟 ADC 值 MSB 和 LSB。

    当我将 GND 应用于 A0 通道时会得到 0xFF44(根据文档中的表 7,我理解为正确无误,如您在上文中所述)。

    当我向通道 A0 应用~0.8V(在万用表中读取)时、其读数为 0x1D01、这相当于 ( 3.3 /*我的 基准电压*/  / 65535 /*ADC 16 位值*/  *  0x1D01 )、相当于 0.37388V ADC 读取值、此处不正确。(我测量 VREFP 与万用表、为 3.3V 正确)。

    我无法理解为什么这些值不正确、这几乎是所应用值的一半。

    static void daq_drv_ADS1158Init()
    {
        uint8_t l_ucRegDataArray[10];
    
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_CONFIG0]   =   0b00000010;//auto with status
      
        
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_CONFIG1]   =   0x03;//DAQ_DRV_CONFIG1_DRATE_125000SPS;//Highest data rate
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSCH]    =   0x00;//DAQ_DRV_MUXSCH_DEFAULT;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXDIF]    =   0;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSG0]    =   7;Enabled A0,A1,A2 only
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSG1]    =   0x00;//DAQ_DRV_MUXSG1_DEFAULT;
        l_ucRegDataArray[DAQ_DRV_REG_ADDR_SYSRED]    =   0x00;//Internal Refremce
     
       daq_drv_WriteMultipleRegisters(0, 7,l_ucRegDataArray);
    
    }
    
    static int32_t daq_drv_AdcRead(uint8_t l_ucAdcChId, uint8_t l_ucTimeoutVal)
    {
        uint8_t l_ucRdyStatus = 0;
        unsigned long runningms;
        static uint8_t s_ucRegistrySwitched;
        uint8_t l_ucRegisterMap[8];
      
    
        s_ucDataTx[0] = DAQ_DRV_OPCODE_PULSE_CONVERT | DAQ_DRV_OPCODE_MUL_MASK;
    
        daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataTx,1);
    
        runningms = xTaskGetTickCount();
        l_ucRdyStatus=daq_drv_GPIOGet(s_stGPIOMappings,0);//Check ADC_DRDY_PIN 
        while( l_ucRdyStatus )
        {
          l_ucRdyStatus=daq_drv_GPIOGet(s_stGPIOMappings,0);
    
          if( (runningms + l_ucTimeoutVal) < xTaskGetTickCount() )
          {
            return ADC_ERROR;//Error state
          }
        }
        vTaskDelay(1);
       
        // Dummy bytes for reading the Data
        s_ucDataTx[0] = 0;
        s_ucDataTx[1] = 0;
        s_ucDataTx[2] = 0;
    
        daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,3);
        uint16_t l_ucVal;
        float l_fVal;
    
    
    
        l_ucVal = ((s_ucDataRx[1] << 8) | s_ucDataRx[2]) & 0Xffff;
        
        l_ucVal = (l_ucVal & 0X8000)?0:l_ucVal;// To Check if GND Applied 
        l_fVal = (((0.0000503547722590981) * l_ucVal) );
        
    
        printf("\nA[%d]:%d,%04X , %f",((s_ucDataRx[0] & 0x1f)/* Extract Channel */ - 8/*Since Single Channel subtract by 8 */),l_ucVal ,l_ucVal, l_fVal ) ;
        //printf("\nA[%d]:%d %04X",((s_ucDataRx[0] & 0x1f) - 8),l_ucVal , l_ucVal  ) ;
        
    
        return ((s_ucDataRx[1] << 8) | s_ucDataRx[2]);  
    }

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

    尊敬的 Bharadwaj M N:

    如前所述、如数据表中所示、代码范围从–2^15(负满标度,即- FS) 扩展)扩展到+2^15(正满标度,即+ FS)。 这对应于–1.0666*VREF 至+1.0666*VREF 的电压范围。  因此、满量程范围 (FSR)= FS - FS、或者仅为 2* FS

    LSB 大小为 FSR / 2^16、因为您使用的是 16 位 ADC。 在本例中、LSB = 2 * 1.06666 * 3.3 / 2^16 = 107.42uV

    您的代码 1D01h = 7425d。 如果将代码乘以 LSB 大小、将得到测得的电压。 因此、7425 * 107.42uV = 0.797V、这是您施加到 ADC 的输入电压。 所以一切都好

    -布莱恩

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

    您好  Bryan、

    感谢您的答复。 我很抱歉 的回复非常延迟,我是完全繁忙的,从过去几个星期。

    我感谢您的时间和宝贵的帮助、因为评估板已经被吹嘘、我没有机会重新检查相同的结果。

    我会在未来几天内收到新电路板后进行确认。

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

    尊敬的  Bharadwaj M N:

    明白了、我们将等待您的更新

    -布莱恩