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.

[参考译文] ADS1220:ADC 分辨率和采样率

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/753970/ads1220-adc-resolution-and-sampling-rate

器件型号:ADS1220

您好!

我想问以下问题:

我要求在>= 300SPS 时使用 SPS。


如果我选择 PGA = 1和 SPS = 330、我可以预期数据表中所示的17.7 ENOB。 但是、如果我有两个正在进行多路复用的输入、那么每个输入的采样率是否为175SPS? 因此、采样率将被输入除以。
如果是这种情况、我是否必须选择 SPS = 600才能使每个输入达到300SPS?  

此外、随着采样率的函数、ENOB 也会降低。 是否可以使用外部时钟以相同的 SPS 获得更高的 ENOB?

此致、

Sadoun Anayati

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

    是的、如果您在2个输入通道之间循环多路复用、则两个通道的吞吐率将是所选数据速率的1/2。 就17.7的 ENOB 而言、这适用于2.048V 内部基准。 ENOB 可能更好或更差、具体取决于您要使用的基准电压。

    您应该最关心的是噪声。 您的实际结果将取决于输入源是什么以及是否存在与输入源相关的噪声。 通常情况下、这是一个限制因素。 ADS1220将具有转换噪声、该噪声在 ENOB 表旁边的表格中进行了说明。 ENOB 数取自噪声。 降低 ADS1220噪声的一种方法是使用 Turbo 模式。 在 Turbo 模式和660sps 数据速率下、ENOB 为17.87。

    至于使用外部时钟输入、可应用的最大时钟为4.5MHz。 数据表噪声表基于4.096MHz。 数据速率将按外部时钟与4.096MHz 值的比例进行缩放。 使用4.5MHz 只会影响大约+10%的数据速率。

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

    感谢 Bob、这对我有所帮助。

    我有另一个问题。 我通过 SPI 通信将 PSoC 连接到 ADS1220。 从 ADS1220接收数据时、数据通过 UART 发送到 Matlab。 但是、分辨率非常差。 我有很大的台阶。 您有什么想法吗? 我已经连接了 ADC 的硬件配置、 这是 PSoC 中的代码:

    #include "project.h"
    #include "stdio.h"
    #include 
    #include 
    
    
    #define false 0
    #define true 1
    #define Transmit 缓冲区_size 4
    
    uint32 dummy = 0;
    
    int main (void)
    {
    
    /*用于存储 ADC 结果的变量*/
    int OutputBuffer[3];
    Int32输出= 0B000000000000000000000000000000000000000000000000000000000000;
    Int32测试= 0;
    Int32检查= 0B0000000000000000000000000000000000000000000000000000000000000000;
    
    Int32取消;
    /*用于存储 UART 接收到的字符的变量*/
    uint8通道;
    
    /*用于存储传输数据命令的标志*/
    uint8 ContinuouslySendData;
    UINT8 SendSingleByte;
    uint8 SendEmulatedData;
    /*发送缓冲器*/
    
    字符 TransmitBuffer[1];
    
    /*启动组件*/
    
    UART_1_Start();
    spim_Start();
    
    /*初始化变量*/
    ContinuouslySendData = false;
    SendSingleByte = false;
    SendEmulatedData = false;
    uint8 resetData = true;
    
    
    /*开始 ADC 转换*/
    ADC_DelSig_1_StartConvert ();
    
    /*发送消息以验证 COM 端口是否正确连接*/
    UART_1_PutString ("COM 端口打开");
    
    
    GlobalCyIntEnable;//启用全局中断。 *
    
    //将初始化/启动代码放在此处(例如 MyInst_Start())*/
    
    
    SPIM_WriteTxData (0B00000110);//重置 ADC
    CyDelayU (1000);
    SPIM_WriteTxData (0B00001000);//启动 ADC
    
    
    //配置控制寄存器:
    
    SPIM_WriteTxData (01B00001)
    
    
    ;SPIM_WriteTx100(01B0B1000);SPIM_WriteData (01B100R1TxR1TxR1R1Tx1000);SPIM_WriteData (01B0B1TxR1R1R1R1R1Tx100)0B0B100TxR1TxR1TxR1TxR1TxR1TxR1R1R1TxData
    //R3
    
    
    
    
    int I = 0;
    
    LED_Write (0);
    for (I = 0;I<6;I++)
    {
    LED_Write (!LED_READ ()));
    CyDelay(300);
    
    }
    
    for (;;)
    {
    
    
    /*获取接收到的最新数据的非阻塞呼叫*/
    CH = UART_1_GetChar ();
    
    /*根据 UART 命令设置标志*/
    
    开关(通道)
    {
    情况0:
    
    中断;
    案例"C":
    案例'c':
    SendSingleByte = true;
    中断;
    案例"S":
    案例"S":
    ContinuouslySendData = true;
    中断;
    案例"X":
    案例"x":
    ContinuouslySendData = false;
    中断;
    案例"E":
    案例"e":
    SendEmulatedData = true;
    中断;
    默认值:
    
    中断;
    }
    
    
    
    Læse μ s ADC 输出
    spim_WriteTxData (0x10);// SPIM_WriteTxData (0x23);
    spim_WriteTxData (0x00000000);
    spim_WriteTxData (0x00000000);
    spim_WriteTxData (0x00000000);
    
    
    
    
    
    
    
    //
    for (int i = 0;i<2;i++)
    {
    OutputBuffer[i]=(OutputBuffer[i]& 0B00000000);
    }
    输出=(Output & 0B000000000000000000000000000000000000000000000000000000000000000000000000);
    
    
    OutputBuffer[0]= SPIM_ReadRxData ();
    OutputBuffer[1]= SPBIM_ReadRxOutputBuffer[OutputBuffer
    
    
    
    
    = SPOutputData](OutputRX]= SPOutputData[OutputRX];OutputBuffer[OutputBuffer]]= OutputData](OutputRxOutputBuff
    输出=输出<< 8;
    输出+= OutputBuffer[1];
    输出=输出<< 8;
    输出+= OutputBuffer[0];
    
    输出=输出& 0B000000001111111111111111111111111111111111111111;
    
    
    
    if (ContinuouslySendData = true)
    {
    UART_1_ClearTxBuffer ();
    //UART_1_PutString (TransmitBuffer);
    
    
    
    
    UART_1_PutChar (输出);
    UART_1_PutChar (输出>>8);
    UART_1_PutChar (输出>>16);
    UART_1_PutChar (输出>>24);
    
    
    
    
    LED_Write (1);
    CyDelay (35);
    UART_1_ClearTxBuffer();
    
    }
    else
    {
    UART_1_ClearTxBuffer();
    LED_Write (0);
    }
    
    
    
    
    
    
    
    
    
    } 



    Matlab 串行通信的配置如下:

    serial_PSoC =串行('COM1'、'budrate'、115200、'Parity、'none'、'DataBits'、8、'topBits'、1);
    SET (serial_PSoC、'InputBufferSize'、4096、'ByteOrder、'LittleEndian');

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

     我忘记附上 Matlab 结果的图片。 垂直轴是分辨率、水平轴是样本。

    再次感谢你。

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

    我注意到的第一件事是、您将 DRDY 连接到+5V。 DRDY 是一个有源驱动输出。 当 DRDY 进入低电平状态时、电源将短接至 GND。 很可能是部件损坏。

    我不熟悉 PSoC 操作。 如果同时具有发送和接收缓冲 FIFO、则不会清除。 对于许多处理器、您需要在 TX 缓冲区中的字节传输后读取 RX 的内容、以在发送和接收之间保持某种形式的同步。 在 TX 缓冲区完全传输之前、很可能会尝试读取 RX 缓冲区。

    如果 RX 数据位于 FIFO 中、那么您可以按照发送的方式读取数据、即 MSB 优先。 在代码中、您将反向汇编字节。

    ADS1220将结果作为二进制补码发送。 您需要将结果正确地符号扩展到32位变量。

    不清楚在注释掉代码时使用的寄存器设置是什么。 您还不清楚如何确定何时可以从 ADS1220读取结果。 ADS1220的输入电压是多少?因此您期望得到什么?

    我建议使用示波器或逻辑分析仪来验证您的通信和时序。 然后、您可以比较示波器上看到的数据并与传输的结果进行比较。 我猜由于代码相对于微外设自动操作的顺序性质、您会遇到许多计时错误。

    此致、
    Bob B
x 出现错误。请重试或与管理员联系。