STM32F103C8T6 | HAL库 | 软件I2C通信 | 高精度电流/电压/功率监测
INA219 高精度电流/电压/功率监测芯片工作原理及应用功能
INA219 是 TI(德州仪器)生产的高侧电流分流与功率监测芯片,通过I2C接口与主控通信。其核心原理是在负载回路中串联一个分流电阻(Shunt Resistor,通常0.1Ω),当电流流过分流电阻时会产生微小的电压降。INA219 内部集成的12位Delta-Sigma ADC分别测量分流电阻两端的电压降(Shunt Voltage)和负载两端的总线电压(Bus Voltage),然后通过内部校准寄存器计算出实际电流值和功率值,将结果存入对应寄存器供主控读取。
具体流程为:电流流过分流电阻 → 产生电压降 → ADC采样 → 校准计算 → 得到电流/功率 → I2C传输至STM32。这种方式属于高侧检测(在电源正极侧测量),相比低侧检测不会破坏负载的地线参考,是更安全可靠的方案。
测量负载两端的实际工作电压,量程0~26V,分辨率4mV,适用于3.3V/5V/12V/24V等多种供电场景。
测量分流电阻两端的微小电压降,分辨率10µV,支持双向测量(正/负电流),量程±320mV。
内部根据校准值自动计算电流值和功率值,无需主控参与运算,直接读取寄存器即可获得结果。
标准I2C通信,支持16个可编程地址(A0/A1引脚配置),兼容3.3V/5V逻辑电平,通信速率最高1MHz。
| 引脚 | 名称 | 功能 | STM32连接 |
|---|---|---|---|
| 1 | VCC | 模块供电正极 (3~5.5V) | 3.3V |
| 2 | GND | 模块供电地 | GND |
| 3 | SCL | I2C时钟线 | PB12 |
| 4 | SDA | I2C数据线 | PB13 |
| 5 | V- | 分流电阻负端(接负载) | 负载正极 |
| 6 | V+ | 分流电阻正端(接电源) | 电源正极 |
| 7 | A0 | 地址选择位0 | GND (地址0x40) |
| 8 | A1 | 地址选择位1 | GND (地址0x40) |
INA219 电流传感器模块实物外观与尺寸
模块正面外观
模块背面外观
模块尺寸图
INA219 模块电路原理图与PCB封装设计
INA219 模块电路原理图 — V+与V-之间为分流电阻,SCL/SDA通过上拉电阻连接至I2C总线
INA219 模块PCB封装图 — 展示元器件布局与焊盘位置
STM32 HAL库程序代码分析 — 从系统初始化到数据读取与显示的完整流程
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
}
}
#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
// 发送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();
}
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;
}
// 读取总线电压 (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.004 | V | 数据左移3位,LSB=4mV |
| 分流电压 | 0x01 | data * 0.01 | mV | 有符号,LSB=10µV |
| 电流 | 0x04 | data * 0.1 | mA | 有符号,LSB由校准值决定 |
| 功率 | 0x03 | data * 20.0 | mW | LSB=20×电流LSB |
| 校准值 | 0x05 | 0x1000 (4096) | - | 影响电流/功率LSB |
#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);
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 |
STM32 + INA219 系统程序完整执行流程
模拟INA219电流传感器实时检测电路 — 拖动滑块改变负载电阻,观察电流与功率变化