0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32 驱动 INA226 测量电流电压功率

jf_88434166 来源:jf_88434166 作者:jf_88434166 2025-11-10 19:58 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、INA226简介

INA226 是一款分流/功率监视器,具有 I2C或SMBUS 兼容接口。 该器件 监视分流压降和总线电源电压。 可编程校准值、转换时间和取平均值功能与内部乘法器相结合,可实现电流值(单位为安培)和功率值(单位为瓦)的直接读取。

在这里插入图片描述

二、引脚功能

IN+电流输入
IN-电流输出
GND电源地
VS电源正
SCL时钟线
SDA数据线
A0IIC地址设置引脚
A1IIC地址设置引脚
Alert报警输出引脚
VBUS总线电压输入引脚

INA226有两个地址引脚,A0和A1。下图描述了16个可能地址中的每一个的引脚逻辑。由原理图可知 INA226 模块 A0 A1 引脚被下拉至 GND ,故 IIC 地址则为 Write:1000 0000 0x80 Read:1000 0001 0x81
在这里插入图片描述

三、寄存器介绍

在这里插入图片描述

1.配置寄存器 0x00

配置寄存器设置控制设备的工作模式。该寄存器控制分流和总线电压测量以及所用的平均模式的转换时间设置。
在这里插入图片描述

Bit字段类型默认值(二进制)描述
15RSTR/W0设置成1 复位
14-12NCR/W100无功能 保留
11-9AVGR/W000采样平均次数 000 1次 001 4次 010 16次011 64次...
6-8VBUSCTR/W100总线采样时间 000 140µs 001 204µs010 332 µs 011 588 µs 100 1.1ms 101 2.116ms 110 4.156ms 111 8.244ms
3-5VSHCTR/W100分流采样时间 同上
0:2MODER/W111操作模式000 关闭 001 分流电压 触发 010 总线电压 触发011 分流及总线电压 触发 100 关闭 101 分流电压 连续测量 110 总线电压 连续测量 111 分流及总线电压 连续测量

2.分流电压寄存器 0x01

用于存储当前的分流电压读数 Vshunt。负数采用二进制补码格式表示。生成一个负数的补码方法是:对其绝对值的二进制数取反,然后加 1。如果最高有效位(MSB)为 '1',则表示这是一个负数。最小分辨率(Vshunt _LSB)为 2.5uV。
在这里插入图片描述
注意分流电压最大81.92mV,而该模块的采样电阻是0.1R,故最大电流为 81.92mV / 0.1R = 819.2mA
分流电压计算:Vshunt = 寄存器值 * Vshunt _LSB(2.5uV)

3.总线电压寄存器 0x02

用于存储最近一次的总线电压读数 Vbus。如果启用了平均功能,则该寄存器显示的是平均后的数值。满量程范围为 40.96V(对应 7FFF);最小分辨率(Vbus_LSB)为 1.25 mV。
在这里插入图片描述
总线电压计算:Vbus = 寄存器值 * Vbus_LSB(1.25 mV )

4.功率寄存器 0x03

用于存储功率读数 Power ,如果启用了平均功能,该寄存器将显示平均值。 功率寄存器的最低有效位(LSB)在内部被设定为等于 Current_LSB 所设定值的 25 倍 。功率寄存器通过将电流寄存器的十进制值与总线电压寄存器的十进制值相乘来记录以瓦特(Watts)为单位的功率。
在这里插入图片描述
功率计算: Power = 寄存器值 * Power_ LSB
由手册可知 Power_LSB(功率最小分辨率) = Current_LSB(电流最小分辨率) * 25
Current_LSB 手册给出了计算公式,如下

在这里插入图片描述
Current_LSB = 最大电流 / 2^15 = 819.2mA / 2^15 = 0.025mA

而手册内有一段提示:While this value yields the highest resolution, it is common to select a value for the Current_LSB to the nearest round number above this value to simplify the conversion of the Current Register (04h) and Power Register (03h) to amperes and watts respectively
译文:虽然这个值可以提供最高的分辨率,但通常会选择一个略高于该值的整数作为 Current_LSB,以简化将电流寄存器(04h)和功率寄存器(03h)转换为安培(Amperes)和瓦特(Watts)的过程
也就是可以自己根据公式计算出的结果,选择一个合适的 Current_LSB 值,便于计算,这里公式得出的 Current_LSB = 0.025mA,本文重新选择为 0.05mA,之所以选择 0.05 也为了便于后续 CAL (基准值) 的计算,详见寄存器 0x05 说明

