BSP+Drivers for EE24+INA
This commit is contained in:
@@ -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
1
lib/ee24
Submodule
Submodule lib/ee24 added at 4a2d7958fc
7
lib/ina219/CMakeLists.txt
Normal file
7
lib/ina219/CMakeLists.txt
Normal 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
179
lib/ina219/INA219.c
Normal 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
97
lib/ina219/INA219.h
Normal 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_ */
|
||||
Reference in New Issue
Block a user