-
Notifications
You must be signed in to change notification settings - Fork 4
Open
Description
I was trying to use this on the PI 5 and it used smbus2 instead so I made a version that you are free to take and use for people who need it.
All that needs to be added is the specific models, I only had the one that I was using. Should be easy to add the other ones
from smbus2 import SMBus
from abc import ABC, abstractmethod
GP8XXX_I2C_DEVICE_ADDR = 0x58
class DFRobot_GP8XXX(ABC):
OUTPUT_RANGE_2_5V = 0
OUTPUT_RANGE_5V = 1
OUTPUT_RANGE_10V = 2
OUTPUT_RANGE_VCC = 3
RESOLUTION_12_BIT = 0x0FFF
RESOLUTION_15_BIT = 0x7FFF
@abstractmethod
def begin(self):
pass
@abstractmethod
def set_dac_out_voltage(self, voltage, channel):
pass
class DFRobot_GP8XXX_IIC(DFRobot_GP8XXX):
GP8XXX_CONFIG_CURRENT_REG = 0x02
def __init__(self, bus=1, resolution=DFRobot_GP8XXX.RESOLUTION_12_BIT, device_addr=GP8XXX_I2C_DEVICE_ADDR):
self._resolution = resolution
self._device_addr = device_addr
self._bus_num = bus
self._bus = SMBus(bus)
def begin(self):
# Optionally scan for device presence
try:
self._bus.write_quick(self._device_addr)
return 0
except:
return -1
def set_dac_outrange(self, range):
if range == self.OUTPUT_RANGE_5V:
self._write_reg(self.GP8XXX_CONFIG_CURRENT_REG >> 1, [0x00])
elif range == self.OUTPUT_RANGE_10V:
self._write_reg(self.GP8XXX_CONFIG_CURRENT_REG >> 1, [0x11])
def set_dac_out_voltage(self, data, channel=0):
if data > self._resolution:
data = self._resolution
if self._resolution == self.RESOLUTION_12_BIT:
data <<= 4
elif self._resolution == self.RESOLUTION_15_BIT:
data <<= 1
self._send_data(data, channel)
def _send_data(self, data, channel):
buf = [data & 0xFF, (data >> 8) & 0xFF, data & 0xFF, (data >> 8) & 0xFF]
if channel == 0:
self._write_reg(self.GP8XXX_CONFIG_CURRENT_REG, buf[:2])
elif channel == 1:
self._write_reg(self.GP8XXX_CONFIG_CURRENT_REG << 1, buf[:2])
elif channel == 2:
self._write_reg(self.GP8XXX_CONFIG_CURRENT_REG, buf[:4])
def _write_reg(self, reg, data):
self._bus.write_i2c_block_data(self._device_addr, reg, data)
class DFRobot_GP8413(DFRobot_GP8XXX_IIC):
def __init__(self, bus=1, i2c_addr=0x58):
super().__init__(bus=bus, resolution=self.RESOLUTION_15_BIT, device_addr=i2c_addr)
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels