Many fixes more

This commit is contained in:
Miika Syvänen 2024-03-21 22:05:25 +02:00
parent 42b305b42f
commit 13f555418d
4 changed files with 225 additions and 85 deletions

View File

@ -27,5 +27,3 @@ async def to_code(config):
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)
await spi.register_spi_device(var, config)
cg.add(var.set_continuous_mode(config[CONF_CONTINUOUS_MODE]))

View File

@ -34,9 +34,6 @@ void ADS1220Component::setup() {
uint8_t value_2;
uint8_t value_3;
bool enable = false;
uint16_t config = 0;
this->spi_setup();
//pinMode(csPin, OUTPUT);
//digitalWrite(csPin, HIGH);
@ -66,37 +63,24 @@ void ADS1220Component::setup() {
}
ESP_LOGCONFIG(TAG, "Configuring ADS1220...");
/*
// Setup operation mode
//setOperatingMode(ADS1220_TURBO_MODE);
// Setup gain
//setGain(ADS1220_GAIN_1);
config = sensor->get_gain();
setGain((ads1220Gain)config);
// Setup datarate
config = sensor->get_datarate();
setDataRate((ads1220DataRate)config);
// Setup operating mode
config = sensor->get_operating_mode();
setOperatingMode((ads1220OpMode)config);
// Setup conversion mode
config = sensor->get_conversion_mode();
setConversionMode((ads1220ConvMode)config);
// Setup temperature sensor
enable = sensor->get_temp_sensor();
enableTemperatureSensor(enable);
// Setup voltage reference
config = sensor->get_vref_source();
setVRefSource((ads1220VRef)config);
// Setup dataready pin mode
config = sensor->get_drdy_mode();
setDrdyMode((ads1220DrdyMode)config);
// Setup burnout current sources (testing wire breaks or shorted sensors)
//config = sensor->get_burnout_current_sources();
//enableBurnOutCurrentSources(false);
setOperatingMode(ADS1220_TURBO_MODE);
// Setup Gain
setGain(ADS1220_GAIN_1);
// Set mode
if (this->continuous_mode_) {
// Set continuous mode
setConversionMode(ADS1220_CONTINUOUS);
} else {
// Set singleshot mode
setConversionMode(ADS1220_SINGLE_SHOT);
}
// Set data rate - 860 samples per second (we're in singleshot mode)
setVRefSource(ADS1220_VREF_AVDD_AVSS);
setDrdyMode(ADS1220_DRDY_ONLY);
setDataRate(ADS1220_DR_LVL_4);
*/
}
void ADS1220Component::dump_config() {
@ -110,7 +94,6 @@ void ADS1220Component::dump_config() {
LOG_SENSOR(" ", "Sensor", sensor);
ESP_LOGCONFIG(TAG, " Multiplexer: %u", sensor->get_multiplexer());
ESP_LOGCONFIG(TAG, " Gain: %u", sensor->get_gain());
ESP_LOGCONFIG(TAG, " Resolution: %u", sensor->get_resolution());
}
}
@ -129,14 +112,74 @@ float ADS1220Component::request_measurement(ADS1220Sensor *sensor) {
uint16_t config = 0;
config = sensor->get_multiplexer();
setCompareChannels((ads1220Multiplexer)config);
// Setup gain
config = sensor->get_gain();
setGain((ads1220Gain)config);
//setGain(sensor->get_gain);
//setCompareChannels(sensor->get_multiplexer());
//setCompareChannels(ADS1220_MULTIPLEXER_P0_NG);
//ESP_LOGI(TAG, "ADS1220 gain: 0x%02x", (ads1220Gain)config);
if (prev_gain != config) {
setGain((ads1220Gain)config);
prev_gain = (ads1220Gain)config;
}
// Setup datarate
config = sensor->get_datarate();
//ESP_LOGI(TAG, "ADS1220 datarate: 0x%02x", (ads1220DataRate)config);
if (prev_datarate != config) {
setDataRate((ads1220DataRate)config);
prev_datarate = (ads1220DataRate)config;
}
// Setup operating mode
config = sensor->get_operating_mode();
//ESP_LOGI(TAG, "ADS1220 op mode: 0x%02x", (ads1220OpMode)config);
if (prev_op_mode != config) {
setOperatingMode((ads1220OpMode)config);
prev_op_mode = (ads1220OpMode)config;
}
// Setup conversion mode
config = sensor->get_conversion_mode();
//ESP_LOGI(TAG, "ADS1220 conv mode: 0x%02x", (ads1220ConvMode)config);
if (prev_conv_mode != config) {
setConversionMode((ads1220ConvMode)config);
prev_conv_mode = (ads1220ConvMode)config;
}
// Setup voltage reference
config = sensor->get_vref_source();
//ESP_LOGI(TAG, "ADS1220 vref: 0x%02x", (ads1220VRef)config);
if (prev_vref_source != config) {
setVRefSource((ads1220VRef)config);
prev_vref_source = (ads1220VRef)config;
}
// Setup dataready pin mode
config = sensor->get_drdy_mode();
//ESP_LOGI(TAG, "ADS1220 drdy: 0x%02x", (ads1220DrdyMode)config);
if (prev_drdy_mode != config) {
setDrdyMode((ads1220DrdyMode)config);
prev_drdy_mode = (ads1220DrdyMode)config;
}
// Setup temperature sensor
config = sensor->get_temp_sensor_mode();
ESP_LOGI(TAG, "ADS1220 temp sensor mode: 0x%02x", config);
if (prev_temp_sensor != config) {
//enableTemperatureSensor(config);
prev_temp_sensor = config;
}
// Setup burnout current sources
config = sensor->get_burnout_current_sources();
ESP_LOGI(TAG, "ADS1220 fault test mode: 0x%02x", config);
if (prev_burnout_current_sources != config) {
//enableBurnOutCurrentSources(config);
prev_burnout_current_sources = config;
}
// Setup multiplexer
config = sensor->get_multiplexer();
//ESP_LOGI(TAG, "ADS1220 mux: 0x%02x", (ads1220Multiplexer)config);
if (prev_multiplexer != config) {
setCompareChannels((ads1220Multiplexer)config);
prev_multiplexer = (ads1220Multiplexer)config;
}
resultInMV = getVoltage_mV();
resultInVoltage = resultInMV / 1000.0;

View File

@ -68,7 +68,7 @@ typedef enum ADS1220VRef {
ADS1220_VREF_AVDD_AVSS = 0xC0
} ads1220VRef;
typedef enum ADS1220_FIR{
typedef enum ADS1220FIR{
ADS1220_NONE = 0x00, // default
ADS1220_50HZ_60HZ = 0x10,
ADS1220_50HZ = 0x20,
@ -106,9 +106,11 @@ typedef enum ADS1220DrdyMode {
ADS1220_DOUT_DRDY = 0x02
} ads1220DrdyMode;
typedef enum ADS1220Resolution {
ADS1220_24_BITS = 24,
} ads1220Resolution;
typedef enum ADS1220FaultTestMode {
ADS1220_TEST_OFF = 0x00, // default
ADS1220_TEST_ON = 0x01
} ads1220FaultTestMode;
class ADS1220Sensor;
@ -151,6 +153,22 @@ class ADS1220Component : public Component, public spi::SPIDevice<spi::BIT_ORDER_
float channel_3_voltage;
static constexpr float ADS1220_RANGE {8388607.0}; // = 2^23 - 1 as float
ADS1220Multiplexer prev_multiplexer;
ADS1220Gain prev_gain;
ADS1220DataRate prev_datarate;
ADS1220OpMode prev_op_mode;
ADS1220ConvMode prev_conv_mode;
ADS1220VRef prev_vref_source;
ADS1220DrdyMode prev_drdy_mode;
ADS1220FIR prev_fir;
ADS1220PSW prev_psw;
ADS1220IdacCurrent prev_idac_current;
ADS1220IdacRouting prev_idac_1_routing;
ADS1220IdacRouting prev_idac_2_routing;
bool prev_temp_sensor_mode;
bool prev_burnout_current_sources;
/* Configuration Register 0 settings */
void setCompareChannels(ads1220Multiplexer mux);
void setGain(ads1220Gain gain);
@ -212,23 +230,29 @@ class ADS1220Sensor : public sensor::Sensor, public PollingComponent, public vol
void set_datarate(ADS1220DataRate datarate) { datarate_ = datarate; }
void set_operating_mode(ADS1220OpMode op_mode ) { op_mode_ = op_mode; }
void set_conversion_mode(ADS1220ConvMode) { conv_mode_ = conv_mode; }
void set_temp_sensor(bool temp_sensor) { temp_sensor_ = temp_sensor; }
void set_burnout_current_sources(ADS1220BurnoutCurrentSource burnout_current_source) { burnout_current_source_ = burnout_current_source; }
void set_vref_source(ADS1220VRefSource vref_source) { vref_source_ = vref_source; }
void set_conversion_mode(ADS1220ConvMode conv_mode) { conv_mode_ = conv_mode; }
void set_temp_sensor_mode(bool temp_sensor) { temp_sensor_mode_ = temp_sensor_mode; }
void set_burnout_current_sources(bool burnout_current_sources) { burnout_current_sources_ = burnout_current_sources; }
void set_vref_source(ADS1220VRef vref_source) { vref_source_ = vref_source; }
void set_drdy_mode(ADS1220DrdyMode drdy_mode) { drdy_mode_ = drdy_mode; }
void set_fir_filter(ADS1220FIR fir) { fir_ = fir; }
void set_low_side_power_switch(ADS1220PSW psw) { psw_ = psw; }
void set_idac_current(ADS1220IdacCurrent idac_current) { idac_current_ = idac_current; }
void set_idac_1_routing(ADS1220IdacRouting idac_1_routing) { idac_1_routing_ = idac_1_routing; }
void set_idac_2_routing(ADS1220IdacRouting idac_2_routing) { idac_2_routing_ = idac_2_routing; }
void set_temperature_mode(bool temp) { this->temperature_mode_ = temp; }
//void set_temperature_mode(bool temp) { this->temperature_mode_ = temp; }
float sample() override;
uint8_t get_multiplexer() const { return multiplexer_; }
uint8_t get_gain() const { return gain_; }
uint8_t get_datarate() const { return gain_; }
uint8_t get_datarate() const { return datarate_; }
uint8_t get_operating_mode() const { return op_mode_; }
uint8_t get_conversion_mode() const { return conv_mode_; }
uint8_t get_temp_sensor() const { return temp_sensor_; }
uint8_t get_burnout_current_sources() const { return burnout_current_source_; }
uint8_t get_temp_sensor_mode() const { return temp_sensor_mode_; }
uint8_t get_burnout_current_sources() const { return burnout_current_sources_; }
uint8_t get_vref_source() const { return vref_source_; }
uint8_t get_drdy_mode() const { return drdy_mode_; }
@ -238,12 +262,18 @@ class ADS1220Sensor : public sensor::Sensor, public PollingComponent, public vol
ADS1220Gain gain_;
ADS1220DataRate datarate_;
ADS1220OpMode op_mode_;
ADS1220ConvMode_;
ADS1220VRefSource vref_source_;
ADS1220ConvMode conv_mode_;
ADS1220VRef vref_source_;
ADS1220DrdyMode drdy_mode_;
ADS1220FIR fir_;
ADS1220PSW psw_;
ADS1220IdacCurrent idac_current_;
ADS1220IdacRouting idac_1_routing_;
ADS1220IdacRouting idac_2_routing_;
bool temp_sensor_;
bool temp_sensor_mode_;
bool burnout_current_sources_;
};
} // namespace ads1220

View File

@ -5,14 +5,19 @@ from esphome.const import (
CONF_GAIN,
CONF_MULTIPLEXER,
DEVICE_CLASS_VOLTAGE,
DEVICE_CLASS_TEMPERATURE,
STATE_CLASS_MEASUREMENT,
UNIT_CELSIUS,
UNIT_VOLT,
CONF_TYPE,
CONF_ID,
)
from . import ads1220_ns, ADS1220Component
DEPENDENCIES = ["ads1220"]
ADS1220Multiplexer = ads1220_ns.enum("ADS1220Multiplexer")
MUX = {
"A0_A1": ADS1220Multiplexer.ADS1220_MULTIPLEXER_P0_N1,
@ -46,13 +51,13 @@ GAIN = {
ADS1220DataRate = ads1220_ns.enum("ADS1220DataRate")
DATARATE = {
"0": ADS1220DataRate.ADS1220_DR_LVL_0,
"1": ADS1220DataRate.ADS1220_DR_LVL_1,
"2": ADS1220DataRate.ADS1220_DR_LVL_2,
"3": ADS1220DataRate.ADS1220_DR_LVL_3,
"4": ADS1220DataRate.ADS1220_DR_LVL_4,
"5": ADS1220DataRate.ADS1220_DR_LVL_5,
"6": ADS1220DataRate.ADS1220_DR_LVL_6,
"DR_LVL_0": ADS1220DataRate.ADS1220_DR_LVL_0,
"DR_LVL_1": ADS1220DataRate.ADS1220_DR_LVL_1,
"DR_LVL_2": ADS1220DataRate.ADS1220_DR_LVL_2,
"DR_LVL_3": ADS1220DataRate.ADS1220_DR_LVL_3,
"DR_LVL_4": ADS1220DataRate.ADS1220_DR_LVL_4,
"DR_LVL_5": ADS1220DataRate.ADS1220_DR_LVL_5,
"DR_LVL_6": ADS1220DataRate.ADS1220_DR_LVL_6,
}
ADS1220OpMode = ads1220_ns.enum("ADS1220OpMode")
@ -119,6 +124,12 @@ DRDY_MODE = {
"DOUT_DRDY": ADS1220DrdyMode.ADS1220_DOUT_DRDY,
}
ADS1220FaultTestMode = ads1220_ns.enum("ADS1220FaultTestMode")
FAULT_TEST_MODE = {
"TEST_OFF": ADS1220FaultTestMode.ADS1220_TEST_OFF,
"TEST_ON": ADS1220FaultTestMode.ADS1220_TEST_ON,
}
def validate_gain(value):
if isinstance(value, float):
value = f"{value:0.03f}"
@ -133,32 +144,90 @@ ADS1220Sensor = ads1220_ns.class_(
)
CONF_ADS1220_ID = "ads1220_id"
CONFIG_SCHEMA = (
sensor.sensor_schema(
ADS1220Sensor,
unit_of_measurement=UNIT_VOLT,
accuracy_decimals=3,
device_class=DEVICE_CLASS_VOLTAGE,
state_class=STATE_CLASS_MEASUREMENT,
)
.extend(
{
cv.GenerateID(CONF_ADS1220_ID): cv.use_id(ADS1220Component),
cv.Required(CONF_MULTIPLEXER): cv.enum(MUX, upper=True, space="_"),
cv.Required(CONF_GAIN): validate_gain,
}
)
.extend(cv.polling_component_schema("60s"))
CONF_DATARATE = "datarate"
CONF_OP_MODE = "operation_mode"
CONF_CONV_MODE = "conversion_mode"
CONF_VREF = "vref"
CONF_FIR = "fir"
CONF_PSW = "psw"
CONF_IDAC_CURRENT = "idac_current"
CONF_IDAC_1_ROUTING = "idac_1_routing"
CONF_IDAC_2_ROUTING = "idac_2_routing"
CONF_DRDY_MODE = "drdy_mode"
CONF_FAULT_TEST_MODE = "fault_test_mode"
TYPE_ADC = "adc"
TYPE_TEMPERATURE = "temperature"
CONFIG_SCHEMA = cv.typed_schema(
{
TYPE_ADC: sensor.sensor_schema(
ADS1220Sensor,
unit_of_measurement=UNIT_VOLT,
accuracy_decimals=3,
device_class=DEVICE_CLASS_VOLTAGE,
state_class=STATE_CLASS_MEASUREMENT,
)
.extend(
{
cv.GenerateID(CONF_ADS1220_ID): cv.use_id(ADS1220Component),
cv.Required(CONF_MULTIPLEXER): cv.enum(MUX, upper=True, space="_"),
cv.Required(CONF_GAIN): validate_gain,
cv.Optional(CONF_DATARATE, default="DR_LVL_0"): cv.enum(DATARATE, upper=True, space="_"),
cv.Optional(CONF_OP_MODE, default="TURBO"): cv.enum(OP_MODE, upper=True, space="_"),
cv.Optional(CONF_CONV_MODE, default="SINGLE_SHOT"): cv.enum(CONV_MODE, upper=True, space="_"),
cv.Optional(CONF_VREF, default="INTERNAL"): cv.enum(VREF, upper=True, space="_"),
cv.Optional(CONF_FIR, default="NONE"): cv.enum(FIR, upper=True, space="_"),
cv.Optional(CONF_PSW, default="OPEN"): cv.enum(PSW, upper=True, space="_"),
cv.Optional(CONF_IDAC_CURRENT, default="OFF"): cv.enum(IDAC_CURRENT, upper=True, space="_"),
cv.Optional(CONF_IDAC_1_ROUTING, default="NONE"): cv.enum(IDAC_ROUTING, upper=True, space="_"),
cv.Optional(CONF_IDAC_2_ROUTING, default="NONE"): cv.enum(IDAC_ROUTING, upper=True, space="_"),
cv.Optional(CONF_DRDY_MODE, default="DRDY_ONLY"): cv.enum(DRDY_MODE, upper=True, space="_"),
cv.Optional(CONF_FAULT_TEST_MODE, default="TEST_OFF"): cv.enum(FAULT_TEST_MODE, upper=True, space="_"),
}
)
.extend(cv.polling_component_schema("60s")),
TYPE_TEMPERATURE: sensor.sensor_schema(
ADS1220Sensor,
unit_of_measurement=UNIT_CELSIUS,
accuracy_decimals=2,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
)
.extend(
{
cv.GenerateID(CONF_ADS1220_ID): cv.use_id(ADS1220Component),
}
)
.extend(cv.polling_component_schema("60s")),
},
default_type=TYPE_ADC,
)
async def to_code(config):
#var = await sensor.new_sensor(config)
#await cg.register_component(var, config)
#await cg.register_parented(var, config[CONF_ADS1220_ID])
paren = await cg.get_variable(config[CONF_ADS1220_ID])
var = cg.new_Pvariable(config[CONF_ID], paren)
await sensor.register_sensor(var, config)
await cg.register_component(var, config)
cg.add(var.set_multiplexer(config[CONF_MULTIPLEXER]))
cg.add(var.set_gain(config[CONF_GAIN]))
if config[CONF_TYPE] == TYPE_ADC:
cg.add(var.set_multiplexer(config[CONF_MULTIPLEXER]))
cg.add(var.set_gain(config[CONF_GAIN]))
cg.add(var.set_datarate(config[CONF_DATARATE]))
cg.add(var.set_operating_mode(config[CONF_OP_MODE]))
cg.add(var.set_conversion_mode(config[CONF_CONV_MODE]))
cg.add(var.set_vref_source(config[CONF_VREF]))
cg.add(var.set_fir_filter(config[CONF_FIR]))
cg.add(var.set_low_side_power_switch(config[CONF_PSW]))
cg.add(var.set_idac_current(config[CONF_IDAC_CURRENT]))
cg.add(var.set_idac_1_routing(config[CONF_IDAC_1_ROUTING]))
cg.add(var.set_idac_2_routing(config[CONF_IDAC_2_ROUTING]))
cg.add(var.set_drdy_mode(config[CONF_DRDY_MODE]))
if config[CONF_TYPE] == TYPE_TEMPERATURE:
cg.add(var.set_temp_sensor_mode(True))
cg.add(paren.register_sensor(var))