故 Power_LSB = 0.05mA * 25 = 1.25mW
功率计算: Power = 寄存器值 * Power_ LSB(1.25mW)

5.电流寄存器 0x04

用于存储电流读数 Current,如果启用了平均功能,该寄存器将显示平均值。电流寄存器的值是通过将分流电压寄存器中的十进制值与校准寄存器中的十进制值相乘来计算的
在这里插入图片描述
电流值 = 寄存器值 * Current_LSB(0.05mA) (Current_LSB 的计算在上文功率寄存器小节已经给出)

6.基准寄存器 0x05

该寄存器为器件提供用于产生测量差分电压的分流电阻值。它还设置电流寄存器的分辨率。编程该寄存器可设置 Current_LSB 和 Power_LSB。该寄存器也适用于整体系统校准。
该寄存器主要是是设置系统基准的,将 基准值(CAL) 写入寄存器即可
在这里插入图片描述
在这里插入图片描述
Current_LSB= 0.05mA (上文功率寄存器小节已经给出) ,根据原理图可知 Rshunt = 0.1R
CAL = 0.00512 / (0.00005A * 0.1R) = 1024 = 0x0400

实测调试发现所测出电流偏大,采用手册校准公式
在这里插入图片描述
5V 测试条件下 MeasShuntCurrent = 490 mV INA226_Current = 520mV
Corrected_Full_Scale_Cal = 490 * 1024 / 520 = 964.9 约等于 965 = 0x03C5

修改程序重新写入基准值CAL =0x03C5,再次测量输出与仪器显示数据基本一致

其它寄存器是报警功能及ID,本文未使用则不做说明

四、IIC 时序说明

1.写时序

在这里插入图片描述

MyI2C_Start();						 //I2C起始
	MyI2C_SendByte(INA226_W);	         //发送从机地址,读写位为0,表示即将写入
	MyI2C_ReceiveAck();					 //接收应答
	MyI2C_SendByte(Register);			 //发送寄存器地址
	MyI2C_ReceiveAck();				     //接收应答
	MyI2C_SendByte(Data_H);			     //发送要写入寄存器的数据高位
	MyI2C_ReceiveAck();					 //接收应答
	MyI2C_SendByte(Data_L);			     //发送要写入寄存器的数据低位
	MyI2C_ReceiveAck();					 //接收应答
	MyI2C_Stop();						 //I2C终止

2.读时序

在这里插入图片描述

该时序前还应加一个发送寄存器地址的时序:起始信号---IIC地址---ACK---寄存器地址---ACK

MyI2C_Start();						  //I2C起始
	MyI2C_SendByte(INA226_W);	          //发送从机地址
	MyI2C_ReceiveAck();				      //接收应答
	MyI2C_SendByte(RegAddress);	          //发送寄存器地址
	MyI2C_ReceiveAck();					  //接收应答
	
	MyI2C_Start();					      //I2C重复起始
	MyI2C_SendByte(INA226_R);	          //发送从机地址
	MyI2C_ReceiveAck();				      //接收应答
	Data = MyI2C_ReceiveByte();	          //接收指定寄存器的高位数据
	MyI2C_SendAck(0);				  	  //发送应答
	Data = (Data < < 8)| MyI2C_ReceiveByte();//接收指定寄存器的低位数据
	MyI2C_Stop();						  //I2C终止

五、程序

INA226.C

#include "stm32f10x.h"                  // Device header
#include "MyI2C.h"

