Fixed wrong shunt voltage reading
Some checks failed
Test compiling project / test (push) Failing after 2m24s

This commit is contained in:
2025-03-23 17:59:43 +01:00
parent 2fa4b0761b
commit 67e9ae1bca
5 changed files with 32 additions and 7 deletions

View File

@@ -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);
}

View File

@@ -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:

View File

@@ -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]

View File

@@ -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

View File

@@ -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();