从mcp3008 ADC读取时出错。接收3.3V输入时,下面的函数返回127。由于它是10位ADC,因此应返回1023。
我已正确定义了我的引脚号,并包含了stdio.h和wiringPi.h。任何帮助表示赞赏。
int main(void) {
int adcValue = 0;
wiringPiSetup();
pinMode(csPin, OUTPUT);
pinMode(sclkPin, OUTPUT);
pinMode(mosiPin, OUTPUT);
pinMode(misoPin, INPUT);
while(1) {
delay(10);
adcValue = readADC(CHAN0);
if (adcValue == -1)
printf("Error reading from %i \n", CHAN0);
else
printf("Chan0: %i \n", adcValue);
}
}
int readADC(int adcChan) {
// Variables
unsigned char dataOut = 0;
unsigned char adcout = 0;
int i, j = 0;
if ((adcChan > 7) || (adcChan < 0)) {
return -1;
}
digitalWrite(csPin, HIGH);
digitalWrite(sclkPin, LOW);
digitalWrite(csPin, LOW);
dataOut = adcChan;
dataOut |= 0x18;
dataOut <<= 3;
for (i = 0; i < 5; i++) {
if (dataOut & 0x80) {
digitalWrite(mosiPin, HIGH);
} else {
digitalWrite(mosiPin, LOW);
}
dataOut <<= 1;
digitalWrite(sclkPin, HIGH);
digitalWrite(sclkPin, LOW);
}
adcout = 0;
for (j = 0; j < 12; j++) {
digitalWrite(sclkPin, HIGH);
digitalWrite(sclkPin, LOW);
adcout <<= 1;
if (digitalRead(misoPin)) {
adcout |= 0x1;
}
}
digitalWrite(csPin, HIGH);
adcout >>= 1;
return adcout;
}
答案 0 :(得分:2)
您的adcout
是char
,无法保留10位值。请改用unsigned int
。此外,您不应该使用adcout >>= 1;
转移您的价值,它已经很好了。
答案 1 :(得分:1)
您正在返回一个大小为8位而非10位的变量unsigned char adcout = 0;
。你也可以在返回前将它移动1,所以很可能你得到了:
255 Right shifted by 1 = 127.
答案 2 :(得分:1)
使用python和spidev模块! 它看起来像!
import spidev
spi = spidev.SpiDev()
spi.open(0,0)
def read(ch):
adc = (spi.xfer2([1,(8+ch)<<4,0])
data = ((adc[1]&3 << 8) + adc[2]
这应该给你mcp3008芯片的正确读数。 我目前正在传感器模块中使用该芯片来连接我的模拟传感器。 Ch是mcp3008(0-7)
上的通道