MCP3424,如何并行读取通道?

电器工程 Arduino ADC i2c
2022-01-22 04:28:51

关于这个问题

我没有电子工程背景,这是我通过 I2C 通信和写入寄存器的第一个挑战,所以请不要假设我有太多的知识。我正在编写一个Arduino。

当询问特定的电子元件/芯片时,我认为人们无法通过实验/测试来给我一个正确的答案。我也希望人们甚至不会知道这个组件。因此,我将尝试在这个问题中添加很多信息。

如果您需要更多信息,请告诉我。

该组件有四个 ADC

我正在使用 4 通道组件 MCP3424(数据表)。它有两个包装。我使用的是 MCP3424 E/SL,4 通道 SOIC 版本,而不是 MCP3422 或 MCP3423 2 通道版本。

我相信它有四个ADC。在 RS-Online 上,E/SL 版本似乎有 4 个 ADC(直接链接),而 E/ST 只有一个(直接链接)。 在此处输入图像描述

我认为这一定意味着它可以同时在多个通道上进行采样。我看不出有任何其他理由在组件上放置多个 ADC。

我对吗?

通过 I2C 进行通信

通过发送一个配置字节进行通信,然后等待采样结束,然后读取结果。

配置字节格式

在此处输入图像描述

有趣的是:

  • 左起第三位,从 1 开始计数:连续采样
  • 左起第 1 位和第 2 位,从 1 开始计数:地址

有关配置字节的更多信息,请参见数据表第 18 页,此处也有描述

读取结果格式

我的示例将仅具有 18 位分辨率(第 5 位和第 6 位设置为 1)。回读结果将是四个字节:前三个包含值,第四个包含配置字节。

然而,最左边的位!RDY 表明该值是否为“新”,即自上次读数以来是否为新读数。第一次读取一个结果时,值为 0,对于后续的结果,值为 1,直到 ADC 准备好新的采样值。

如何在不并行采样的情况下使用它

我非常清楚如何做到这一点。我在网上找到的所有例子,也很简单。只需向组件写入一个配置字节,然后读回一个值。

如何设置每个通道连续自动采样,并并行读取通道

伪代码可能像

setup():
    start sampling channel 1, 18bit, 0gain, continuously
    start sampling channel 2, 18bit, 0gain, continuously
    start sampling channel 3, 18bit, 4gain, continuously
    start sampling channel 1, 18bit, 2gain, continuously

readADCs():
    // Run every 500ms
    // 18 bit samples take 375ms, so must happen in parallel 
    // to get a new sample for all every 500ms
    read channel 1
    read channel 2
    read channel 3
    read channel 4

我最好的尝试

所以我希望,以下设置每个 ADC 连续采样。这是 Arduino 代码。

void setup() {

    Wire.write(0b00011100);
    Wire.write(0b01011100);
    Wire.write(0b10011110);
    Wire.write(0b11011101);
}

然后,我如何阅读特定频道。如果我只是向组件询问结果,它将在寄存器上返回通道的结果。通过上面的设置,我会得到通道 4 的读数。但是假设我想要通道 2 的读数。在某种程度上我只需要告诉它,我想要通道 2 的结果。我不想要求它采样任何东西,它应该继续进行连续采样,而我只想要它在自动采样时创建的最新样本。

以下是我的最佳猜测

void readADCs() {

    // Channel 1
    // ...

    // Channel 2
    Wire.beginTransmission(104);
    Wire.write(0b01011100); // I hope not to affect, just to select
    Wire.endTransmission();
    Wire.requestFrom(104);
    Wire.read(); // val byte 1
    Wire.read(); // val byte 2
    Wire.read(); // val byte 3
    Wire.read(); // config byte
}

所以我最好的猜测是。如果我想读取通道 2,我会写一个与用于启动采样通道 2 的配置字节完全相同的配置字节。

但是,这不起作用。没有样品准备好,即使它已经超过了必要的 375 毫秒。

我如何实现这一目标?

我已经尽力描述期望的结果和我尝试过的内容,但我知道这并不容易阅读。

您能否就如何让所有 ADC 并行采样,然后从它们中读取而不干扰给我建议?

2个回答

我的后者有四个 ADC。我认为这一定意味着它可以同时在多个通道上进行采样。

不幸的是没有。只有一个 ADC,要转换多个通道,必须通过寻址内部多路复用器顺序完成,从而“读取”另一个通道。不幸的是,没有同时采样:-

在此处输入图像描述

请注意,输入多路复用器在任何时候都只能选择四个通道之一。这是一种用于读取多个通道的非常常见的方法,但是那里有同时采样 ADC。尝试查看凌力尔特、TI 或 ADI 的产品组合。

MCP3424是一款前端带有多路复用器的单 ADC。

数据表中的这张图表非常清楚地表明了这一点

MCP3424 架构

数据表通过以下介绍支持了这一点:

4.1 概述

MCP3422/3/4 器件是具有 I2C 串行接口的差分多通道低功耗 18 位 Delta-Sigma A/D 转换器。这些器件包含一个输入通道选择多路复用器 (mux)、一个可编程增益放大器 (PGA)、一个板载电压基准 (2.048V) 和一个内部振荡器。

因此,您不能真正同时转换不同的通道,但您可以按顺序对通道进行采样,并且它们之间的延迟相对较短。

使用设备时,需要保证I2C地址位稳定;再一次,从数据表中:

MCP3423 和 MCP3424 有两个外部器件地址引脚(Adr1、Adr0)。这些引脚可以设置为逻辑高(或连接到 VDD)、低(或连接到 VSS)或悬空(不连接任何东西,或连接到 VDD/2),这些逻辑电平组合使用两个引脚允许八个可能的地址。表 5-3 显示了取决于地址选择引脚的逻辑状态的器件地址。器件在以下事件中对 Adr0 和 Adr1 引脚的逻辑状态进行采样:

一种。设备上电。

湾。广播呼叫重置

(请参见第 5.4 节“通用呼叫”)。

C。通用呼叫锁存器

(请参见第 5.4 节“通用呼叫”)。

器件在上述事件期间对逻辑状态(地址引脚)进行采样,并锁存这些值,直到发生新的锁存事件。在正常操作期间(地址引脚被锁存后),地址引脚在内部被内部电路的其余部分禁用。

建议在设备上电后发出一次 General Call Reset 或 General Call Latch 命令。这将确保器件在稳定状态下读取地址引脚,并避免在电源上升时锁存地址位。这可能会导致地址引脚检测不准确。

我建议您遵循此建议,以确保您确实在与设备进行通信。

要读取特定通道,您必须在配置寄存器中选择通道并开始转换。当该转换的结果在输出寄存器中可用时,RDY 位将变为低电平。