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 运行效果

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










