Skip to content

Instantly share code, notes, and snippets.

@yoggy
Last active May 28, 2018 12:21
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save yoggy/7096133 to your computer and use it in GitHub Desktop.
Save yoggy/7096133 to your computer and use it in GitHub Desktop.
#!/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
@rstolyarov
Copy link

Do you know how exactly one should wire it?

@niemira
Copy link

niemira commented May 28, 2014

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.

@PeterPablo
Copy link

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)

@vaibh305
Copy link

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