2015年3月30日 星期一

MCP3208 communicate with raspberry pi

Reference:

用了這個多輸入的adc才知道之前mcp3201這樣的寫法真的很蠢! 哈哈哈!
明明就可以用spi bus,真是蠢斃了我 = =





依照Reference 這樣聰明又簡單的解法,需要先畫個圖解,我需要single end,所以SGL1

Din . . . . . 1 1 2 | 1 0 x x x x x x | x x x x x x x x
Dout 0 0 0 0 0 1 1 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0

raspberry pi 需要輸出三個bytes,使adc可以輸出start bit與位址
第一個byte(0000011?) + (adcnum左移兩位(也就是剩最高位D2))
第二個 byte adcnum3and,保留最後兩位(D1,D0),然後右移六位
第二個 byte 為零
r = spi.xfer2([(6 + (adcnum >> 2)), ((adcnum &3) << 6), 0])



這同時adc 同時接收三個bytes,只有r[1]r[2],才是我們需要的資料
r[1] and 15(0b1111)確保資料,再連接後面的byte,集成12 bits
adcout = ((r[1] & 15) << 8) + r[2]

下面用兩個ADC,ce0,ce1每間隔一秒測一次電壓
import RPi.GPIO as GPIO
import time
import spidev
import time


GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

Vref = 3.8
spi = spidev.SpiDev()


def readadc(adcnum):
    if adcnum > 7 or adcnum < 0:
        return -1
    r = spi.xfer2([(6 + (adcnum >> 2)), ((adcnum &3) << 6), 0])
    adcout = ((r[1] & 15) << 8) + r[2]
    return adcout

while True:
    spi.open(0, 0)
    value = readadc(0)
    voltage = value*(Vref/4096)
    print ("voltage adc1: %0.3f" %voltage)
    time.sleep(1)
    spi.open(0, 1)
    value = readadc(0)
    voltage = value*(Vref/4096)
    print ("voltage adc2:: %0.3f" %voltage)
    time.sleep(1)





沒有留言:

張貼留言