INA219功率监测+OLED显示

INA219功率监测+OLED显示
2025年09月28日 10:07 电子产品世界

1   简介

INA219是一款由Texas Instruments(TI)生产的高精度电流/ 电压/ 功率监测芯片,采用I2C接口通信,广泛应用于电池管理、电源监控、太阳能系统、电机控制等领域。

1.1 主要特性测量范围:

电压测量(总线电压):0 V~26 V(可配置)电流测量(分流电阻电压):±40 mV(可调增益)功率计算(基于电压和电流)高精度:16 位ADC(模数转换器)可配置增益(PGA 放大倍数)通信接口:I2C 接口(标准模式100 kHz,快速模式400 kHz)可编程地址(支持16 个I2C 地址)低功耗:工作电流低至1 mA 支持低功耗模式封装:SOT23-8(小型贴片封装)。

1.2 工作原理

INA219通过分流电阻(Shunt Resistor)测量电流,并同时监测总线电压,计算功率:电流测量校准值电压测量总线电压(Vbus)功率计算。

INA219提供多个寄存器,用于配置和读取数据:

寄存器地址名称功能:

1.3 cubemx配置

INA219的通信接口为IIC,可以使用STM32内置硬件I2C外设与INA219模块实现数据通信。

2   程序设计

view plaincopy to clipboardprint?

1. #ifndef __INA219_H

2. #defi ne __INA219_H

3.

4. #include “main.h”

5. extern I2C_HandleTypeDef *hina219_i2c;

6. #defi ne INA219_ADDRESS (0x40 << 1) // 默认地址 左移1 位

7.

8. // 寄存器地址

9. #defi ne INA219_REG_CONFIG 0×00

10. #defi ne INA219_REG_SHUNTVOLTAGE 0×01

11. #defi ne INA219_REG_BUSVOLTAGE 0×02

12. #defi ne INA219_REG_POWER 0×03

13. #defi ne INA219_REG_CURRENT 0×04

14. #define INA219_REG_CALIBRATION 0×05

15.

16. // 配置参数

17. #define INA219_CONFIG_RESET 0x8000

18. #define INA219_CONFIG_BVOLTAGERANGE_

32V 0×2000

19. #define INA219_CONFIG_GAIN_8_320MV

0×1800

20. #define INA219_CONFIG_BADCRES_12BIT

0×0180

21. #define INA219_CONFIG_SADCRES_12BIT_

1S_532US 0×0018

22. #define INA219_CONFIG_MODE_

SANDBVOLT_CONTINUOUS 0×0007

23.

24.

25. void INA219_Init(I2C_HandleTypeDef *hi2c);

26. float INA219_GetShuntVoltage_mV(void);

27. float INA219_GetBusVoltage_V(void);

28. float INA219_GetCurrent_mA(void);

29. float INA219_GetPower_mW(void);

30. uint16_t INA219_ReadReg(uint8_t reg);

31. void INA219_WriteReg(uint8_t reg, uint16_t value);

32. #endif

INA219 的IIC 地址为0×40,因此需要将模块的A0、A1 拨码开关调至GND

view plaincopy to clipboardprint?

1. #include “ina219.h”

2. #include

3.

4. I2C_HandleTypeDef *hina219_i2c;

5. float currentLSB = 0.0f;

6. float powerLSB = 0.0f;

7.

8. void INA219_Init(I2C_HandleTypeDef *hi2c) {

9. hina219_i2c = hi2c;

10.

11. // 计算LSB

12. // 假设使用0.1 欧姆分流电阻,最大预期电流为3.2A

13. float maxExpectedCurrent = 3.2f;

14. currentLSB = maxExpectedCurrent / 32768.0f;

15. powerLSB = 20.0f * currentLSB;

16.

17. // 写入校准寄存器

18. uint16_t calibrationValue = (uint16_t)(0.04096f / (currentLSB * 0.1f));

19. INA219_WriteReg(INA219_REG_CALIBRATION, calibrationValue);

20.

21. // 配置寄存器

22. uint16_t config = INA219_CONFIG_

BVOLTAGERANGE_32V |

23. INA219_CONFIG_GAIN_8_320MV |

24. INA219_CONFIG_BADCRES_12BIT |

25. INA219_CONFIG_SADCRES_12BIT_1S_532US |

26. INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS;

27.

28. INA219_WriteReg(INA219_REG_CONFIG,config);

29.

30. }

31.

32. uint16_t INA219_ReadReg(uint8_t reg) {

33. uint8_t data[2];

34. HAL_I2C_Mem_Read(hina219_i2c, INA219_

ADDRESS, reg, 1, data, 2, HAL_MAX_DELAY);

35. return (data[0] << 8) | data[1];

36. }

37.

38. void INA219_WriteReg(uint8_t reg, uint16_t value) {

39. uint8_t data[2] = {value >> 8, value & 0xFF};

40. HAL_I2C_Mem_Write(hina219_i2c, INA219_ADDRESS, reg, 1, data, 2, HAL_MAX_DELAY);

41. }

