2025-01-28 16:32:57 +01:00

54 lines
1.8 KiB
Python

import spidev
import time
class MCP3208:
def __init__(self, bus=0, device=0):
# Initialize SPI bus and device
self.spi = spidev.SpiDev()
self.spi.open(bus, device) # Default SPI bus 0, device 0 (you can change as needed)
self.spi.max_speed_hz = 1000000 # Adjust based on your needs (e.g., 1MHz)
self.spi.mode = 0b00 # Set SPI mode (Mode 0 for MCP3208)
def read(self, channel):
"""
Read the ADC value from the specified channel (0-7).
"""
if channel < 0 or channel > 7:
raise ValueError("Channel must be between 0 and 7.")
# MCP3208 sends a 3-byte response, which needs to be processed
# Start with the single bit control byte, followed by the channel selection
# MCP3208 uses 3 bits for the channel: 0-7
# The command byte looks like this:
# | Start | Single-ended | Channel (3 bits) | Don't Care (1 bit) |
# Construct the 3-byte command
# Start bit (1) | Single-ended (1) | Channel (3 bits) | Don't care (1) | End (1)
command = [1, (8 + channel) << 4, 0]
# Send command and receive the 3-byte result
result = self.spi.xfer2(command)
# Combine the result bytes (result is a list of 3 bytes)
# First byte is ignored, we want the 2nd and 3rd bytes for our result
value = ((result[1] & 0x03) << 8) | result[2] # Convert to 10-bit value (0-1023)
return value
def close(self):
"""Close SPI connection."""
self.spi.close()
# Example usage:
if __name__ == "__main__":
adc = MCP3208()
try:
while True:
for i in range(8):
adc_value = adc.read(i)
print(f'ADC[{i}]: {adc_value}')
time.sleep(0.5)
finally:
adc.close()