From e2fe8396ca1b4e4923c811ca4157b023a81c2d2f Mon Sep 17 00:00:00 2001 From: Mikhail Date: Fri, 2 May 2025 23:40:54 +0300 Subject: [PATCH] First attempt --- Inc/DS_INA226.h | 76 +++++++++++++++++++++++++--- Src/DS_INA226.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 196 insertions(+), 12 deletions(-) diff --git a/Inc/DS_INA226.h b/Inc/DS_INA226.h index ddf32f5..86e4c32 100644 --- a/Inc/DS_INA226.h +++ b/Inc/DS_INA226.h @@ -18,22 +18,82 @@ typedef struct DS_INA226 { -// SPI_HandleTypeDef* SPI; -// char DisplayData[8]; -// uint8_t Dots; -// uint8_t DecodeMode, Intensivity, ScanLimit; -// bool EnableDecodeMode; -// GPIO_TypeDef* Port_CS; -// uint16_t Pin_CS; + uint8_t DevAddr; + I2C_HandleTypeDef *hi2c; + uint16_t SensorData[9]; + float Current_LSB; + uint8_t ShuntResistance; //mOhm }DS_INA226; -void DS_INA226_Init(void); +void DS_INA226_Init(DS_INA226 *DS_INA226, I2C_HandleTypeDef *hi2c, uint8_t DevAddr); +/// @brief Sets the number of samples that will be collected and averaged together +/// 0 - 1 +/// 1 - 4 +/// 2 - 16 +/// 3 - 64 +/// 4 - 128 +/// 5 - 256 +/// 6 - 512 +/// 7 - 1024 +/// @param DS_INA226 struct DS_INA226 +/// @param AveragingMode 0-7 +void _DS_INA226_SetAveragingMode(DS_INA226 *DS_INA226, uint8_t AveragingMode); +/// @brief Sets the conversion time for the bus voltage measurement +/// 0 - 140μs +/// 1 - 204μs +/// 2 - 332μs +/// 3 - 588μs +/// 4 - 1.1ms +/// 5 - 2.116ms +/// 6 - 4.156ms +/// 7 - 8.244ms +/// +/// @param DS_INA226 struct DS_INA226 +/// @param ConversionTime 0-7 +void _DS_INA226_SetBusVoltageConversionTime(DS_INA226 *DS_INA226, uint8_t ConversionTime); +/// @brief Sets the conversion time for the shunt voltage measurement +/// 0 - 140μs +/// 1 - 204μs +/// 2 - 332μs +/// 3 - 588μs +/// 4 - 1.1ms +/// 5 - 2.116ms +/// 6 - 4.156ms +/// 7 - 8.244ms +/// +/// @param DS_INA226 struct DS_INA226 +/// @param ConversionTime 0-7 +void _DS_INA226_SetShuntVoltageConversionTime(DS_INA226 *DS_INA226, uint8_t ConversionTime); +/// @brief Selects continuous, triggered, or power-down mode of operation +/// 0 - Power-Down +/// 1 - Shunt Voltage, Triggered +/// 2 - Bus Voltage, Triggered +/// 3 - Shunt and Bus, Triggered +/// 4 - Power-Down +/// 5 - Shunt Voltage, Continuous +/// 6 - Bus Voltage, Continuous +/// 7 - Shunt and Bus, Continuous +/// +/// @param DS_INA226 struct DS_INA226 +/// @param OperatingMode 0-7 +void _DS_INA226_SetOperatingMode(DS_INA226 *DS_INA226, uint8_t OperatingMode); +/// @brief Update DS_INA226 structure +/// @param DS_INA226 struct DS_INA226 +void _DS_INA226_GetAllMemory(DS_INA226 *DS_INA226); + +uint16_t DS_INA226_GetShuntVoltage(DS_INA226 *DS_INA226); + +uint16_t DS_INA226_GetBusVoltage(DS_INA226 *DS_INA226); + +float DS_INA226_GetPower(DS_INA226 *DS_INA226); + +float DS_INA226_GetCurrent(DS_INA226 *DS_INA226); #endif //DS_INA226_H \ No newline at end of file diff --git a/Src/DS_INA226.c b/Src/DS_INA226.c index 0134fd9..0fe793a 100644 --- a/Src/DS_INA226.c +++ b/Src/DS_INA226.c @@ -1,6 +1,130 @@ -#include "../../Inc/DS_INA226.h" +#include "../../Library/DS_INA226/Inc/DS_INA226.h" -void DS_INA226_Init(void) +void DS_INA226_Init(DS_INA226 *DS_INA226, I2C_HandleTypeDef *hi2c, uint8_t DevAddr) { - -} \ No newline at end of file + DS_INA226->DevAddr = DevAddr; + DS_INA226->hi2c = hi2c; + DS_INA226->ShuntResistance = 100; // 0.1 Ohm + // Current_LSB = Maximum Expected Current / 32768 + DS_INA226->Current_LSB = (float)1/32768; // for 1 Ampere + + + + // _current_lsb = _i_max / 32768 + + DS_INA226->SensorData[0] = 0; + DS_INA226->SensorData[1] = 0; + DS_INA226->SensorData[2] = 0; + DS_INA226->SensorData[3] = 0; + DS_INA226->SensorData[4] = 0; + DS_INA226->SensorData[5] = 0; + DS_INA226->SensorData[6] = 0; + DS_INA226->SensorData[7] = 0; + //Die ID + DS_INA226->SensorData[8] = 0; + + HAL_I2C_Mem_Read(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 0, 1, (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100); + HAL_I2C_Mem_Read(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 1, 1, (uint8_t*)(&DS_INA226->SensorData[1]), 2, 100); + HAL_I2C_Mem_Read(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 2, 1, (uint8_t*)(&DS_INA226->SensorData[2]), 2, 100); + HAL_I2C_Mem_Read(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 3, 1, (uint8_t*)(&DS_INA226->SensorData[3]), 2, 100); + HAL_I2C_Mem_Read(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 4, 1, (uint8_t*)(&DS_INA226->SensorData[4]), 2, 100); + HAL_I2C_Mem_Read(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 5, 1, (uint8_t*)(&DS_INA226->SensorData[5]), 2, 100); + HAL_I2C_Mem_Read(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 6, 1, (uint8_t*)(&DS_INA226->SensorData[6]), 2, 100); + HAL_I2C_Mem_Read(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 7, 1, (uint8_t*)(&DS_INA226->SensorData[7]), 2, 100); + HAL_I2C_Mem_Read(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 0xFF, 1, (uint8_t*)(&DS_INA226->SensorData[8]), 2, 100); + + //Set Calibration Register + uint16_t CAL = 0.00512 / (DS_INA226->Current_LSB * (DS_INA226->ShuntResistance/100)); + uint16_t temp=0; + temp = temp|CAL<<8; + temp = temp|CAL>>8; + HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr<<1, 5, 1, (uint8_t*)(&temp), 2, 100); +} + +void _DS_INA226_SetAveragingMode(DS_INA226 *DS_INA226, uint8_t AveragingMode) +{ + DS_INA226->SensorData[0] = DS_INA226->SensorData[0]|AveragingMode<<1; + HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr<<1, 0, 1, (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100); +} + +void _DS_INA226_SetBusVoltageConversionTime(DS_INA226 *DS_INA226, uint8_t ConversionTime) +{ + //TODO need fix! + + DS_INA226->SensorData[0] = DS_INA226->SensorData[0]|ConversionTime; + DS_INA226->SensorData[0] = DS_INA226->SensorData[0]|ConversionTime; + + HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr<<1, 0, 1, (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100); +} + +void _DS_INA226_SetShuntVoltageConversionTime(DS_INA226 *DS_INA226, uint8_t ConversionTime) +{ + //TODO need check! + DS_INA226->SensorData[0] = DS_INA226->SensorData[0]|ConversionTime<<11; + HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr<<1, 0, 1, (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100); +} + +void _DS_INA226_SetOperatingMode(DS_INA226 *DS_INA226, uint8_t OperatingMode) +{ + //TODO need check! + DS_INA226->SensorData[0] = DS_INA226->SensorData[0]|OperatingMode<<8; + HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr<<1, 0, 1, (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100); +} + +void _DS_INA226_GetAllMemory(DS_INA226 *DS_INA226) +{ + HAL_I2C_Mem_Read(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 0, 1, (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100); + HAL_I2C_Mem_Read(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 1, 1, (uint8_t*)(&DS_INA226->SensorData[1]), 2, 100); + HAL_I2C_Mem_Read(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 2, 1, (uint8_t*)(&DS_INA226->SensorData[2]), 2, 100); + HAL_I2C_Mem_Read(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 3, 1, (uint8_t*)(&DS_INA226->SensorData[3]), 2, 100); + HAL_I2C_Mem_Read(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 4, 1, (uint8_t*)(&DS_INA226->SensorData[4]), 2, 100); + HAL_I2C_Mem_Read(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 5, 1, (uint8_t*)(&DS_INA226->SensorData[5]), 2, 100); + HAL_I2C_Mem_Read(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 6, 1, (uint8_t*)(&DS_INA226->SensorData[6]), 2, 100); + HAL_I2C_Mem_Read(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 7, 1, (uint8_t*)(&DS_INA226->SensorData[7]), 2, 100); + HAL_I2C_Mem_Read(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 0xFF, 1, (uint8_t*)(&DS_INA226->SensorData[8]), 2, 100); +} + + +uint16_t DS_INA226_GetShuntVoltage(DS_INA226 *DS_INA226) +{ + //μV + + HAL_I2C_Mem_Read(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 1, 1, (uint8_t*)(&DS_INA226->SensorData[1]), 2, 100); + uint16_t temp=0; + temp = temp|((uint8_t)DS_INA226->SensorData[1])<<8; + temp = temp|DS_INA226->SensorData[1]>>8; + temp = temp * 25 / 10; + return temp; +} + +uint16_t DS_INA226_GetBusVoltage(DS_INA226 *DS_INA226) +{ + //mV + + HAL_I2C_Mem_Read(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 2, 1, (uint8_t*)(&DS_INA226->SensorData[2]), 2, 100); + uint16_t temp=0; + temp = temp|((uint8_t)DS_INA226->SensorData[2])<<8; + temp = temp|DS_INA226->SensorData[2]>>8; + temp = temp * 125 / 100; + return temp; +} + +float DS_INA226_GetPower(DS_INA226 *DS_INA226) +{ + HAL_I2C_Mem_Read(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 3, 1, (uint8_t*)(&DS_INA226->SensorData[3]), 2, 100); + uint16_t temp=0; + temp = temp|((uint8_t)DS_INA226->SensorData[3])<<8; + temp = temp|DS_INA226->SensorData[3]>>8; +// temp = temp * DS_INA226->Current_LSB; + return temp * DS_INA226->Current_LSB; +} + +float DS_INA226_GetCurrent(DS_INA226 *DS_INA226) +{ + HAL_I2C_Mem_Read(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 4, 1, (uint8_t*)(&DS_INA226->SensorData[4]), 2, 100); + uint16_t temp=0; + temp = temp|((uint8_t)DS_INA226->SensorData[4])<<8; + temp = temp|DS_INA226->SensorData[4]>>8; +// temp = temp * (DS_INA226->Current_LSB); + return temp * (DS_INA226->Current_LSB); +}