/*IIC 地址---------------------------------------------------------------------------------------------*/
#define INA226_W 0x80
#define INA226_R 0x81
/*寄存器地址--------------------------------------------------------------------------------------------*/
#define	INA226_Configuration                          0x00
#define INA226_Shuntvoltage                           0x01
#define INA226_Busvoltage                             0x02
#define INA226_Power                                  0x03
#define INA226_Current                                0x04
#define INA226_Calibration                            0x05
#define	INA226_Mask                                   0x06
#define	INA226_AlertLimit                             0x07
#define	INA226_ManufacturerID                         0xFE
#define	INA226_DieID                                  0xFF
/* INA226_curation Bit15-0 --------------------------------------------------------------------------*/
#define RST 			        0 		// 0   设置成1复位 (Bit15)
#define Reservation       0x04  // 100 (Bit14-12 保留)
#define AVG 							0x01  // 001 平均次数 4 (Bit11-9)
#define VBUSCT  					0x04	// 100 总线电压转换时间 1.1ms (Bit116-8)
#define VSHCT		  				0x04	// 100 分流电压转换时间 1.1ms(Bit3-5)
#define	MODE	            0x07 	// 111 运行模式  连续检测(默认)(Bit0–2)

#define Configuration_H (RST < < 7)|(Reservation < < 4)|(AVG < < 1)|(VBUSCT > > 2)
#define Configuration_L ((VBUSCT & 0x03) < < 6)|(VSHCT < < 3)|(MODE)

/* INA226_Calibration ---------------------------------------------------------------------------------*/
//#define Calibration_H 0x04
//#define Calibration_L 0x00

//MAX_Current = Full-scale range / R·SHUNT = 81.92mV / 0.1R = 819.2mA
//Current_LSB = 819.2mA / 2^15 = 0.025mA 
//选择接近值:0.05mA = 0.00005A 手册推荐1mA 但是便于CAL计算和实际调试则重新选择为 0.05mA
//(手册:While this value yields the highest resolution, it is common to select a value for the Current_LSB to the nearest round number above this value to simplify the conversion of the Current Register (04h) and Power Register (03h) to amperes and watts respectively.)
//(虽然该值产生最高分辨率,但通常为Current_LSB选择一个值,使其与高于该值的最接近的整数相匹配,以简化电流寄存器(04h)和功率寄存器(03h)分别转换为安培和瓦的过程。)
//CAL = 0.00512 / (Current_LSB * R·SHUNT) = 0.00512 / (0.00005A * 0.1R) = 1024 = 0x0400
//Power_LSB = Current_LSB * 25 = 0.05mA * 25 = 1.25mW
//(手册:The power LSB has a fixed ratio to the Current_LSB of 25)
//(power LSB与Current_LSB的固定比率为25)

#define Calibration_H 0x03
#define Calibration_L 0xC5
//实测发现电流偏大,采用手册校准公式 Corrected_Full_Scale_Cal = (Cal * MeasShuntCurrent) / INA226_Current 
//5V 测试条件下 MeasShuntCurrent = 490 mV   INA226_Current = 520mV  Corrected_Full_Scale_Cal = 490 * 1024 / 520 = 964.9 = 965 = 0x03C5
void INA226_WriteReg(uint8_t Register, uint8_t Data_H, uint8_t Data_L)
{
	MyI2C_Start();						  //I2C起始
	MyI2C_SendByte(INA226_W);	  //发送从机地址,读写位为0,表示即将写入
	MyI2C_ReceiveAck();					//接收应答
	MyI2C_SendByte(Register);		//发送寄存器地址
	MyI2C_ReceiveAck();					//接收应答
	MyI2C_SendByte(Data_H);			//发送要写入寄存器的数据高位
	MyI2C_ReceiveAck();					//接收应答
	MyI2C_SendByte(Data_L);			//发送要写入寄存器的数据低位
	MyI2C_ReceiveAck();					//接收应答
	MyI2C_Stop();						    //I2C终止
}
uint32_t INA226_ReadReg(uint8_t RegAddress)
{
	uint32_t Data;
	
	MyI2C_Start();						  //I2C起始
	MyI2C_SendByte(INA226_W);	  //发送从机地址
	MyI2C_ReceiveAck();					//接收应答
	MyI2C_SendByte(RegAddress);	//发送寄存器地址
	MyI2C_ReceiveAck();					//接收应答
	
	MyI2C_Start();					   	//I2C重复起始
	MyI2C_SendByte(INA226_R);	  //发送从机地址
	MyI2C_ReceiveAck();					//接收应答
	Data = MyI2C_ReceiveByte();	//接收指定寄存器的高位数据
	MyI2C_SendAck(0);				  	//发送应答
	Data = (Data < < 8)| MyI2C_ReceiveByte();	//接收指定寄存器的低位数据
	MyI2C_Stop();						    //I2C终止
	
	return Data;
}
void INA226_Init(void)
{
 	INA226_WriteReg(INA226_Configuration,Configuration_H,Configuration_L);   //4次平均  1.1ms转换时间  连续检测
	INA226_WriteReg(INA226_Calibration,Calibration_H,Calibration_L);         //基准值 0x0200
}
uint32_t INA226_GetShuntVoltage(void)//分流电压值 =  寄存器值 * LSB(2.5uA)
{
	uint32_t ShuntVoltage;
	ShuntVoltage = (uint32_t)((INA226_ReadReg(INA226_Shuntvoltage)) * 2.5 / 1000);
	
	return ShuntVoltage;
}
uint32_t INA226_GetBusVoltage(void)//总线电压值 =  寄存器值 * LSB(1.25mV)
{
	uint32_t BusVoltage;
	BusVoltage = (uint32_t)((INA226_ReadReg(INA226_Busvoltage)) * 1.25);
	
	return BusVoltage;
}
uint32_t INA226_GetCurrent(void)//电流值 = 寄存器值 * Current_LSB(0.05mA)
{
	uint32_t Current;
	Current = (uint32_t)((INA226_ReadReg(INA226_Current)) * 0.05);
	
	return Current;
}
uint32_t INA226_GetPower(void)//功率 = 寄存器值 * Power_LSB(1.25mW)
{
	uint32_t Power;
	Power = (uint32_t)((INA226_ReadReg(INA226_Power)) * 1.25);
	
	return Power;
}

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "INA226.h"
#include "MyI2C.h"

