BSP+Drivers for EE24+INA

This commit is contained in:
2024-02-24 19:24:00 +01:00
parent 26022126e1
commit af18558f1a
18 changed files with 728 additions and 4 deletions

View File

@@ -1,4 +1,8 @@
add_subdirectory(lwrb)
add_subdirectory(uart_driver)
add_subdirectory(nanopb)
add_subdirectory(ulog)
add_subdirectory(ulog)
add_subdirectory(ina219)
add_library(EE24 STATIC "ee24/ee24.c")
target_include_directories(EE24 PUBLIC "ee24")

1
lib/ee24 Submodule

Submodule lib/ee24 added at 4a2d7958fc

View File

@@ -0,0 +1,7 @@
add_library(INA219 STATIC
"INA219.c"
"INA219.h"
)
target_include_directories(INA219 PUBLIC ./)

179
lib/ina219/INA219.c Normal file
View File

@@ -0,0 +1,179 @@
/*
* INA219.c
*
* Created on: Dec 30, 2020
* Author: Piotr Smolen <komuch@gmail.com>
*/
#include "main.h"
#include "INA219.h"
uint16_t ina219_calibrationValue =0;
int16_t ina219_currentDivider_mA =0;
int16_t ina219_powerMultiplier_mW=0;
uint16_t Read16(INA219_t *ina219, uint8_t Register)
{
uint8_t Value[2] = {0};
HAL_I2C_Mem_Read(ina219->ina219_i2c, (ina219->Address<<1), Register, 1, Value, 2, 1000);
return ((Value[0] << 8) | Value[1]);
}
void Write16(INA219_t *ina219, uint8_t Register, uint16_t Value)
{
uint8_t addr[2];
addr[0] = (Value >> 8) & 0xff; // upper byte
addr[1] = (Value >> 0) & 0xff; // lower byte
HAL_I2C_Mem_Write(ina219->ina219_i2c, (ina219->Address<<1), Register, 1, (uint8_t*)addr, 2, 1000);
}
uint16_t INA219_ReadBusVoltage(INA219_t *ina219)
{
uint16_t result = Read16(ina219, INA219_REG_BUSVOLTAGE);
return ((result >> 3 ) * 4);
}
int16_t INA219_ReadCurrent_raw(INA219_t *ina219)
{
int16_t result = Read16(ina219, INA219_REG_CURRENT);
return (result );
}
int16_t INA219_ReadCurrent(INA219_t *ina219)
{
int16_t result = INA219_ReadCurrent_raw(ina219);
return (result / ina219_currentDivider_mA );
}
uint16_t INA219_ReadShuntVolage(INA219_t *ina219)
{
uint16_t result = Read16(ina219, INA219_REG_SHUNTVOLTAGE);
return (result * 0.01 );
}
void INA219_Reset(INA219_t *ina219)
{
Write16(ina219, INA219_REG_CONFIG, INA219_CONFIG_RESET);
HAL_Delay(1);
}
void INA219_setCalibration(INA219_t *ina219, uint16_t CalibrationData)
{
Write16(ina219, INA219_REG_CALIBRATION, CalibrationData);
}
uint16_t INA219_getConfig(INA219_t *ina219)
{
uint16_t result = Read16(ina219, INA219_REG_CONFIG);
return result;
}
void INA219_setConfig(INA219_t *ina219, uint16_t Config)
{
Write16(ina219, INA219_REG_CONFIG, Config);
}
void INA219_setCalibration_32V_2A(INA219_t *ina219)
{
uint16_t config = INA219_CONFIG_BVOLTAGERANGE_32V |
INA219_CONFIG_GAIN_8_320MV | INA219_CONFIG_BADCRES_12BIT |
INA219_CONFIG_SADCRES_12BIT_1S_532US |
INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS;
ina219_calibrationValue = 4096;
ina219_currentDivider_mA = 10; // Current LSB = 100uA per bit (1000/100 = 10)
ina219_powerMultiplier_mW = 2; // Power LSB = 1mW per bit (2/1)
INA219_setCalibration(ina219, ina219_calibrationValue);
INA219_setConfig(ina219, config);
}
void INA219_setCalibration_32V_1A(INA219_t *ina219)
{
uint16_t config = INA219_CONFIG_BVOLTAGERANGE_32V |
INA219_CONFIG_GAIN_8_320MV | INA219_CONFIG_BADCRES_12BIT |
INA219_CONFIG_SADCRES_12BIT_1S_532US |
INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS;
ina219_calibrationValue = 10240;
ina219_currentDivider_mA = 25; // Current LSB = 40uA per bit (1000/40 = 25)
ina219_powerMultiplier_mW = 0.8f; // Power LSB = 800uW per bit
INA219_setCalibration(ina219, ina219_calibrationValue);
INA219_setConfig(ina219, config);
}
void INA219_setCalibration_16V_400mA(INA219_t *ina219)
{
uint16_t config = INA219_CONFIG_BVOLTAGERANGE_16V |
INA219_CONFIG_GAIN_1_40MV | INA219_CONFIG_BADCRES_12BIT |
INA219_CONFIG_SADCRES_12BIT_1S_532US |
INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS;
ina219_calibrationValue = 8192;
ina219_currentDivider_mA = 20; // Current LSB = 50uA per bit (1000/50 = 20)
ina219_powerMultiplier_mW = 1.0f; // Power LSB = 1mW per bit
INA219_setCalibration(ina219, ina219_calibrationValue);
INA219_setConfig(ina219, config);
}
void INA219_setPowerMode(INA219_t *ina219, uint8_t Mode)
{
uint16_t config = INA219_getConfig(ina219);
switch (Mode) {
case INA219_CONFIG_MODE_POWERDOWN:
config = (config & ~INA219_CONFIG_MODE_MASK) | (INA219_CONFIG_MODE_POWERDOWN & INA219_CONFIG_MODE_MASK);
INA219_setConfig(ina219, config);
break;
case INA219_CONFIG_MODE_SANDBVOLT_TRIGGERED:
config = (config & ~INA219_CONFIG_MODE_MASK) | (INA219_CONFIG_MODE_SANDBVOLT_TRIGGERED & INA219_CONFIG_MODE_MASK);
INA219_setConfig(ina219, config);
break;
case INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS:
config = (config & ~INA219_CONFIG_MODE_MASK) | (INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS & INA219_CONFIG_MODE_MASK);
INA219_setConfig(ina219, config);
break;
case INA219_CONFIG_MODE_ADCOFF:
config = (config & ~INA219_CONFIG_MODE_MASK) | (INA219_CONFIG_MODE_ADCOFF & INA219_CONFIG_MODE_MASK);
INA219_setConfig(ina219, config);
break;
}
}
uint8_t INA219_Init(INA219_t *ina219, I2C_HandleTypeDef *i2c, uint8_t Address)
{
ina219->ina219_i2c = i2c;
ina219->Address = Address;
ina219_currentDivider_mA = 0;
ina219_powerMultiplier_mW = 0;
uint8_t ina219_isReady = HAL_I2C_IsDeviceReady(i2c, (Address << 1), 3, 2);
if(ina219_isReady == HAL_OK)
{
INA219_Reset(ina219);
INA219_setCalibration_32V_2A(ina219);
return 1;
}
else
{
return 0;
}
}

