关于这个问题
我没有电子工程背景,这是我通过 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 并行采样,然后从它们中读取而不干扰给我建议?