INA219 电流传感器

STM32F103C8T6  |  HAL库  |  软件I2C通信  |  高精度电流/电压/功率监测

3~5.5V
工作电压
I2C
通信方式
±3.2A
检测范围
0x40
I2C地址
12-bit
ADC精度

1. 传感器原理与功能

INA219 高精度电流/电压/功率监测芯片工作原理及应用功能

1.1 工作原理

INA219 是 TI(德州仪器)生产的高侧电流分流与功率监测芯片,通过I2C接口与主控通信。其核心原理是在负载回路中串联一个分流电阻(Shunt Resistor,通常0.1Ω),当电流流过分流电阻时会产生微小的电压降。INA219 内部集成的12位Delta-Sigma ADC分别测量分流电阻两端的电压降(Shunt Voltage)和负载两端的总线电压(Bus Voltage),然后通过内部校准寄存器计算出实际电流值和功率值,将结果存入对应寄存器供主控读取。

具体流程为:电流流过分流电阻 → 产生电压降 → ADC采样 → 校准计算 → 得到电流/功率 → I2C传输至STM32。这种方式属于高侧检测(在电源正极侧测量),相比低侧检测不会破坏负载的地线参考,是更安全可靠的方案。

1.2 核心功能

⚡

总线电压测量

测量负载两端的实际工作电压,量程0~26V,分辨率4mV,适用于3.3V/5V/12V/24V等多种供电场景。

🔀

分流电压测量

测量分流电阻两端的微小电压降,分辨率10µV,支持双向测量(正/负电流),量程±320mV。

📊

电流与功率计算

内部根据校准值自动计算电流值和功率值,无需主控参与运算,直接读取寄存器即可获得结果。

📡

I2C数字接口

标准I2C通信,支持16个可编程地址(A0/A1引脚配置),兼容3.3V/5V逻辑电平,通信速率最高1MHz。

1.3 引脚定义

INA219 模块 VCC GND SCL SDA V- V+ A0 A1 INA219
引脚名称功能STM32连接
1VCC模块供电正极 (3~5.5V)3.3V
2GND模块供电地GND
3SCLI2C时钟线PB12
4SDAI2C数据线PB13
5V-分流电阻负端(接负载)负载正极
6V+分流电阻正端(接电源)电源正极
7A0地址选择位0GND (地址0x40)
8A1地址选择位1GND (地址0x40)
⚠ 接线提醒:传感器必须串联接入被测电路
INA219 采用高侧电流检测方案,必须串联在电源与负载之间,而非并联在电源两端。正确接线路径为:电源正极 → 模块 V+ → 模块 V- → 负载正极,负载负极接回电源负极形成回路。电流流经模块内部 0.1Ω 分流电阻时产生压降,芯片据此计算电流值。

切勿将 V+ 与 V- 短接或直接并联在电源两端,否则分流电阻被旁路,无法测量电流,且大电流可能烧毁模块。
电源 12V V+ → INA219 0.1Ω 分流电阻 串联接入回路 V- → 负载 用电设备 SCL(PB12) / SDA(PB13) → STM32 电流路径:电源 → INA219 → 负载 → 回电源

2. 模块外观展示

INA219 电流传感器模块实物外观与尺寸

正面外观

模块正面外观

背面外观

模块背面外观

尺寸图

模块尺寸图

3. 原理图与PCB封装

INA219 模块电路原理图与PCB封装设计

原理图

INA219 模块电路原理图 — V+与V-之间为分流电阻,SCL/SDA通过上拉电阻连接至I2C总线

PCB封装

INA219 模块PCB封装图 — 展示元器件布局与焊盘位置

4. 程序分析

STM32 HAL库程序代码分析 — 从系统初始化到数据读取与显示的完整流程

4.1 系统初始化