uint32_t ShuntVoltage=0, BusVoltage=0, Current=0, Power=0;			//定义用于存放各个数据的变量
int main(void)
{
	Delay_ms(2000);//上电延时
	/*模块初始化*/
	MyI2C_Init();
	OLED_Init();	
	INA226_Init();
	Delay_ms(1000);//初始化延时
	while (1)
	{
		ShuntVoltage = INA226_GetShuntVoltage();Delay_ms(50);
		BusVoltage = INA226_GetBusVoltage();Delay_ms(50);
		Current = INA226_GetCurrent();Delay_ms(50);
		Power = INA226_GetPower();
		OLED_ShowString(1,1,"ShuntV:");OLED_ShowSignedNum(1, 9, ShuntVoltage, 6);//单位mV,由于OLED行限制,单位暂不显示
		OLED_ShowString(2,1,"BusV:");OLED_ShowSignedNum(2, 9, BusVoltage, 6);//单位mV
		OLED_ShowString(3,1,"Current:");OLED_ShowSignedNum(3, 9, Current, 6);//单位mA
		OLED_ShowString(4,1,"Power:");OLED_ShowSignedNum(4, 9, Power, 6);//单位mW
		Delay_ms(1000);
	}
}

六、实验现象

1.线路图

在这里插入图片描述
在这里插入图片描述

2.输出数据

负载仪恒阻模式 10R

3V 测试
在这里插入图片描述

5V 测试

在这里插入图片描述

