关于这个问题
我没有电子工程背景,这是我通过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并行采样,然后在不干扰的情况下读取它们?