Reference:
用了這個多輸入的adc才知道之前mcp3201這樣的寫法真的很蠢!
哈哈哈!
明明就可以用spi
bus,真是蠢斃了我
= =
依照Reference
這樣聰明又簡單的解法,需要先畫個圖解,我需要single
end,所以SGL為1
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 為
adcnum與3做and,保留最後兩位(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)
|
沒有留言:
張貼留言