对于我正在为我的化学实验室做的研究项目,我们正在使用和ADS8320芯片(数据表找到here。我们正在使用它通过电位器通过SPI引脚获取电压读数Raspberry Pi 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芯片一起工作?你能解释一下这个位移实际上是什么,因为我发现它的每个来源都让我更加困惑。任何有关这方面的帮助都会非常有帮助!此外,如果我遗漏任何重要信息,请告诉我,因为我仍然很新。
答案 0 :(得分:1)
代码的那一行是你如何从芯片中读取10位值。输入0(在[0]中)具有数据的5个最高有效位,输入1(在[1]中)具有5个最低有效位。因此,换班操作。想象一下你的数据有10位,你做(0b00011111 AND输入[0])并将它向左移动5.然后你做(0b11111000 AND输入[1])并将它向右移动3.最后,当将它们与OR val1 | val2
放在一起,您将获得10位值。但是,如果您访问芯片的数据表,您的芯片是一个16位ADC,这意味着您需要另外一个引脚来读取您未读取的额外6位。此外,请确保将正确的引脚连接到[0]和[1]中,因为它可以反转位流的方向。