0

从 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;
}
4

3 回答 3

2

adcout是一个char并且不能保存 10 位值。改用一个unsigned int。另外,你不应该用 来转移你的价值adcout >>= 1;,它已经很好了。

于 2015-02-17T09:11:20.823 回答
1

您正在返回一个 unsigned char adcout = 0;大小为 8 位而不是 10 位的变量。此外,您在返回之前将其右移 1,所以很可能您得到:

255 Right shifted by 1 = 127.
于 2015-02-17T09:11:07.783 回答
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)

于 2015-04-24T10:03:46.170 回答