This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
# | |
# MCP3204/MCP3208 sample program for Raspberry Pi | |
# | |
# how to setup /dev/spidev?.? | |
# $ suod modprobe spi_bcm2708 | |
# | |
# how to setup spidev | |
# $ sudo apt-get install python-dev python-pip | |
# $ sudo pip install spidev | |
# | |
import spidev | |
import time | |
class MCP3208: | |
def __init__(self, spi_channel=0): | |
self.spi_channel = spi_channel | |
self.conn = spidev.SpiDev(0, spi_channel) | |
self.conn.max_speed_hz = 1000000 # 1MHz | |
def __del__( self ): | |
self.close | |
def close(self): | |
if self.conn != None: | |
self.conn.close | |
self.conn = None | |
def bitstring(self, n): | |
s = bin(n)[2:] | |
return '0'*(8-len(s)) + s | |
def read(self, adc_channel=0): | |
# build command | |
cmd = 128 # start bit | |
cmd += 64 # single end / diff | |
if adc_channel % 2 == 1: | |
cmd += 8 | |
if (adc_channel/2) % 2 == 1: | |
cmd += 16 | |
if (adc_channel/4) % 2 == 1: | |
cmd += 32 | |
# send & receive data | |
reply_bytes = self.conn.xfer2([cmd, 0, 0, 0]) | |
# | |
reply_bitstring = ''.join(self.bitstring(n) for n in reply_bytes) | |
# print reply_bitstring | |
# see also... http://akizukidenshi.com/download/MCP3204.pdf (page.20) | |
reply = reply_bitstring[5:19] | |
return int(reply, 2) | |
if __name__ == '__main__': | |
spi = MCP3208(0) | |
count = 0 | |
a0 = 0 | |
a1 = 0 | |
a2 = 0 | |
a3 = 0 | |
while True: | |
count += 1 | |
a0 += spi.read(0) | |
a1 += spi.read(1) | |
a2 += spi.read(2) | |
a3 += spi.read(3) | |
if count == 10: | |
print "ch0=%04d, ch1=%04d, ch2=%04d, ch3=%04d" % (a0/10, a1/10, a2/10, a3/10) | |
count = 0 | |
a0 = 0 | |
a1 = 0 | |
a2 = 0 | |
a3 = 0 | |
I think there's a bug in 52 line. In my mind there should be " reply = reply_bitstring[7:19] " because mcp320[2/4/8] is 12-bit resolution not 14-bit.
Thank you very much! That helped me kickstart development. I introduced a dedicated function for averaging:
def readAverage(self, adc_channel=0, nAverage=128, bDebug=0):
raw = 0
for i in range(nAverage):
raw += self.read(adc_channel)
fMean = raw / nAverage
if bDebug:
print('nAverage={:d}: mean value={:7.2f}ticks'.format(nAverage, fMean))
return fMean
The main function then reads
if __name__ == '__main__':
spi = MCP3208(spi_channel=0)
while True:
a0 = spi.readAverage(0, nAverage=256)
a1 = spi.readAverage(1)
a2 = spi.readAverage(2)
a3 = spi.readAverage(3)
print('rawValues: {:7.2f} {:7.2f} {:7.2f} {:7.2f}'.format(a0, a1, a2, a3))
#time.sleep(0.5)
how the mode 0,0 or mode 1,1 is selected ?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Do you know how exactly one should wire it?