181 lines
6.9 KiB
Python
181 lines
6.9 KiB
Python
from esphome import pins
|
|
import esphome.codegen as cg
|
|
from esphome.components import spi
|
|
import esphome.config_validation as cv
|
|
from esphome.const import CONF_ID, CONF_REFERENCE_VOLTAGE
|
|
|
|
MULTI_CONF = True
|
|
|
|
CONF_DRDY_PIN = "drdy_pin"
|
|
CONF_SYNC_RESET_PIN = "sync_reset_pin"
|
|
CONF_CLOCK_FREQUENCY = "clock_frequency"
|
|
CONF_ADS131M08_ID = "ads131m08_id"
|
|
CONF_OVERSAMPLING_RATIO = "oversampling_ratio"
|
|
CONF_POWER_MODE = "power_mode"
|
|
CONF_GLOBAL_CHOP = "global_chop"
|
|
CONF_GLOBAL_CHOP_DELAY = "global_chop_delay"
|
|
CONF_DCBLOCK_FILTER = "dcblock_filter"
|
|
CONF_CURRENT_DETECT = "current_detect"
|
|
CONF_CURRENT_DETECT_ALL = "current_detect_all"
|
|
CONF_CURRENT_DETECT_NUMBER = "current_detect_number"
|
|
CONF_CURRENT_DETECT_LENGTH = "current_detect_length"
|
|
CONF_CURRENT_DETECT_THRESHOLD = "current_detect_threshold"
|
|
|
|
DEPENDENCIES = ["spi"]
|
|
|
|
ads131m08_ns = cg.esphome_ns.namespace("ads131m08")
|
|
ADS131M08Hub = ads131m08_ns.class_("ADS131M08Hub", cg.Component, spi.SPIDevice)
|
|
|
|
POWER_MODE = ads131m08_ns.enum("ADC_POWERMODE")
|
|
POWER_MODES = {
|
|
0: POWER_MODE.VERY_LOW_POWER,
|
|
1: POWER_MODE.LOW_POWER,
|
|
2: POWER_MODE.HIGH_RESOLUTION, # default
|
|
3: POWER_MODE.HIGH_RESOLUTION2,
|
|
"very_low": POWER_MODE.VERY_LOW_POWER,
|
|
"very_low_power": POWER_MODE.VERY_LOW_POWER,
|
|
"low": POWER_MODE.LOW_POWER,
|
|
"low_power": POWER_MODE.LOW_POWER,
|
|
"high": POWER_MODE.HIGH_RESOLUTION,
|
|
"high_resolution": POWER_MODE.HIGH_RESOLUTION,
|
|
"very low": POWER_MODE.VERY_LOW_POWER,
|
|
"very low power": POWER_MODE.VERY_LOW_POWER,
|
|
"low power": POWER_MODE.LOW_POWER,
|
|
"high resolution": POWER_MODE.HIGH_RESOLUTION,
|
|
}
|
|
|
|
GLOBAL_CHOP_DELAY = ads131m08_ns.enum("ADC_GLOBAL_CHOP_DELAY")
|
|
GLOBAL_CHOP_DELAYS = {
|
|
2: GLOBAL_CHOP_DELAY.GC_DEL2,
|
|
4: GLOBAL_CHOP_DELAY.GC_DEL4,
|
|
8: GLOBAL_CHOP_DELAY.GC_DEL8,
|
|
16: GLOBAL_CHOP_DELAY.GC_DEL16, # default
|
|
32: GLOBAL_CHOP_DELAY.GC_DEL32,
|
|
64: GLOBAL_CHOP_DELAY.GC_DEL64,
|
|
128: GLOBAL_CHOP_DELAY.GC_DEL128,
|
|
256: GLOBAL_CHOP_DELAY.GC_DEL256,
|
|
512: GLOBAL_CHOP_DELAY.GC_DEL512,
|
|
1024: GLOBAL_CHOP_DELAY.GC_DEL1024,
|
|
2048: GLOBAL_CHOP_DELAY.GC_DEL2048,
|
|
4096: GLOBAL_CHOP_DELAY.GC_DEL4096,
|
|
8192: GLOBAL_CHOP_DELAY.GC_DEL8192,
|
|
16384: GLOBAL_CHOP_DELAY.GC_DEL16384,
|
|
32768: GLOBAL_CHOP_DELAY.GC_DEL32768,
|
|
65536: GLOBAL_CHOP_DELAY.GC_DEL65536,
|
|
}
|
|
|
|
CURRENT_DETECT_NUMBER = ads131m08_ns.enum("ADC_CURRENT_DETECT_NUMBER")
|
|
CURRENT_DETECT_NUMBERS = {
|
|
1: CURRENT_DETECT_NUMBER.CD_NUM1, # default
|
|
2: CURRENT_DETECT_NUMBER.CD_NUM2,
|
|
4: CURRENT_DETECT_NUMBER.CD_NUM4,
|
|
8: CURRENT_DETECT_NUMBER.CD_NUM8,
|
|
16: CURRENT_DETECT_NUMBER.CD_NUM16,
|
|
32: CURRENT_DETECT_NUMBER.CD_NUM32,
|
|
64: CURRENT_DETECT_NUMBER.CD_NUM64,
|
|
128: CURRENT_DETECT_NUMBER.CD_NUM128,
|
|
}
|
|
|
|
CURRENT_DETECT_LENGTH = ads131m08_ns.enum("ADC_CURRENT_DETECT_LENGTH")
|
|
CURRENT_DETECT_LENGTHS = {
|
|
128: CURRENT_DETECT_LENGTH.CD_LEN128, # default
|
|
256: CURRENT_DETECT_LENGTH.CD_LEN256,
|
|
512: CURRENT_DETECT_LENGTH.CD_LEN512,
|
|
768: CURRENT_DETECT_LENGTH.CD_LEN768,
|
|
1280: CURRENT_DETECT_LENGTH.CD_LEN1280,
|
|
1792: CURRENT_DETECT_LENGTH.CD_LEN1792,
|
|
2560: CURRENT_DETECT_LENGTH.CD_LEN2560,
|
|
3584: CURRENT_DETECT_LENGTH.CD_LEN3584,
|
|
}
|
|
|
|
OSR = ads131m08_ns.enum("ADS131M08_OVERSAMPLING_RATIO")
|
|
OSRS = {
|
|
128: OSR.OSR_128,
|
|
256: OSR.OSR_256,
|
|
512: OSR.OSR_512,
|
|
1024: OSR.OSR_1024,
|
|
2048: OSR.OSR_2048,
|
|
4096: OSR.OSR_4096,
|
|
8192: OSR.OSR_8192,
|
|
16256: OSR.OSR_16256,
|
|
}
|
|
|
|
CLOCK_FREQUENCIES = {
|
|
2048000: 2048000,
|
|
4096000: 4096000,
|
|
8192000: 8192000,
|
|
"2048kHz": 2048000,
|
|
"4096kHz": 4096000,
|
|
"8192kHz": 8192000,
|
|
"2.048MHz": 2048000,
|
|
"4.096MHz": 4096000,
|
|
"8.192MHz": 8192000,
|
|
}
|
|
|
|
CONFIG_SCHEMA = (
|
|
cv.Schema(
|
|
{
|
|
cv.GenerateID(): cv.declare_id(ADS131M08Hub),
|
|
cv.Required(CONF_DRDY_PIN): pins.internal_gpio_input_pin_schema,
|
|
cv.Optional(CONF_SYNC_RESET_PIN): pins.internal_gpio_input_pin_schema,
|
|
cv.Optional(CONF_CLOCK_FREQUENCY, default="8192kHz"): cv.All(
|
|
cv.frequency, cv.one_of(*CLOCK_FREQUENCIES.keys())
|
|
),
|
|
cv.Optional(CONF_OVERSAMPLING_RATIO, default=1024): cv.enum(
|
|
OSRS, int=True
|
|
),
|
|
cv.Optional(CONF_REFERENCE_VOLTAGE, default=1.2): cv.float_range(
|
|
min=1.1, max=1.3
|
|
),
|
|
cv.Optional(CONF_DCBLOCK_FILTER, default=0): cv.int_range(min=0, max=15),
|
|
cv.Optional(CONF_POWER_MODE, default=2): cv.enum(POWER_MODES, int=False),
|
|
cv.Optional(CONF_GLOBAL_CHOP, default=False): cv.boolean,
|
|
cv.Optional(CONF_GLOBAL_CHOP_DELAY, default=16): cv.enum(GLOBAL_CHOP_DELAYS, int=True),
|
|
cv.Optional(CONF_CURRENT_DETECT, default=False): cv.boolean,
|
|
cv.Optional(CONF_CURRENT_DETECT_ALL, default=False): cv.boolean,
|
|
cv.Optional(CONF_CURRENT_DETECT_NUMBER, default=1): cv.enum(CURRENT_DETECT_NUMBERS, int=True),
|
|
cv.Optional(CONF_CURRENT_DETECT_LENGTH, default=128): cv.enum(CURRENT_DETECT_LENGTHS, int=True),
|
|
cv.Optional(CONF_CURRENT_DETECT_THRESHOLD, default=0):cv.int_range(min=-8388608, max=8388607),
|
|
}
|
|
)
|
|
.extend(cv.COMPONENT_SCHEMA)
|
|
.extend(spi.spi_device_schema(cs_pin_required=True, default_data_rate="10MHz"))
|
|
)
|
|
|
|
|
|
async def to_code(config):
|
|
id = config[CONF_ID]
|
|
var = cg.new_Pvariable(id)
|
|
await cg.register_component(var, config)
|
|
await spi.register_spi_device(var, config)
|
|
cg.add(var.set_id(str(id)))
|
|
drdy = await cg.gpio_pin_expression(config[CONF_DRDY_PIN])
|
|
if CONF_SYNC_RESET_PIN in config:
|
|
sync_reset = await cg.gpio_pin_expression(config[CONF_SYNC_RESET_PIN])
|
|
cg.add(var.set_sync_reset_pin(sync_reset))
|
|
clock_frequency = CLOCK_FREQUENCIES[config[CONF_CLOCK_FREQUENCY]]
|
|
cg.add(var.set_clock_frequency(clock_frequency))
|
|
osr = config[CONF_OVERSAMPLING_RATIO]
|
|
cg.add(var.set_osr(osr))
|
|
reference_voltage = config[CONF_REFERENCE_VOLTAGE]
|
|
cg.add(var.set_reference_voltage(reference_voltage))
|
|
dcblock_filter = config[CONF_DCBLOCK_FILTER]
|
|
cg.add(var.set_dcblock_filter(dcblock_filter))
|
|
power_mode = config[CONF_POWER_MODE]
|
|
cg.add(var.set_power_mode(power_mode))
|
|
global_chop = config[CONF_GLOBAL_CHOP]
|
|
cg.add(var.set_global_chop(global_chop))
|
|
global_chop_delay = config[CONF_GLOBAL_CHOP_DELAY]
|
|
cg.add(var.set_global_chop_delay(global_chop_delay))
|
|
current_detect = config[CONF_CURRENT_DETECT]
|
|
cg.add(var.set_current_detect(current_detect))
|
|
current_detect_all = config[CONF_CURRENT_DETECT_ALL]
|
|
cg.add(var.set_current_detect_all(current_detect_all))
|
|
current_detect_number = config[CONF_CURRENT_DETECT_NUMBER]
|
|
cg.add(var.set_current_detect_number(current_detect_number))
|
|
current_detect_length = config[CONF_CURRENT_DETECT_LENGTH]
|
|
cg.add(var.set_current_detect_length(current_detect_length))
|
|
current_detect_threshold = config[CONF_CURRENT_DETECT_THRESHOLD]
|
|
cg.add(var.set_current_detect_threshold(current_detect_threshold))
|
|
cg.add(var.set_drdy_pin(drdy))
|