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

How exactly do you wire the MCP3208 to the Raspberry Pi if you are running this code? Specifically, I'm wondering about the CS, DIN, DOUT, and CLK pins?

@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