系统上电后,依次执行 HAL库初始化、系统时钟配置(HSE 8MHz × PLL9 = 72MHz)、GPIO初始化,然后初始化OLED显示屏和INA219传感器。INA219初始化包括I2C引脚配置、芯片复位和校准值写入。
main.c — 系统初始化
int main(void)
{
    HAL_Init();                  // HAL库初始化
    SystemClock_Config();        // 系统时钟配置 72MHz
    MX_GPIO_Init();              // GPIO初始化

    OLED_Init();                 // OLED显示屏初始化 (SCL=PB15, SDA=PB14)
    INA219_Init();               // INA219初始化 (SCL=PB12, SDA=PB13)

    while (1)
    {
        // 主循环代码见 4.6
    }
}

4.2 INA219 软件I2C通信

INA219采用软件模拟I2C通信,SCL接PB12,SDA接PB13。通过GPIO直接控制引脚电平实现I2C协议的起始、停止、应答信号。SDA引脚在发送时配置为推挽输出,接收时切换为输入模式。
INA219.h — I2C引脚定义
#define INA219_I2C_SCL_PORT    GPIOB
#define INA219_I2C_SDA_PORT    GPIOB
#define INA219_I2C_SCL_PIN     GPIO_PIN_12
#define INA219_I2C_SDA_PIN     GPIO_PIN_13

#define INA219_ADDR            0x40   // A0接地,I2C地址为0x40
INA219.c — I2C起始/停止信号
// 发送I2C起始信号:SCL高电平时SDA由高变低
static void INA219_I2C_Start(void)
{
    INA219_SDA_Output();
    INA219_SDA_HIGH();
    INA219_SCL_HIGH();
    INA219_DelayUs(5);
    INA219_SDA_LOW();     // SCL高时拉低SDA
    INA219_DelayUs(5);
    INA219_SCL_LOW();     // 拉低SCL准备发送
}

// 发送I2C停止信号:SCL高电平时SDA由低变高
static void INA219_I2C_Stop(void)
{
    INA219_SDA_Output();
    INA219_SCL_LOW();
    INA219_SDA_LOW();
    INA219_DelayUs(5);
    INA219_SCL_HIGH();    // SCL高时拉高SDA
    INA219_DelayUs(5);
    INA219_SDA_HIGH();
}

4.3 寄存器读写操作

INA219内部有6个主要寄存器:配置寄存器(0x00)、分流电压(0x01)、总线电压(0x02)、功率(0x03)、电流(0x04)、校准(0x05)。写入时先发送设备地址+写命令,再发送寄存器地址和2字节数据(高字节在前)。读取时先写入寄存器地址,再重新发起起始信号读取数据。
INA219.c — 寄存器读取
uint16_t INA219_ReadReg(uint8_t reg)
{
    uint16_t data;

    INA219_I2C_Start();
    INA219_I2C_SendByte(INA219_ADDR << 1 | 0);  // 设备地址+写
    INA219_I2C_WaitAck();
    INA219_I2C_SendByte(reg);                    // 寄存器地址
    INA219_I2C_WaitAck();

    INA219_I2C_Start();                          // 重复起始
    INA219_I2C_SendByte(INA219_ADDR << 1 | 1);  // 设备地址+读
    INA219_I2C_WaitAck();

    data = INA219_I2C_ReceiveByte() << 8;        // 读高8位
    INA219_I2C_Ack();
    data |= INA219_I2C_ReceiveByte();            // 读低8位
    INA219_I2C_NAck();                           // 非应答
    INA219_I2C_Stop();

    return data;
}

4.4 数据读取与计算公式

INA219各寄存器的原始值需要经过换算才能得到实际物理量。总线电压寄存器数据左移3位,LSB=4mV;分流电压为有符号数,LSB=10µV;电流和功率的LSB由校准值决定。
INA219.c — 数据读取函数
// 读取总线电压 (V) — 寄存器数据右移3位,LSB=4mV
float INA219_ReadBusVoltage(void)
{
    uint16_t data = INA219_ReadReg(INA219_REG_BUSVOLTAGE);
    return (data >> 3) * 0.004f;
}

// 读取电流 (mA) — 有符号数,LSB=0.1mA
float INA219_ReadCurrent(void)
{
    int16_t data = (int16_t)INA219_ReadReg(INA219_REG_CURRENT);
    return data * 0.1f;
}