97
lib/ina219/INA219.h Normal file
View File

@@ -0,0 +1,97 @@
/*
* INA219.h
*
* Created on: Dec 30, 2020
* Author: Piotr Smolen <komuch@gmail.com>
*/
#ifndef INC_INA219_H_
#define INC_INA219_H_
#define INA219_ADDRESS (0x40)
//
// Registers
//
#define INA219_REG_CONFIG (0x00)
#define INA219_REG_SHUNTVOLTAGE (0x01)
#define INA219_REG_BUSVOLTAGE (0x02)
#define INA219_REG_POWER (0x03)
#define INA219_REG_CURRENT (0x04)
#define INA219_REG_CALIBRATION (0x05)
//
#define INA219_CONFIG_RESET (0x8000)
//
#define INA219_CONFIG_BVOLTAGERANGE_16V (0x0000) // 0-16V Range
#define INA219_CONFIG_BVOLTAGERANGE_32V (0x2000) // 0-32V Range
#define INA219_CONFIG_GAIN_1_40MV (0x0000) // Gain 1, 40mV Range
#define INA219_CONFIG_GAIN_2_80MV (0x0800) // Gain 2, 80mV Range
#define INA219_CONFIG_GAIN_4_160MV (0x1000) // Gain 4, 160mV Range
#define INA219_CONFIG_GAIN_8_320MV (0x1800) // Gain 8, 320mV Range
#define INA219_CONFIG_BADCRES_9BIT (0x0000) // 9-bit bus res = 0..511
#define INA219_CONFIG_BADCRES_10BIT (0x0080) // 10-bit bus res = 0..1023
#define INA219_CONFIG_BADCRES_11BIT (0x0100) // 11-bit bus res = 0..2047
#define INA219_CONFIG_BADCRES_12BIT (0x0180) // 12-bit bus res = 0..4097
#define INA219_CONFIG_BADCRES_12BIT_2S_1060US (0x0480) // 2 x 12-bit bus samples averaged together
#define INA219_CONFIG_BADCRES_12BIT_4S_2130US (0x0500) // 4 x 12-bit bus samples averaged together
#define INA219_CONFIG_BADCRES_12BIT_8S_4260US (0x0580) // 8 x 12-bit bus samples averaged together
#define INA219_CONFIG_BADCRES_12BIT_16S_8510US (0x0600) // 16 x 12-bit bus samples averaged together
#define INA219_CONFIG_BADCRES_12BIT_32S_17MS (0x0680) // 32 x 12-bit bus samples averaged together
#define INA219_CONFIG_BADCRES_12BIT_64S_34MS (0x0700) // 64 x 12-bit bus samples averaged together
#define INA219_CONFIG_BADCRES_12BIT_128S_69MS (0x0780) // 128 x 12-bit bus samples averaged together
#define INA219_CONFIG_SADCRES_9BIT_1S_84US (0x0000) // 1 x 9-bit shunt sample
#define INA219_CONFIG_SADCRES_10BIT_1S_148US (0x0008) // 1 x 10-bit shunt sample
#define INA219_CONFIG_SADCRES_11BIT_1S_276US (0x0010) // 1 x 11-bit shunt sample
#define INA219_CONFIG_SADCRES_12BIT_1S_532US (0x0018) // 1 x 12-bit shunt sample
#define INA219_CONFIG_SADCRES_12BIT_2S_1060US (0x0048) // 2 x 12-bit shunt samples averaged together
#define INA219_CONFIG_SADCRES_12BIT_4S_2130US (0x0050) // 4 x 12-bit shunt samples averaged together
#define INA219_CONFIG_SADCRES_12BIT_8S_4260US (0x0058) // 8 x 12-bit shunt samples averaged together
#define INA219_CONFIG_SADCRES_12BIT_16S_8510US (0x0060) // 16 x 12-bit shunt samples averaged together
#define INA219_CONFIG_SADCRES_12BIT_32S_17MS (0x0068) // 32 x 12-bit shunt samples averaged together
#define INA219_CONFIG_SADCRES_12BIT_64S_34MS (0x0070) // 64 x 12-bit shunt samples averaged together
#define INA219_CONFIG_SADCRES_12BIT_128S_69MS (0x0078) // 128 x 12-bit shunt samples averaged together
//
#define INA219_CONFIG_MODE_MASK (0x07)
#define INA219_CONFIG_MODE_POWERDOWN 0x00 /**< power down */
#define INA219_CONFIG_MODE_SVOLT_TRIGGERED 0x01 /**< shunt voltage triggered */
#define INA219_CONFIG_MODE_BVOLT_TRIGGERED 0x02 /**< bus voltage triggered */
#define INA219_CONFIG_MODE_SANDBVOLT_TRIGGERED 0x03 /**< shunt and bus voltage triggered */
#define INA219_CONFIG_MODE_ADCOFF 0x04 /**< ADC off */
#define INA219_CONFIG_MODE_SVOLT_CONTINUOUS 0x05 /**< shunt voltage continuous */
#define INA219_CONFIG_MODE_BVOLT_CONTINUOUS 0x06 /**< bus voltage continuous */
#define INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS 0x07
typedef struct
{
I2C_HandleTypeDef *ina219_i2c;
uint8_t Address;
} INA219_t;
extern uint16_t ina219_calibrationValue;
extern int16_t ina219_currentDivider_mA;
extern int16_t ina219_powerMultiplier_mW;
uint8_t INA219_Init(INA219_t *ina219, I2C_HandleTypeDef *i2c, uint8_t Address);
uint16_t INA219_ReadBusVoltage(INA219_t *ina219);
int16_t INA219_ReadCurrent(INA219_t *ina219);
int16_t INA219_ReadCurrent_raw(INA219_t *ina219);
uint16_t INA219_ReadShuntVolage(INA219_t *ina219);
void INA219_Reset(INA219_t *ina219);
void INA219_setCalibration(INA219_t *ina219, uint16_t CalibrationData);
uint16_t INA219_getConfig(INA219_t *ina219);
void INA219_setConfig(INA219_t *ina219, uint16_t Config);
void INA219_setCalibration_32V_2A(INA219_t *ina219);
void INA219_setCalibration_32V_1A(INA219_t *ina219);
void INA219_setCalibration_16V_400mA(INA219_t *ina219);
void INA219_setPowerMode(INA219_t *ina219, uint8_t Mode);
uint16_t Read16(INA219_t *ina219, uint8_t Register);
void Write16(INA219_t *ina219, uint8_t Register, uint16_t Value);
#endif /* INC_INA219_H_ */