【发布时间】:2018-04-22 23:10:46
【问题描述】:
对于我正在为我的化学实验室做的一个研究项目,我们正在使用 ADS8320 芯片(数据表找到 here。我们正在使用它通过 Raspberry Pi 上的 SPI 引脚使用电位计获取电压读数3. 虽然我已经能够使用来自 Processing.org 的this code 获取数据:
import processing.io.*;
SPI adc;
void setup() {
//printArray(SPI.list());
adc = new SPI(SPI.list()[0]);
adc.settings(500000, SPI.MSBFIRST, SPI.MODE0);
}
void draw() {
// read in values over SPI from an analog-to-digital
// converter
// dummy write, actual values don't matter
byte[] out = { 0, 0 };
byte[] in = adc.transfer(out);
// some input bit shifting according to the datasheet
int val = ((in[0] & 0x1f) << 5) | ((in[1] & 0xf8) >> 3);
// val is between 0 and 1023
println(val);
}
根据我在数据表上阅读的内容,在获取最大电压时,我应该得到 65535 的值。相反,在接受最大电压时,我得到的值为 127。我绝对不是一个优秀的程序员,几乎在一个月前就开始使用它,但我认为问题在于代码的位移行:
int val = ((in[0] & 0x1f) << 5) | ((in[1] & 0xf8) >> 3);
如果这是问题,我将如何设置它以与我的 16 位 ADS 芯片一起使用?你能否解释一下这个位移实际上是为了什么,因为我在上面找到的每个来源都让我更加困惑。对此的任何帮助都会非常有帮助!另外,如果我遗漏了任何重要信息,请告诉我,因为我对此还是很陌生。
【问题讨论】:
-
如果您debug your program 并将您的问题缩小到minimal reproducible example,您将会有更好的运气。
in[0]和in[1]的值是多少?他们是你所期望的吗?将那条复杂的线分成多个步骤。哪些步骤的行为与您的预期不同?然后,如果您遇到困难,您可以只发布这几行的minimal reproducible example,而无需读取所有额外的数据。只需硬编码值即可。 -
太棒了,我将把它分解,看看我是否无法获得价值。这条线非常复杂,让我很困惑。我会拆分它,看看我是否不能得到一个工作代码,或者至少有一个更好更简洁的例子给你。
-
根据数据表的第 24 页,您可能需要读取 3 个字节而不是 2 个字节,丢弃前 6 位和后两位。结果,您的位移表达式将更改为类似于
int val = ((in[0] & 0x03) << 14) | (in[1] << 6) | (in[2] & 0x3f);维基百科谈论 bitwise operations in C 包括位移操作。 -
谢谢!我已经从实验室回家了,今天我可以试试这个。明天我会先试试这个,然后告诉你!
-
@v1bri 感谢您让我知道这 3 个字节。我试过你的代码,得到了一些奇怪的负数。我不确定这是为什么,可能是您添加到 [0] 和 [2] 中的字节的 0x03 和 0x3f 吗?
标签: processing raspberry-pi3 bit-shift spi adc