// 读取功率 (mW) — LSB=20mW
float INA219_ReadPower(void)
{
    uint16_t data = INA219_ReadReg(INA219_REG_POWER);
    return data * 20.0f;
}
参数寄存器换算公式单位说明
总线电压0x02(data >> 3) * 0.004V数据左移3位,LSB=4mV
分流电压0x01data * 0.01mV有符号,LSB=10µV
电流0x04data * 0.1mA有符号,LSB由校准值决定
功率0x03data * 20.0mWLSB=20×电流LSB
校准值0x050x1000 (4096)-影响电流/功率LSB

4.5 OLED显示配置

OLED显示屏通过软件I2C驱动(SCL=PB15, SDA=PB14),支持居中显示字符串。本程序在OLED上分3行显示电压、电流、功率数据,每500ms刷新一次。
OLED.h — 引脚定义
#define SCL_Port  GPIOB
#define SCL_Pin   GPIO_PIN_15
#define SDA_Port  GPIOB
#define SDA_Pin   GPIO_PIN_14

// OLED函数声明
void OLED_Init(void);
void OLED_Clear(void);
void OLED_CenterPrintf(int16_t Y, char *format, ...);
void OLED_Update(void);

4.6 主循环逻辑

主循环采用非阻塞定时方式,通过 HAL_GetTick() 获取系统毫秒时间戳,每500ms执行一次数据采集与显示更新。这种方式不会阻塞CPU,剩余时间可用于其他任务。更新流程:读取数据 → 清屏 → 显示电压/电流/功率 → 更新显示 → 刷新时间戳。
main.c — 主循环
uint32_t Time_Now;
float Voltage, Current, Power;

while (1)
{
    if (HAL_GetTick() - Time_Now >= 500)       // 500ms更新一次
    {
        Voltage = INA219_ReadBusVoltage();      // 读取总线电压 (V)
        Current = INA219_ReadCurrent();         // 读取电流 (mA)
        Power   = INA219_ReadPower();           // 读取功率 (mW)

        OLED_Clear();                           // 清屏

        OLED_CenterPrintf(0,  "电压:%.1fV", Voltage);    // 第1行显示电压
        OLED_CenterPrintf(24, "电流:%dmA", (int)Current); // 第2行显示电流
        OLED_CenterPrintf(48, "功率:%dmW", (int)Power);   // 第3行显示功率

        OLED_Update();                          // 更新显示

        Time_Now = HAL_GetTick();               // 更新时间戳
    }
}
显示行Y坐标格式示例显示
第1行0电压:%.1fV电压:12.0V
第2行24电流:%dmA电流:120mA
第3行48功率:%dmW功率:2400mW

5. 程序流程图

STM32 + INA219 系统程序完整执行流程

开始 HAL_Init() SystemClock_Config() MX_GPIO_Init() OLED_Init() INA219_Init() while(1) HAL_GetTick() - Time_Now ≥ 500? 是 读取电压/电流/功率 OLED清屏并显示数据 更新 Time_Now 否

6. 交互式动画演示

模拟INA219电流传感器实时检测电路 — 拖动滑块改变负载电阻,观察电流与功率变化

电路检测模拟

12V + - V+ INA219 0.1Ω Shunt SCL: PB12 SDA: PB13 I2C → STM32 V- R=100Ω 负载 → 分流电阻压降: 0.00 mV 负载电流: 120 mA
100Ω

OLED 显示屏

电压:--.-V
电流:---mA
功率:----mW
--.-
总线电压 (V)
---
电流 (mA)
----
功率 (mW)
组件说明:
• 电池:12V直流电源,为整个电路供电
• INA219:通过内部0.1Ω分流电阻测量电流,同时测量总线电压
• 分流电阻:串联在电源正极回路中,电流流过产生微小压降
• 负载:可变电阻,模拟不同用电设备(滑块调节)
• OLED:实时显示电压、电流、功率,每500ms刷新(与实际程序一致)
• 粒子动画:流动速度反映电流大小,电流越大粒子越快