MCP3424,如何并行读取通道?


9

关于这个问题

我没有电子工程背景,这是我通过I2C进行通信以及写寄存器的第一个挑战,因此,请不要在我这方面承担太多的知识。我正在编写Arduino。

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

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

该组件具有四个ADC

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

我相信它有四个ADC。在RS-Online上,似乎E / SL版本具有4个ADC(直接链接),而E / ST仅具有1个(直接链接)。 在此处输入图片说明

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

我对吗?

通过I2C进行通信

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

配置字节格式

在此处输入图片说明

有趣的是:

  • 从左数第3位,从1开始计数:连续采样
  • 从1开始,从左数第1位和第2位

有关配置字节的更多信息,请参见数据表第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所用的字节完全相同。

但是,这不起作用。即使已经超过必要的375ms,也没有准备好样本。

我该如何实现?

我已尽力描述所需的结果和尝试的内容,但我知道阅读起来并不容易。

您能否给我一些建议,让所有ADC并行采样,然后在不干扰的情况下读取它们?


好的开始。唯一缺少的是我添加的MCP3424数据表的链接。
JRE

MCP3424有两个封装(而非版本),均为4个通道。ST是TSSOP,SL是Soic。有MCP3422 2通道,固定地址,MCP3423、2通道,可调地址和MCP3424 4通道。
Passerby

+1非常彻底的书面问题。可悲的是,该芯片是单个ADC。这在其数据表的“功能框图”中进行了说明。您已将输入通道读为ADC。具有许多输入通道,一个ADC可以用来(依次)采样许多不同的信号。与模拟多路复用器(选择通道)相比,ADC的制造成本要高得多,并且对多个信号进行采样是常见的要求。因此,ADC芯片通常以这种方式工作。安迪(aka)已回答了您的问题,但也许会等一下再接受,因为您可能会获得更多信息。
gbulmer

我相信它有4个模数转换器,因为RS-网上说E / SL有4个,和E / ST有1.我已经加入到描述
的Mads Skjern

2
@MadsSkjern忽略RS,Microchip,其数据表为准。这是RS的错误。分销商网站上的错误很普遍。
Passerby

Answers:


11

我为后者提供了四个ADC。我认为这必须意味着它可以同时在多个通道上进行采样。

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

在此处输入图片说明

请注意,输入多路复用器在任何时候都只能选择四个通道之一。这是用于读取多个通道的相当普遍的方法,但是那里同时有采样ADC。尝试查看Linear Technology,TI或ADI的产品组合。


+1,打败我:-)可能值得一提的事实是,一个ADC对多个通道进行采样非常普遍,因为它可以对不同的模拟信号进行采样,这是常见的情况。
gbulmer

此外,如果需要低采样率,那么多路复用/交织通常就足够了
Scott Seidman

先生,正在改善。
gbulmer

@gbulmer,你太客气了!
安迪(aka Andy)

5

所述MCP3424是单个ADC与在前端的多路复用器。

数据表中的此图非常清楚地显示了这一点

MCP3424架构

数据表对此进行了介绍:

4.1概述

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

因此,您不能真正地同时转换不同的通道,但是可以在通道之间以相对较短的延迟顺序地对其进行采样。

使用设备时,需要确保I2C地址位稳定。再次,从数据表:

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

一个。设备加电。

b。一般电话重置

(请参见第5.4节“一般呼叫”)。

C。一般电话锁

(请参见第5.4节“一般呼叫”)。

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

建议在设备启动后发出“常规呼叫重置”或“常规呼叫锁定”命令。这将确保设备在稳定的状态下读取地址引脚,并避免在电源上升时锁存地址位。这可能会导致地址引脚检测不正确。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.