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:如何在高达5V 的电压上改变 Vref 以用于外部基准

Guru**** 2394305 points
Other Parts Discussed in Thread: ADS1220

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/715920/ads1220-how-to-vary-vref-on-upto-5v-for-external-reference

器件型号:ADS1220

尊敬的先生:

  我想通过 refp0和 refn0提供5V 的外部基准电压来使用 ads1220我参考了中的 ads1220数据表、要使用外部基准、前面提到过要设置位6、7选择的寄存器设置、但我不理解如何为外部基准设置寄存器设置 进行编程。  

 请帮助我解决我刚开始编程时遇到的问题

    谢谢

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

    了解用于写入和读取电阻器的命令的最佳帮助是查看 ADS1220数据表。 表14的第36页列出了所有器件命令。 如果您已经从 ADS1220中读取数据或发出 START 等命令、则其概念非常相似。 8.5.3.6提供了有关 WREG 命令的详细信息。

    WREG 命令从0x40开始、但低4位决定了要从哪个寄存器开始以及将写入多少个寄存器。 0x40写入一个从配置寄存器0开始的寄存器。 从寄存器2开始向一个寄存器写入的值为0x40 + 0x08或0x48。 该命令本身就是寄存器写入命令(0x40)+起始寄存器内容左移2 (2 << 2 = 8)+要写入的寄存器数量小于1 (1 - 1 = 0)或0x48。 0x48是后跟数据的命令字。 我将使用虚构的命令 setCSlow()、setCShigh 和 SPIsend()作为示例函数:
    setCSlow ();//将 ADS1220的 CS 引脚设置为低电平
    SPISEND (0x48);//从寄存器2开始向1寄存器写入 WREG 命令
    SPIsend (0x40);//选择 REF0基准对作为器件基准0100 0000、其中位7:6被设定为 REF0
    setCShigh ();//将 ADS1220的 CS 引脚设置为高电平

    有关此主题的任何其他问题、请使用"回复"按钮

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

    您好、先生、

     我在外部参考引用期间遇到问题我添加了写寄存器配置、您在上一篇文章中告诉我、当我为类似输入(Ain0)提供大于3V 的电压时、我将获得5V 的输出电压。 我不知道我在哪里犯错、我将 AVDD=5V、refp0=5V 和 refn0作为接地。

    这是我上传至 Arduino nano 电路板的代码

    #include "Protocentral_ADS1220.h"
    #include

    #define PGA 1 //可编程增益= 1.
    //#define VREF 2.048 // 2.048V 内部基准
    #define ADS1220_VREF_EX_DED 0x40
    #define ADS1220_VREF_EX_DED 5.000
    #define VFSR ADS1220_VREF_EX_DED/PGA
    //#define VFSR VREF/PGA
    #define full_scale (((long int) 1<<23)-1)
    uint8_t _address;
    #define ADS1220_CS_PIN 7
    #define ADS1220_DRDY_PIN 6.

    //#define WREG 0x50
    #define CONFIG_REG2_ADDRESS 0x10
    Protocentr_ADS1220 PC_ads1220;

    int32_t ADC_data;
    void writeRegister (uint8_t address、uint8_t value){
    延迟(10);
    digitalWrite (ADS1220_CS_PIN、LOW);
    延迟(10);
    SPI.transfer (WREG|address);//发送第一个命令字节、寄存器的地址
    SPI.transfer (0x48);//发送第二个命令字节、只写一个寄存器
    SPI.transfer (0x40);//为寄存器写入数据(1字节)
    延迟(10);
    digitalWrite (ADS1220_CS_PIN、高电平);


    void setup()


    Serial.begin(9600);
    pc_ads1220.begin(ADS1220_CS_PIN,ADS1220_DRDY_PIN);

    writeRegister (CONFIG_REG2_ADDRESS、0x48);
    pc_ads1220.set_data_rate(DR_330SPS);
    pc_ads1220.set_pga_gain(PGA_GAIN_1);

    pc_ads1220.set_conv_mode_single_shot();//设置单次触发模式

    void loop()


    ADC_DATA=PC_ads1220.Read_SingleShot_SingleEnded_WaitForData (MUX_SE_CH0);
    serial.print ("\n\nCh1 (mV):");
    serial.print (convertToMilliV (adc_data));
    延迟(100);

    ADC_DATA=PC_ads1220.Read_SingleShot_SingleEnded_WaitForData (MUX_SE_CH1);
    serial.print ("\nCh2 (mV):");
    serial.print (convertToMilliV (adc_data));
    延迟(100);

    ADC_DATA=PC_ads1220.Read_SingleShot_SingleEnded_WaitForData (MUX_SE_CH2);
    serial.print ("\nCh3 (mV):");
    serial.print (convertToMilliV (adc_data));
    延迟(100);

    ADC_DATA=PC_ads1220.Read_SingleShot_SingleEnded_WaitForData (MUX_SE_CH3);
    serial.print ("\nCh4 (mV):");
    serial.print (convertToMilliV (adc_data));
    延迟(100);

    浮点转换 ToMilliV (int32_t i32data)

    return (float)((i32data*VFSR*1000)/full_scale);

    这是我在 AVDD=5V 时获得的串行监视器输出

    配置寄存器:

    0

    0

    0

    0

    CH1 (MV):5000.00

    CH2 (MV):5000.00

    CH3 (MV):5000.00

    CH4 (MV):5000.00

    CH1 (MV):5000.00

    CH2 (MV):5000.00

    CH3 (MV):5000.00

    CH4 (MV):5000.00

    串行监视器以同样的方式输出我在 DVDD=5V 时获得的值、如所示

    配置寄存器:

    0

    4.

    10.

    0

    CH1 (MV):5000.00

    CH2(MV):-353.00

    CH3(MV):5000.00

    Ch4 (MV):-353.00

    CH1 (MV):5000.00

    CH2(MV):-353.00

    CH3(MV):5000.00

    Ch4 (MV):-353.00

       谢谢主席先生

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

    您好、Anitha、

    我想我对正在发生的情况有更好的理解。  TI 不制造 ProtoCentral 板或支持 ProtoCentral Arduino 代码。  您似乎正在尝试使用我与 ProtoCentral (PC)代码一起讨论的方法与器件通信。  您可能应该坚持使用一种方法或另一种方法。  由于您的大多数应用程序似乎都在使用 PC 代码、因此让我们从那里开始。

    让我们从代码顶部一直到最后进行工作

    • 在第11行中、您声明一个名为_address 的无符号 int、但它从未使用
    • 在第16行中、您将 CONFIG_REG2_ADDRESS 定义为0x10、但 ADS1220总共只有4个寄存器。  该地址应为0x02。  在 PC 头文件中、这已经为您定义、因此您不应再次定义它。  我想您可能已经将寄存器地址与默认寄存器内容混淆了。  因此、删除此行。
    • 在第20行中、您创建了一个已在 PC 代码中创建的新函数、这是不必要的。  此外、该函数不正确、因为您正在发送3个字节而不是2个字节。  删除此功能。
    • 在设置函数行38内调用上述函数、我已经声明该函数不正确。  相反、使用 PC 写入寄存器命令:PC_ads1220.writeRegister (CONFIG_REG2_ADDRESS、0x40);//将基准设置为 REF0输入
    • 此外,通过添加以下命令来禁用和关闭用于单端测量的 PGA:PC_ads1220.PGA_OFF ();

    我认为您的其余命令/函数都可以、您应该通过上述建议的更改获得正确的结果。

    此致、

    Bob B

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

    您好、先生、

     谢谢您的建议 、我对代码进行了更改、因为您在上一篇文章中建议 您可以获得大于2.048V 基准的输出、但存在问题、我不知道为什么当输入电压变化 AIN0、1、2、3等时、  从1到5V、并不断将 vrefp0保持为5V、在串行监控器中获取输出如所示

    对于 AIN = 1V (AIN0&2=1V 且 AIN1&3接地)、串行监控器输出如下:

    CH1 (MV):614

    CH2 (MV):-369

    CH3 (MV):609

    Ch4 (MV):-366

    对于 AIN = 1.5V (AIN0&2 = 1.5V 且 AIN1&3接地)、串行监控器输出如下:

    CH1 (MV):1156

    CH2 (MV):-369

    CH3 (MV):1152

    Ch4 (MV):-366

    对于 AIN = 2V (AIN0&2 = 2V 且 AIN1&3接地)、串行监控器中的输出为:

    CH1 (MV):1697

    CH2 (MV):-376

    CH3 (MV):1667

    Ch4 (MV):-373

    对于 AIN = 2.5V (AIN0&2 = 2.5V 且 AIN1&3接地)、串行监控器输出如下:

    CH1 (MV):2215

    CH2 (MV):-376

    CH3 (MV):2211

    Ch4 (MV):-373

    对于 AIN = 4V (AIN0&2=4V 且 AIN1&3接地)、串行监控器输出如下:

    CH1 (MV):3850

    CH2 (MV):-375

    CH3 (MV):3849

    Ch4 (MV):-372

    我不知道为什么会出现这种下降、变化也不是恒定的、请帮助我解决这一问题。

                         谢谢主席先生

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

    您好、Anitha、

    我很高兴听到您正在取得一些进展。  至于您在电压测量方面看到的情况、请注意接地的通道(AIN1和 AIN3)为负。  相对于接地(ADS1220的 AVSS 应接地)测量的单端测量应仅具有正代码。  我们看到的是一个测量结果、该测量结果似乎将 ESD 二极管导通至接地以下并产生负电压。  这意味着您使用的电压源的输出未连接到与 ADS1220接地相同的接地端。

    通过获取 AIN0和 AIN1的差值也可以验证这一点、您将看到更接近您所期望的电压的电压。  确保您用于模拟输入的电压源与 ADS1220的模拟接地(AVSS)之间的导线(-)连接良好。

    此致、

    Bob B

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

    您好、先生、

      感谢您的响应。 SIR、我已将所有通道(AIN0、AIN1、AIN2、AIN3)连接到正电压、因为我想将其从1-5V 变化、其中 vrefp0为5V、vrefn0为接地、而 DVDD = 5V、并在 Arduino nano 中稳定至接地。 我没有使用 AVDD、

    串行监视器中的输出显示为:

    如果 AIN0=AIN1=AIN2=AIN3=1V                    

    CH1(MV): 625

    CH2(MV): 625

    CH3MV: 624

    CH4 (MV): 623

    如果 AIN0=AIN1=AIN1=AIN2=AIN3=1.5V  

    CH1(MV): 1171.

    CH2(MV): 1171.

    CH3MV:1170

    Ch4 (MV): 1168.

    如果 AIN0=AIN1=AIN2=AIN3=2V       

    CH1MV: 1719

    CH2(MV): 1719

    CH3MV:1719

    CH4 (MV): 1716

    如果 AIN0=AIN1=AIN1=AIN2=AIN3=3V                    

    CH1(MV): 2827.

    CH2(MV): 2827.

    CH3MV: 2827

    CH4 (MV): 2826

    如果 AIN0=AIN1=AIN2=AIN3=4V    

    CH1(MV): 3913.

    CH2(MV): 3913.

    CH3(MV): 3912.

    CH4 (MV): 3912

    如果 AIN0=AIN1=AIN1=AIN2=AIN3=5V    

    CH1(MV): 4837

    CH2(MV): 4837

    CH3MV: 4837

    CH4 (MV): 4836

     当我将 AGND 与 Arduino nano Ground 以及 DGND 一起包含在上述连接中时

    串行监视器输出显示为、

    如果 AIN0=AIN1=AIN2=AIN3=1V                    

    CH1(MV): 1095

    CH2(MV): 1094

    CH3MV: 1095

    Ch4 (MV): 1094

    如果 AIN0=AIN1=AIN1=AIN2=AIN3=1.5V  

    CH1(MV): 1631

    CH2(MV): 1630

    CH3MV:1631

    Ch4 (MV): 1631

    如果 AIN0=AIN1=AIN2=AIN3=2V       

    CH1(MV): 2168.

    CH2(MV): 2167

    CH3MV:2168.

    CH4 (MV): 2168

    如果 AIN0=AIN1=AIN1=AIN2=AIN3=3V                    

    CH1(MV): 3253.

    CH2(MV):3253.

    CH3(MV): 3252.

    CH4 (MV): 3252

    如果 AIN0=AIN1=AIN2=AIN3=4V    

    CH1(MV): 4322

    CH2(MV): 4322

    CH3MV: 4321

    CH4 (MV): 4321

    如果 AIN0=AIN1=AIN1=AIN2=AIN3=5V

    CH1(MV):5000

    CH2(MV): 5000

    CH3(MV): 5000

    CH4 (MV): 5000

         当 im 使用2.048的内部基准电压时、输出显示为

    如果 AIN0=AIN1=AIN2=AIN3=1V

    CH1(MV):1009.

    CH2(MV): 1009.

    CH3(MV): 1009.

    Ch4 (MV): 1009.

    如果 AIN0=AIN1=AIN1=AIN2=AIN3=1.5V

    CH1(MV):1506.

    CH2(MV):1506.

    CH3(MV): 1506.

    Ch4 (MV): 1506.

    如果 AIN0=AIN1=AIN2=AIN3=2V

    CH1(MV):2001

    CH2(MV): 2002

    CH3(MV): 2002

    Ch4 (MV): 2001年

    为什么在使用外部基准引脚 ref0和 refn0时会发生这种变化?

     外部基准以及内部基准中获得的结果是否可能与我希望根据给定输入提供的输出电压相同、请建议我这样做。

                    谢谢先生、  

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

    您好、Anitha、

    仍然不清楚如何连接 ADS1220。  AVDD 必须连接至5V、AVSS 必须连接至接地。  此外、您的模拟输入电压源还必须连接 AINx 引脚和 AVSS (应接地)之间。  您是否有任何设置图片?  您能告诉我 ADS1220的每个引脚连接了什么?

    很明显、由于接地未正确连接、因此一开始未正确连接 ADS1220。  您可能已损坏 ADS1220。  因此、很难说您是否仍然存在连接问题或设备是否损坏。

    此致、

    Bob B

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

     您好、先生、

      这些是我从 Arduino 微型板到 ADS1220的连接

    |ADS1220引脚标签|引脚功能|Arduino 连接|

    | DRDY |数据就绪输出引脚| D6 |
    | MISO |从器件输出| D12 |
    | MOSI |从器件输入| D11 |
    | SCLK |串行时钟| D13 |
    | CS |芯片选择| D7 |
    | DVDD |数字 VDD |+5V |
    | DGND |数字 GND | GND |
     | AVDD |模拟 VDD |-|
     | AGND |模拟 GND |-  
      AN0-AN3      |模拟输入      | 模拟输入   

     我离开 AN0-AN3时未连接到 Arduino nano、我看到串行监视器输出沿着 ch0、1、2、3为2.048V、用于内部基准

    对于外部基准、我将 refp0保持为5V 恒定、将 DVDD 保持为5V、并且我希望将输入电压从1-5V 更改为 ADs1220的模拟引脚、即 AIN0、1通过电源提供的变化电压(1-5V)、并保持 AIN2、3接地、然后串行监视器显示为 CH0、1、000、当 AIN0=AIN1时为614mv 对于 AIN0=AIN1=2V、ch0、1为1648mv、其中 AIN2和 AIN3为接地、然后输出 ch2、3为-20mV。 由于我想连续读取所有4个通道、我为 AIN (模拟输入)提供了不同的电压。 在以前的帖子中、我附加了我正在使用的代码。 当我将 ads1220的 AGND 指定为 Arduino GND 并进行上述连接以进行单端测量时、我观察到、对于 AIN0=AIN1=AIN1=AIN2=AIN3=1V、对于 AIN0=AIN1=AIN1=AIN2=AIN3=2V,CH0.1,2100mv、串行监视器显示为 ch0.1mv。 我想验证我在串行监视器上读取的通道电压是否正确,请告诉我如何验证。  

                 谢谢先生、

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

    所有 ADS1220电源引脚必须连接到适当的电压源、ADS1220才能正常工作。 这意味着模拟电源和数字电源都必须连接到电压源。 不能将 AVDD 和 AVSS 保持断开状态、否则会导致 ADS1220受损。 您应将 AVDD 连接到 Arduino +5V、将 AVSS 连接到 Arduino 的 GND。

    您的结果表明、ADS1220读数大约被模拟输入的 ESD 二极管压降所抵消。 这意味着您是通过模拟输入而不是通过 AVDD/AVSS 引脚为器件供电。 这超过了 ADS1220的绝对最大额定值、ADS1220可能已经损坏了器件。

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

    您好、先生、

     我更改了 IC、并给出了从 Arduino nano 到 ads1220 IC 的连接、如所示

       |ADS1220 引脚标签|引脚功能|Arduino 连接|

    | DRDY |数据就绪输出引脚| D6 |
    | MISO |从器件输出| D12 |
    | MOSI |从器件输入| D11 |
    | SCLK |串行时钟| D13 |
    | CS |芯片选择| D7 |
    | DVDD |数字 VDD |+5V |
    | DGND |数字 GND | GND |

    |AVDD|模拟 VDD|+5V|

    |AGN|Analog GND|GND  

     我保持 ref0和 AVDD、DVDD=5V 恒定、因为我想将使用电源的电压从0-5V 变为 AN0、1、2、3连接到正极端子、并且接地时、观察串行监控器输出、正如我在前面的文章中提到的那样、用于外部参考。 在内部基准期间、输出正常、但对于外部基准、问题发生在哪里。 为什么会出现变化? 是否存在任何连接问题、请向我解释。

       

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

    在您的连接列表中、您会显示来自 ADS1220的 AGND。 由于 ADS1220上没有 AGND 引脚、我将假设这是 AVSS。

    此外、由于您进行了许多更改、您未提供有关您所施加的输入电压和您所看到的输出的新数据。 您仍然没有解释如何将用作输入源的电压源连接到您的设置。 您能否拍摄您的设置图片并将其与一些新数据一起附加到您的帖子?

    由于您过去遇到过连接问题、我将假定仍然存在连接问题。 还可能存在代码问题。 您在内部基准和外部基准之间进行了哪些具体更改。 在查看您最初发送的代码时、我看到您已定义 ADS1220_VREF_EX_DED 两次。 这应该会导致错误、并且不清楚如何进行计算。 通常、通过查看 ADS1220中的原始数据而不是计算数据、可以更轻松地解决问题。

    此致、
    Bob B