drivers: sensor: ina237: add shunt voltage support
Add ability to retrieve the shunt voltage if the end user wants to do the power calculation manually to handle negative power values. Signed-off-by: Eric Holmberg <eric.holmberg@northriversystems.co.nz>
This commit is contained in:
parent
a70d056513
commit
19e44ae9a0
6 changed files with 95 additions and 1 deletions
|
@ -26,6 +26,20 @@ config INA237
|
|||
help
|
||||
Enable driver for INA237.
|
||||
|
||||
config INA237_VSHUNT
|
||||
bool "INA237 VShunt Measurement Enable"
|
||||
depends on DT_HAS_TI_INA237_ENABLED
|
||||
help
|
||||
Enable shunt voltage measurement for INA237.
|
||||
|
||||
This is the actual shunt voltage measured which is scaled within the
|
||||
INA237 based upon the SHUNT_CAL register. This value is useful for
|
||||
looking at measurement noise or debugging the SHUNT_CAL value.
|
||||
|
||||
Note that enabling this option requires an extra I2C read when
|
||||
SENSOR_CHAN_ALL is selected, so only enable if the shunt voltage
|
||||
measurement is required.
|
||||
|
||||
config INA230_TRIGGER
|
||||
bool "INA230 trigger mode"
|
||||
depends on INA230
|
||||
|
|
|
@ -65,6 +65,18 @@ static int ina237_channel_get(const struct device *dev, enum sensor_channel chan
|
|||
INA237_POWER_TO_uW((uint64_t)data->power * config->current_lsb));
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_INA237_VSHUNT
|
||||
case SENSOR_CHAN_VSHUNT:
|
||||
if (config->config & INA237_CFG_HIGH_PRECISION) {
|
||||
/* high-resolution mode - 1.25 uV/bit, sensor value is in mV */
|
||||
micro_s32_to_sensor_value(val, data->shunt_voltage * 1250);
|
||||
} else {
|
||||
/* standard-resolution - 5 uV/bit -> nano-volts */
|
||||
micro_s32_to_sensor_value(val, data->shunt_voltage * 5000);
|
||||
}
|
||||
break;
|
||||
#endif /* CONFIG_INA237_VSHUNT */
|
||||
|
||||
case SENSOR_CHAN_DIE_TEMP:
|
||||
micro_s32_to_sensor_value(val, INA237_DIETEMP_TO_uDegC(data->die_temp));
|
||||
break;
|
||||
|
@ -165,6 +177,16 @@ static int ina237_read_data(const struct device *dev)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_INA237_VSHUNT
|
||||
if ((data->chan == SENSOR_CHAN_ALL) || (data->chan == SENSOR_CHAN_VSHUNT)) {
|
||||
ret = ina23x_reg_read_16(&config->bus, INA237_REG_SHUNT_VOLT, &data->shunt_voltage);
|
||||
if (ret < 0) {
|
||||
LOG_ERR("Failed to read shunt voltage");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_INA237_VSHUNT */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -179,7 +201,11 @@ static int ina237_sample_fetch(const struct device *dev, enum sensor_channel cha
|
|||
struct ina237_data *data = dev->data;
|
||||
|
||||
if (chan != SENSOR_CHAN_ALL && chan != SENSOR_CHAN_VOLTAGE && chan != SENSOR_CHAN_CURRENT &&
|
||||
chan != SENSOR_CHAN_POWER && chan != SENSOR_CHAN_DIE_TEMP) {
|
||||
chan != SENSOR_CHAN_POWER &&
|
||||
#ifdef CONFIG_INA237_VSHUNT
|
||||
chan != SENSOR_CHAN_VSHUNT &&
|
||||
#endif /* CONFIG_INA237_VSHUNT */
|
||||
chan != SENSOR_CHAN_DIE_TEMP) {
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
|
|
|
@ -43,6 +43,9 @@ struct ina237_data {
|
|||
uint16_t bus_voltage;
|
||||
uint32_t power;
|
||||
int16_t die_temp;
|
||||
#ifdef CONFIG_INA237_VSHUNT
|
||||
int16_t shunt_voltage;
|
||||
#endif
|
||||
enum sensor_channel chan;
|
||||
struct ina23x_trigger trigger;
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue