这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【Let'sdo第1期-DIY功率检测与控制系统】05过程帖:基础任务2使用开发

共3条 1/1 1 跳转至

【Let'sdo第1期-DIY功率检测与控制系统】05过程帖:基础任务2使用开发板实现对INA219的负载测量5V,12V电压电流并显示在OLED

高工
2025-06-18 19:36:29     打赏

在实现OLED显示文字的基础上,完成对INA 219数据读取,并且检测5V 或者12 V的电压电流;

一:INA219知识点分享:

1.1 芯片知识点如下:

INA219 是一款具备IIC或 SMBUS 兼容接口的分流器和功率监测计。该器件监测分流器电压降和总线电源电压,转换次数和滤波选项可通过编程设定。可编程校准值与内部乘法器相结合,支持直接读取电流值(单位:安培)。通过附加乘法寄存器可计算功率(单位:瓦)。I2C 或 SMBUS 兼容接口 具有 16 个可编程地址。

INA219 提供两种级别:A级和B级。B级型号的精度更高且精密规范更加严格。

INA219 可在 0V 至 26V 范围内感测总线中的分压。该器件由 3V 至 5.5V 单电源供电,电源的最大流耗为1mA。INA219 的工作温度范围为 -40°C 至 125°C.

1.2 模块的特征:

感测的总线电压范围:0V至26V

报告电流、电压、和功率

16 个可编程地址

高精度:整个温度范围内的精度为0.5%(最大值)(INA219B)

滤波选项

校准寄存器

小外形尺寸品体管(SOT)23-8 和小外形尺寸集成电路(SOIC)-8 封装

二:STM32cube MX 软件配置如下:

1.png

这里我所使用的引脚是硬件IIC,该款开发板具有三个IIC接口,所以我们为了快速调试模块,直接使用硬件驱动,参考OLED的模块的驱动,只需要更改寄存器就可以。

三:软件代码如下:

3.1   初始化INA219

/***********************************************************************************************
  * @brief   void INA219_Init(I2C_HandleTypeDef *hi2c)
  * @param   INA 219模块初始化函数
  * @retval  无
  * @author  聪聪哥哥
  * @version V1.1.0
  * @date     25-5-2025
*************************************************************************************************/
void INA219_Init(I2C_HandleTypeDef *hi2c)
{
     float maxExpectedCurrent = 3.2f;
      currentLSB= maxExpectedCurrent/32768.0f;
      powerLSB=20.0f * currentLSB;

			//配置寄存器
			uint16_t config=INA219_CONFIG_BVOLTAGERANGE_32V|
			INA219_CONFIG_GAIN_8_320MV|
			INA219_CONFIG_BADCRES_12BIT|
			INA219_CONFIG_SADCRES_12BIT_128S_69MS|
			INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS;

			INA219_WriteReg(INA219_REG_CONFIG,config);
			INA219_WriteReg(INA219_REG_CALIBRATION,INA_CAL);
}

3.2  读取模块的寄存器地址:

/***********************************************************************************************
  * @brief   uint16_t INA219_ReadReg(uint8_t reg)
  * @param   读取INA 219模块寄存器函数
  * @retval  无
  * @author  聪聪哥哥
  * @version V1.1.0
  * @date     25-5-2025
*************************************************************************************************/
uint16_t INA219_ReadReg(uint8_t reg){
uint8_t data[2];
HAL_I2C_Mem_Read(&hi2c3,INA219_ADDRESS,reg,1,data,2,HAL_MAX_DELAY);
return(data[0]<<8)|data[1];
}

3.2 写入模块的寄存器地址:

/***********************************************************************************************
  * @brief   void INA219_WriteReg(uint8_t reg, uint16_t value)
  * @param   写入INA 219模块寄存器函数
  * @retval  无
  * @author  聪聪哥哥
  * @version V1.1.0
  * @date     25-5-2025
*************************************************************************************************/
void INA219_WriteReg(uint8_t reg, uint16_t value){
uint8_t data[2]= {value >>8,value& 0xFF};
HAL_I2C_Mem_Write(&hi2c3, INA219_ADDRESS,reg,1,data,2,HAL_MAX_DELAY);
}

3.3 读取功率,电流电压函数如下所示:

/***********************************************************************************************
  * @brief   float INA219_GetBusVoltage_V
  * @param   
  * @retval  无
  * @author  聪聪哥哥
  * @version V1.1.0
  * @date     25-5-2025
*************************************************************************************************/
float INA219_GetBusVoltage_V(void) {
uint16_t value = INA219_ReadReg(INA219_REG_BUSVOLTAGE);
return (value>>3)* 4;//?LSB?=?4mV
}
/***********************************************************************************************
  * @brief   float  INA219_GetCurrent_mA(void)
  * @param   
  * @retval  无
  * @author  聪聪哥哥
  * @version V1.1.0
  * @date     25-5-2025
*************************************************************************************************/
float  INA219_GetCurrent_mA(void){
int16_t value = (int16_t)INA219_ReadReg(INA219_REG_CURRENT);
return value * IAN_I_LSB  * 10000.0f;
}
/***********************************************************************************************
  * @brief   float INA219_GetPower_mW(void)
  * @param   
  * @retval  无
  * @author  聪聪哥哥
  * @version V1.1.0
  * @date     25-5-2025
*************************************************************************************************/
float INA219_GetPower_mW(void) {
 int16_t value = (int16_t)INA219_ReadReg(INA219_REG_POWER);
 return value * INA_Power_LSB * 1000.0f;
}

3.4  显示函数如下:

显示固定如下:

/***********************************************************************************************
  * @brief   void WorkPageImmobility(void)
  * @param   工作界面固定显示
  * @retval  无
  * @author  聪聪哥哥
  * @version V1.1.0
  * @date     25-5-2025
*************************************************************************************************/
void WorkPageImmobility(void)
{

	OLED_ShowCN(0, 2, 6);
	OLED_ShowCN(16, 2, 7);

	OLED_ShowCN(0, 4, 8);
	OLED_ShowCN(16, 4, 9);

	OLED_ShowCN(0, 6, 10);
	OLED_ShowCN(16, 6, 11);

	OLED_ShowStr(100, 2, (uint8_t *)"MV", 2);
	OLED_ShowStr(100, 4, (uint8_t *)"MA", 2);
	OLED_ShowStr(100, 6, (uint8_t *)"MW", 2);

}

显示检测到电压电流如下:

/***********************************************************************************************
  * @brief   void WorkPageDataDisplay(void)
  * @param   工作界面数据显示
  * @retval  无
  * @author  聪聪哥哥
  * @version V1.1.0
  * @date     25-5-2025
*************************************************************************************************/
const uint8_t test[] = "Hello world";
void WorkPageDataDisplay(void)
{
	uint16_t TempStr[16];

	sprintf((char*)TempStr,"%3d",iOriginalVoltageData); 
	OLED_ShowStr(40, 2, (uint8_t *)TempStr, 2);

	OLED_ShowNum(50,4,iOriginalElectriData,5,16);

	OLED_ShowNum(50,6,iOriginalPowerData,5,16);
}

四:实测图片如下所示:

为了保证模块可以正常的工作,这里并没有测试 12V的电压,防止损坏了模块。

测试代码如下:

05_OLED_time_key_IN219.zip

后记:目前测试 直接读取的数据,会存在误差,需要对数据进行处理。




关键词: STM32F411     INA219    

专家
2025-06-18 20:40:45     打赏
2楼

感谢分享


菜鸟
2025-06-19 00:06:12     打赏
3楼

26V 内应该都没事



共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]