42.

43. float INA219_GetShuntVoltage_mV(void) {

44. int16_t value = (int16_t)INA219_ReadReg(INA219_REG_SHUNTVOLTAGE);

45. return value * 0.01f; // LSB = 10uV

46. }

47.

48. float INA219_GetBusVoltage_V(void) {

49. uint16_t value = INA219_ReadReg(INA219_REG_BUSVOLTAGE);

50. return (value >> 3) * 0.004f; // LSB = 4mV

51. }

52.

53. float INA219_GetCurrent_mA(void) {

54. int16_t value = (int16_t)INA219_ReadReg(INA219_REG_CURRENT);

55. return value * currentLSB * 10000.0f;

56. }

57.

58. float INA219_GetPower_mW(void) {

59. int16_t value = (int16_t)INA219_ReadReg(INA219_REG_POWER);

60. return value * powerLSB * 1000.0f;

61. }

引脚连接顺序如下:

INA219模块+端连接+5 V

INA219模块-端连接GND

INA219模块C端连接SCL

INA219模块D端连接SDA

INA219模块IN+端连接+5V或+12V电源

INA219模块GND端连接电源GND端

INA219模块IN-端连接电机负载+端

电机负载-端连接电源GND 端

3   功率监测效果

以下是INA219空载的检测结果:

4   OLED显示功率信息

定义字符数组变量,用于存储格式化字符串:

view plaincopy to clipboardprint?

1./* USER CODE BEGIN PV */

2.char StrBuff[12];

3./* USER CODE END PV */OLED信息显示:view plaincopy to clipboardprint?

1.void SimpleInfoShow(){

2.ssd1306_Fill(Black);

3.OLED_ShowChinese(0,0,0,16);

4.OLED_ShowChinese(15,0,1,16);

5.OLED_ShowChinese(30,0,2,16);

6.OLED_ShowChinese(45,0,3,16);

7.OLED_ShowChinese(60,0,4,16);

8.OLED_ShowChinese(75,0,5,16);

9.OLED_ShowChinese(90,0,6,16);

10.

11.OLED_ShowChinese(0,16,7,16); // 电

12.OLED_ShowChinese(15,16,8,16); // 流

13. OLED_ShowChar(30,16,’:’,16);

14. OLED_ShowString(90,16,(uint8_t*)”mA”,16);

15.

16.

17. OLED_ShowChinese(0,16*2,9,16); // 电

18. OLED_ShowChinese(15,16*2,10,16); // 压

19. OLED_ShowChar(30,16*2,’:’,16);

20. OLED_ShowString(90,16*2,(uint8_t*)”mV”,16);

21.

22. OLED_ShowChinese(0,16*3,0,16); // 功

23. OLED_ShowChinese(15,16*3,1,16); // 率

24. OLED_ShowChar(30,16*3,’:’,16);

25. OLED_ShowString(90,16*3,(uint8_t*)”mW”,16);

26. }

INA219、OLED 屏幕初始化:

view plaincopy to clipboardprint?

1. /* USER CODE BEGIN 2 */

2. INA219_Init(&hi2c1);

3. ssd1306_Init();

4. ssd1306_Fill(Black);

5. SimpleInfoShow();

6. /* USER CODE END 2 */

执行功率数据监测,并实时更新至OLED屏幕显示:

view plaincopy to clipboardprint?

1. while (1)

2. {

3. /* USER CODE END WHILE */

4.

5. /* USER CODE BEGIN 3 */

6. HAL_Delay(1000);

7. float busVoltage = INA219_GetBusVoltage_V();

8. float shuntVoltage = INA219_GetShuntVoltage_mV();

9. float current = INA219_GetCurrent_mA();

10. float power = INA219_GetPower_mW();

11. printf(“INA219 Detect: vbus:%f V; current:%f mA,vshunt:%f v,power:%fwrn”, busVoltage,current,shuntVoltage,power);

12.sprintf(StrBuff,”%03.0f mA”,current);

13.OLED_ShowString(40,16,(uint8_t*)StrBuff,16);

14.

15.sprintf(StrBuff,”%03.0f mV”,busVoltage/1000);

16.OLED_ShowString(40,16*2,(uint8_t*)StrBuff,16);

17.

18.sprintf(StrBuff,”%03.0f mW”,power);

19.OLED_ShowString(40,16*3,(uint8_t*)StrBuff,16);

20.

21.

22.}

23./*USER CODE END 3 */

24.}

5   运行效果

OLED
新浪科技公众号
新浪科技公众号

“掌”握科技鲜闻 (微信搜索techsina或扫描左侧二维码关注)

创事记

科学探索

科学大家

苹果汇

众测

专题

官方微博

新浪科技 新浪数码 新浪手机 科学探索 苹果汇 新浪众测

公众号

新浪科技

新浪科技为你带来最新鲜的科技资讯

苹果汇

苹果汇为你带来最新鲜的苹果产品新闻

新浪众测

新酷产品第一时间免费试玩

新浪探索

提供最新的科学家新闻,精彩的震撼图片