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.

[参考译文] ADS1231:否

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/733779/ads1231-no

器件型号:ADS1231
主题中讨论的其他器件: ADS122C04

你好

I m Uday、

我使用 adds1231进行数据转换、我的问题是什么  

1) 1)如果 ADS1231不支持 I2C 通信且支持2线 制串行数字接口、那么我必须从哪两个引脚与控制器通信?

2) 2) 能否将这两个引脚连接到控制器的 SPI 线路?

3) 3)如果 SPI 连接是,则 ADS1231哪条线路用作芯片选择?

请尽快为我的库提供解决方案。

谢谢你。

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

    欢迎来到 E2E 论坛! ADS1231是一款使用模式1的 SPI 兼容通信器件。 ADS1231不通过 I2C 进行通信(对于24位 I2C ADC、请参阅 ADS122C04)。

    要连接到您的微控制器、请将 SCLK 连接到微 SCLK、并将 ADS1231的 DRDY/DOUT 引脚连接到微 MISO 引脚。 由于 ADS1231没有用于接收数据的输入引脚、也没有使用 CS (因为它始终处于 CS 模式)、因此微控制器上的 MOSI 和 CS 线路将保持断开状态。

    要启动 SCLK、您需要向 SPI TX 缓冲区写入虚拟字节、即使 MOSI 线路未连接任何内容。 这是微控制器启动 SCLK 的方式。 发送完所有时钟后、读取 RX 缓冲器数据。 如果您的微控制器以字节增量发送时钟、则需要执行此操作三次。

    另一种更密集的代码方法是使用2个 GPIO 并通过将一个 GPIO 用作切换 SCLK 线路的输出来对端口进行位感叹号。 在用作连接到 DRDY/DOUT 的输入的第二个 GPIO 引脚上读取数据。 应在 SCLK 的下降沿之后、但在 SCLK 的下一个上升沿之前读取该引脚。

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

    尊敬的 Bob:

      我尝试使用 Bit-bang 方法、但无法读取数据、我根据数据表电路图连接了引脚、但始终得到零值(随附 Arduino 代码)。

    #define data 2
    #define clock 3
    
    uint32_t data=0;
    
    void setup(){
    //将设置代码放在此处,运行一次:
    pinMode (data、input);
    pinMode (clock、output);
    digitalWrite (clock、low);
    Serial.begin(115200);
    Serial.print ("WeightSensor\n");
    }
    
    void loop(){
    //将主代码放在此处,重复运行:
    serial.println ("正在等待 ADS1231");
    while (digitalRead (data)=HIGH);//等待 IC 就绪
    Serial.println ("正在读取数据...");
    for (char i=24;i>=0;i++) //将数据加载到缓冲
    区{
    digitalWrite (clock、high);
    digitalWrite (clock、low);
    
    if (digitalRead (data)=高电平)
    Data|=(1 << i);
    其他
    Data&=~(1 << i);
    }
    Serial.println (data);
    delay (1000);
    } 

    谢谢、此致、

    Vijay Rakesh

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

    您好、Vijay、

    如何连接 ADS1231的其余引脚?  AVDD 和 DVDD 都必须通电、并且还必须施加基准电压。  必须连接数字引脚 PDWN 和 SPEED。  PDWN 引脚应处于高电平、否则器件将处于断电状态。

    您的代码存在几个问题。  我建议使用示波器或逻辑分析仪监控通信、以验证通信。  在"for"循环中、您从位24开始、似乎循环将继续而不停止。  因此、您应该递减而不是递增"i"。  

    您还应该从23开始、这样您就不会将值移位太远且超过24位。  每次读取数据时、还应重置数据值、以确保数据读取过程中没有错误。  如果您不清除它、则在下一个周期中、前一个数据的8位将会结束。

    我还建议在读取数据结果后添加第25个时钟、以强制 DRDY/DOUT 进入高电平状态、否则 DRDY/DOUT 将处于转换结果的最后一位的最后一个状态、该位可以是高电平或低电平。  请参阅 ADS1231数据表第13页的数据检索部分。

    您可能还需要在将时钟设置为高电平然后将时钟设置为低电平之间添加延迟。  根据处理器的速度、转换可能太快。  SCLK 高电平时间必须至少为100ns。  ADS1231数据表第13页的图19也显示了这一点。

    您的代码可能与此类似(我没有验证方法、但应该接近。)

    void loop(){
    //将主代码放在此处,重复运行:
    serial.println ("正在等待 ADS1231");
    while (digitalRead (data)=HIGH);//等待 IC 就绪
    Serial.println ("正在读取数据...");
    data = 0;
    for (char i=23;i>=0);i>-I //将数据加载到缓冲
    区{
    digitalWrite (clock、high);
    //在时钟高电平和时钟低电平之间可能需要一些延迟必须至少为100ns
    digitalWrite (clock、low);
    
    if (digitalRead (data)=高电平)
    Data|=(1 << i);
    其他
    Data&=~(1 << i);
    }
    //添加第25个时钟以强制 DRDY/DOUT 为高电平
    digitalWrite (clock、high);
    //在时钟高电平和时钟低电平之间可能需要一些延迟必须至少为100ns
    digitalWrite (clock、low);
    //数据是一个32位值、但 ADS1231是二进制补码24位数据、因此负值需要正确进行符号扩展
    //如果结果为负,则需要添加其他代码。
    serial.println (data);
    delay (1000);
    } 

    请注意、我在代码片段中提到了符号扩展。  您将'data'变量定义为无符号32位整数、但 ADS1231使用 MSB 作为符号位将数据输出为二进制补码。  为了利用这一优势、您需要将变量更改为有符号整数、然后对24位值进行正确的符号扩展、使其达到有符号32位值。  因此、如果位23为高电平(位从0到23总共24个)、则应将值0xFF000000添加或"或"添加到您的'data'变量。  这就是将符号位扩展到完整32位字的方法。

    此致、

    Bob B

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

    感谢您的宝贵建议、我还有另外一个问题、如何计算比例? 我需要最低0.1克的精度。

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

    您好、Vijay、

    ADS1231将模拟输入电压转换为代码。  分辨率将与 ADC 的噪声和任何系统噪声相关。  如果我们假设系统噪声等于或小于转换噪声(这是最好的可能情况、最有可能是噪声更糟)、则可以确定结果、但您必须进行一些转换。

    精度与校准有关。  我想您真正需要的是0.1g 的精度或可重复性。  可重复性的公式是称重传感器的最大重量除以称重传感器的最大输出电压(或称重传感器的灵敏度、以 mV/V 乘以激励电压)、再乘以所用数据速率下 ADC 的峰峰值噪声。  

    例如、假设我们使用的是重量为10kg 的称重传感器、其灵敏度为2mV/V、励磁电压为5V。  如果 ADS1231设置为使用10sps、则 ADS1231数据表表表1中的噪声为231.9nV 峰峰值。  为了计算最佳的可重复性、我们发现:

    可重复性= 10kg /(2mV/V * 5V)* 231.9nV = 10kg / 10mV * 231.9nV = 0.232g  

    因此、在此用例中、您无法在不抑制噪声的情况下实现所需的0.1g 可重复分辨率。  降低噪声的一种方法是平均。  因此、根据噪声和可应用的最大称重传感器重量、您将看到不同的可重复性结果。

    与 ADC 输出代码相关的实际重量计算需要考虑称重传感器的总跨度。  由于可能存在称重传感器的偏移和潜在增益误差、您应校准系统。  也可能存在不应作为最终结果一部分的重量、例如要放置测量重量的拼盘或平台。  这是一个称为皮重的过程。  我建议查看第8页2.1.1节中的 ADS1231REF 用户指南(SBAU175A)、其中显示了如何确定重量。

    此致、

    Bob B  

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

    Bob B、您好!

    非常感谢。