From 67e9ae1bca07a138274ca34e0c3d2b626744e010 Mon Sep 17 00:00:00 2001 From: tobimai Date: Sun, 23 Mar 2025 17:59:43 +0100 Subject: [PATCH] Fixed wrong shunt voltage reading --- lib/INA233/INA233.cpp | 27 ++++++++++++++++++++++++--- lib/INA233/INA233.h | 5 ++++- platformio.ini | 2 +- src/global_data/defines.h | 2 +- src/sensor/sensor.cpp | 3 ++- 5 files changed, 32 insertions(+), 7 deletions(-) diff --git a/lib/INA233/INA233.cpp b/lib/INA233/INA233.cpp index 9183374..df39a15 100644 --- a/lib/INA233/INA233.cpp +++ b/lib/INA233/INA233.cpp @@ -23,7 +23,7 @@ uint16_t get_word(uint8_t address, uint8_t reg) { return (data[1] << 8) | data[0]; } -String INA233::print_device_number() { +String INA233::get_device_model() { char data[7]; // Array size includes space for the null terminator // Request data from the PMBus device @@ -57,6 +57,13 @@ void sendWord(uint8_t deviceAddress, uint8_t registerAddress, uint16_t value) { Wire.endTransmission(); } +void sendByte(uint8_t deviceAddress, uint8_t registerAddress, uint8_t value) { + Wire.beginTransmission(deviceAddress); + Wire.write(registerAddress); // Send the register address + Wire.write((uint8_t)value); // Send the low byte first + Wire.endTransmission(); + } + INA233::INA233(const uint8_t address, TwoWire *wire) { _address = address; @@ -109,8 +116,18 @@ float INA233::getBusVoltage() { } float INA233::getShuntVoltage() { - uint16_t rawVoltage = get_word(INA233::_address, REGISTER_READ_VSHUNT); - float voltage = rawVoltage * pow(10,-4); + int16_t rawVoltage = get_word(INA233::_address, REGISTER_READ_VSHUNT); // Read raw voltage (16-bit register) + + // Convert from two's complement to an integer value + // If the MSB (most significant bit) is set, the number is negative + if (rawVoltage & 0x8000) { // Check if MSB (bit 15) is set + rawVoltage = rawVoltage - 0x10000; // Convert two's complement negative number + } + + // Convert value according to the datasheet + // LSB: 2.5 μV per bit -> Multiply by 2.5e-6 to convert to volts + float voltage = rawVoltage * 2.5e-6; + return voltage; } @@ -174,4 +191,8 @@ void INA233::setShuntVoltageConversionTime(ConversionTime conversion_time) { uint16_t INA233::getConfigRegister() { return get_word(INA233::_address, REGISTER_CONFIGURATION); +} + +void INA233::reset() { + sendByte(INA233::_address, 0x12, 0x00); } \ No newline at end of file diff --git a/lib/INA233/INA233.h b/lib/INA233/INA233.h index e4931a7..962a05d 100644 --- a/lib/INA233/INA233.h +++ b/lib/INA233/INA233.h @@ -7,6 +7,7 @@ #define REGISTER_READ_VIN 0x88 #define REGISTER_READ_VSHUNT 0xD1 #define REGISTER_CONFIGURATION 0xD0 +#define REGISTER_READ_IIN 0x89 enum AveragingMode { averages_1 = B000, @@ -32,7 +33,7 @@ enum ConversionTime { class INA233{ public: - String print_device_number(); + String get_device_model(); INA233(uint8_t addr, TwoWire* wire = &Wire); bool begin(const uint8_t sda, const uint8_t scl); @@ -46,6 +47,8 @@ class INA233{ uint16_t getConfigRegister(); + void reset(); + bool isConnected(void); private: diff --git a/platformio.ini b/platformio.ini index 408d44d..c175f92 100644 --- a/platformio.ini +++ b/platformio.ini @@ -25,7 +25,7 @@ lib_deps = https://github.com/tobimai/elog.git#fix-syslog board_build.partitions = default.csv upload_protocol = espota -upload_port = 192.168.5.205 +upload_port = 10.1.10.8 build_flags = -Wall -Wextra -DLOGGING_SPIFFS_DISABLE -DLOGGING_SD_DISABLE [env:ESP32_INA226] diff --git a/src/global_data/defines.h b/src/global_data/defines.h index e4e92d7..503d17d 100644 --- a/src/global_data/defines.h +++ b/src/global_data/defines.h @@ -7,7 +7,7 @@ #define water_level_min_key "water_level_min" #define water_level_max_key "water_level_max" #define water_volume_key "water_volume" -#define current_software_version Version{1, 0, 1} +#define current_software_version Version{1, 0, 0} #define REQUIRED_SPIFFS_VERSION Version{8, 0, 0} #define RESISTOR_VALUE 4 \ No newline at end of file diff --git a/src/sensor/sensor.cpp b/src/sensor/sensor.cpp index 913ecc2..55cabd3 100644 --- a/src/sensor/sensor.cpp +++ b/src/sensor/sensor.cpp @@ -33,6 +33,7 @@ void init_sensor(){ ina_sensor.setShuntVoltageConversionTime(7); ina_sensor.setAverage(4); #else + ina_sensor.reset(); ina_sensor.setShuntVoltageConversionTime(conversion_time_8244uS); ina_sensor.setBusVoltageConversionTime(conversion_time_8244uS); ina_sensor.setAveragingMode(averages_128); @@ -44,7 +45,7 @@ void read_sensor_task(void* parameter) while (true) { // Get Values from sensor - String chip_id = ina_sensor.print_device_number(); + String chip_id = ina_sensor.get_device_model(); LOG(DEBUG, "Chip Model: %s", chip_id.c_str()); float bus_voltage = ina_sensor.getBusVoltage();