以上内容个人理解,如有不正欢迎指正,需要资料及工程可留言邮箱

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2305

    文章

    11121

    浏览量

    371180
  • 电压功率
    +关注

    关注

    0

    文章

    2

    浏览量

    5642
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    STM32 驱动 INA226 测量电流电压功率

    一、INA226简介 INA226 是一款分流/功率监视器,具有 I2C或SMBUS 兼容接口。 该器件 监视分流压降和总线电源电压。 可编程校准值、转换时间和取平均值功能与内部乘法器
    发表于 10-28 10:10

    INA240电流检测放大器使用及电流计算(附STM32驱动代码)

    本文介绍了INA240电流检测放大器的使用及电流计算方法,并结合STM32单片机对其进行驱动INA
    的头像 发表于 09-28 17:32 858次阅读
    <b class='flag-5'>INA</b>240<b class='flag-5'>电流</b>检测放大器使用及<b class='flag-5'>电流</b>计算(附<b class='flag-5'>STM32</b><b class='flag-5'>驱动</b>代码)

    INA232 高精度数字电流/电压/功率监测器技术解析与应用指南

    Texas Instruments INA232电流/电压/功率监控器是一款16位数字电流监控器,具有兼容I^2^C/SMBus的接口。该器
    的头像 发表于 08-29 15:03 577次阅读
    <b class='flag-5'>INA</b>232 高精度数字<b class='flag-5'>电流</b>/<b class='flag-5'>电压</b>/<b class='flag-5'>功率</b>监测器技术解析与应用指南

    INA226 具有警报功能的、36V、16 位、超精密I2C输出电流/电压/功率监控器技术手册

    INA226 是具有 I2C™ 或 SMBUS 兼容接口的电流分流器和功率监测器。该器件同时监控分流压降和总线电源电压。可编程校准值、转换时间、和均值计算,与一个内部乘法器相组合,实现
    的头像 发表于 05-09 10:49 1867次阅读
    <b class='flag-5'>INA226</b> 具有警报功能的、36V、16 位、超精密I2C输出<b class='flag-5'>电流</b>/<b class='flag-5'>电压</b>/<b class='flag-5'>功率</b>监控器技术手册

    INA226-Q1 具有警报功能的 AEC-Q100、36V、16 位、超精密、I2C 输出电流/电压/功率监控器

    INA226-Q1 是具有 I2C™ 或 SMBUS 兼容接口的电流分流器和功率监测器。该器件同时监控分流压降和总线电源电压。可编程校准值、转换时间、和均值计算,与一个内部乘法器相组合
    的头像 发表于 04-28 09:32 799次阅读
    <b class='flag-5'>INA226</b>-Q1 具有警报功能的 AEC-Q100、36V、16 位、超精密、I2C 输出<b class='flag-5'>电流</b>/<b class='flag-5'>电压</b>/<b class='flag-5'>功率</b>监控器

    INA226 stm32的demo代码和规格书

    文档包含in226的规格书和stm32的demo代码,
    发表于 02-08 17:32 10次下载

    INA226利用串口助手把读取的数据显示,但是输出的结果不对,为什么?

    [list] [*]请问有谁调试过INA226这块芯片的,能够给个QQ,想请教下问题。谢谢。 #include #include #include #define uchar unsigned
    发表于 12-27 06:00

    INA226读出的数据为8100和81FF,为什么?

    调试INA226,在读电压电流这些寄存器的值时,读出的数据为8100和81FF。A0和A1接GND ,81是从机的地址。写的过程没有问题,读取的时序也是按照先发送从机写地址(80),然后寄存器
    发表于 12-26 06:00

    INA226采样正弦波信号,怎么配置INA226来做这个采样做合适?

    公司项目碰到一个频率为120hz,幅值为0~2倍设定值的正弦波电流,设计上已经使用了INA226,所以想请教下怎么配置INA226来做这个采样做合适,谢谢!
    发表于 12-20 08:12

    INA226电压测量在0.52v以下输出就为0了,请问这是器件问题还是设置问题?

    是试过几片INA226电压电流测试,电流测试很正常,但电压测量在0.52v以下输出就为0了,请问这是器件问题还是设置问题?
    发表于 12-18 08:30

    INA226并联电压反馈的十六进驻数据后两位FF不会变化吗?

    请问各位,有没用过INA226的。 我用INA226的并联电压来反馈数据,比如,我输入1A 电流,我得到INA226的并联
    发表于 12-18 08:21

    INA226空载电流异常的原因?

    如果不接外部采集电压的话, 读出来电流就只有3到4个MA的波动, 可以接受。而且接了负载也正常,测量出啦的数值也很准确,但是空载状态下,读出来的电流值随着外部采样输入
    发表于 12-13 16:11

    功率电流电压的关系 电功率对电网稳定性的影响

    功率电流电压的关系 电功率(P)、电流(I)和电压(U)之间存在密切的关系,它们之间的基本公式为: P = UI 其中,P表示电
    的头像 发表于 12-09 10:57 3982次阅读

    INA226使用采样系统电流的时候,出现采样电流随系统电压变化的情况,为什么?

    最近做了一块INA226的采样板,在使用它采样系统电流的时候,出现采样电流随系统电压变化的情况。例如系统电压为15V,恒流300mA 采样
    发表于 12-09 08:17

    INA226写寄存器的IIC波形看起来是没有问题的,但是写入后不生效,为什么?

    INA226芯片,写寄存器的IIC波形看起来是没有问题的,但是写入后不生效,重新读还是默认值,请问这是什么原因??
    发表于 12-09 06:35