INA226使用之程序与模块测试

news/2024/10/28 0:26:29/

笔者最近有个项目需要测量电流参数,于是买来INA226模块测试一下。

文章目录

  • 应用电路
  • 程序设计
    • 补充关于Alert引脚的使用
    • 补充使用多个INA226的方法
  • 模块测试
  • 总结
  • 后续

应用电路

首先测试使用的INA226模块如下图所示。
在这里插入图片描述
INA226模块原理图如下图所示。
在这里插入图片描述
官方手册的参考电路如下图所示。在这里插入图片描述
结合上述图片以及数据手册,可知使用INA226模块时,与单片机的接线方式如下。

INA226模块单片机
VCC3.3V或5V
GNDGND
SCLPB6
SDAPB7
VBS电路总线电压
IN+电流流入端
IN-电流流出端
ALE报警引脚(未使用报警功能可不接)
A0GND
A1GND

程序设计

INA226.h文件如下。

#ifndef __INA226_H
#define __INA226_H
#include "sys.h"#define READ_ADDR                  0x81	 //A0=GND,A1=GND // R=1, W=0
#define WRITE_ADDR                 0x80#define Config_Reg                 0x00
#define Shunt_V_Reg                0x01
#define Bus_V_Reg                  0x02
#define Power_Reg                  0x03
#define Current_Reg                0x04
#define Calib_Reg                  0x05
#define Mask_En_Reg                0x06
#define Alert_Reg                  0x07
#define Man_ID_Reg                 0xFE  //0x5449
#define ID_Reg                     0xFF  //0x2260u16 INA226_Read2Byte(u8 reg_addr);
u8 INA226_Write2Byte(u8 reg_addr,u16 reg_data);
void INA226_Init(void);#endif

INA226.c文件如下。

#include "INA226.h"
#include "myiic.h"
#include "delay.h"u16 INA226_Read2Byte(u8 reg_addr)
{u16 reg_data=0;u16 temp=0;IIC_Start();IIC_Send_Byte(WRITE_ADDR);if(IIC_Wait_Ack())return 0;IIC_Send_Byte(reg_addr);   if(IIC_Wait_Ack())return 0;IIC_Start();IIC_Send_Byte(READ_ADDR);if(IIC_Wait_Ack())return 0;reg_data= IIC_Read_Byte(1);reg_data=(reg_data<<8)&0xFF00;temp=IIC_Read_Byte(0);IIC_Stop();reg_data|=temp;return reg_data;
}u8 INA226_Write2Byte(u8 reg_addr,u16 reg_data)
{        u8 data_high=(u8)((reg_data&0xFF00)>>8);u8 data_low=(u8)reg_data&0x00FF;IIC_Start();IIC_Send_Byte(WRITE_ADDR);   if(IIC_Wait_Ack())return 0;IIC_Send_Byte(reg_addr );    if(IIC_Wait_Ack())return 0;        IIC_Send_Byte(data_high);if(IIC_Wait_Ack())return 0;        IIC_Send_Byte(data_low);if(IIC_Wait_Ack())return 0;                 IIC_Stop();delay_ms(2);return 1;
}void INA226_Init(void)
{INA226_Write2Byte(Config_Reg, 0x4527);//0100_010_100_100_111 //16次平均,1.1ms,1.1ms,连续测量分流电压和总线电压INA226_Write2Byte(Calib_Reg, 0x0A00);
}

其中myiic.h、delay.h均使用的是正点原子F3系列开发板的程序。

通信部分直接参考数据手册中的时序图即可,主要是在INA226_Init()函数中,写入Configuration Register的数据为0x4527,该值所代表的参数已经在注释中给出,读者想修改的话参考数据手册寄存器定义表格即可。而写入Calibration Register的数据需要根据实际电路中的采样电阻阻值以及电流分辨率来设置。
比如,在此次测试的INA226模块中使用的贴片采样电阻为R100,即0.1欧。
根据数据手册中的公式1和公式2。
在这里插入图片描述
因为Shunt Voltage Register的值最大为0x7FFF,LSB=2.5uV, FSR = 81.92mV。
又因为分流电阻阻值为0.1欧,所以最大电流为819.2mA。(注意这个问题,避免在实际使用中出现的超量程情况,以至得出错误测量数据)

所以Maximum Expected Current的值不能超过819.2mA。

假设Current_LSB = 0.02mA,则Maximum Expected Current = 655.36mA,满足上述条件。
则CAL = 0.00512/(0.02*0.1)*1000 = 2560= 0x0A00。
所以最后写入Calibration Register中的数据为0x0A00。

最后就可以直接使用了。
在源文件中,笔者没有对各种获取测量参数的函数进行封装,而是在主程序中直接读取数据后转换成对应测量数据。具体程序如下。

printf("data=%-5d, Bus_V  =%f mV\r\n", INA226_Read2Byte(Bus_V_Reg),INA226_Read2Byte(Bus_V_Reg)*1.25);
printf("data=%-5d, Shunt_V=%f mV\r\n", INA226_Read2Byte(Shunt_V_Reg),INA226_Read2Byte(Shunt_V_Reg)*2.5*0.001);
printf("data=%-5d, Curent =%f mA\r\n", INA226_Read2Byte(Current_Reg),INA226_Read2Byte(Current_Reg)*0.02);
printf("data=%-5d, Power  =%f mW\r\n", INA226_Read2Byte(Power_Reg),INA226_Read2Byte(Power_Reg)*0.02*25);

关于数据转换中所用到的参数,在INA226的数据手册中可以找到。
Bus Voltage Register的 LSB = 1.25mV,FSR = 0x7FFF。
Shunt Voltage Register 的 LSB = 2.5uV,FSR = 0x7FFF。
Current Register 的 LSB = 0.02mA,FSR = 0x7FFF。
Power Register 的 LSB = Current_LSB * 25,FSR = 0xFFFF。

补充关于Alert引脚的使用

INA226的Alert引脚使用其实很简单,数据手册里关于Alert的描述是 Multi-functional alert, open-drain output。该芯片总共有五种报警功能:Shunt Voltage Over-Limit(SOL)、Shunt Voltage Under-Limit (SUL)、Bus Voltage Over-Limit(BOL)、Bus Voltage Under-limit(BUL)、Power Over-Limit(POL)。
因为该引脚是开漏输出,所以使用该引脚时,需要接入上拉电阻上拉到VS。
设置报警功能时,涉及到两个寄存器:Mask/Enable Register(06h)、Alert Limit Register(07h)。

首先介绍Mask/Enable Register(06h)。
在这里插入图片描述
该寄存器的D15-D11对应了五种报警功能的使能,要使用哪种报警功能时,只需在对应位写入1。
APOL(D1)是用于设置Alert pin的输出极性的,LEN(D0)是用于设置报警引脚和报警标志位在报警消失后是否保持有效的。该寄存器的其他位就不做介绍了,详见数据手册。

比如,数据手册中的典型应用,Alert pin被设置成在Shunt Voltage超过80mV时报警。所以根据Shunt Voltage的LSB=2.5uV,算出写入Alert Limit Register的数值为80000/2.5=32000=7D00h。再根据采样电阻的阻值大小,可计算出超限报警电流是多少。比如典型应用中的采样电阻为2毫欧,算出报警电流为40A。

补充使用多个INA226的方法

标准IIC协议可以实现一个主机同多个从机通信。当我们需要一个单片机同时使用多个INA226时,一是可以使用不同引脚配置多个软件IIC,二是使用其从机地址配置功能。
INA226可以通过A0、A1引脚,来配置从机地址,其官方手册中的从机地址配置表格如下。
在这里插入图片描述
比如,在本次测试中,INA226的A0引脚接GND,A1引脚接GND,则其IIC从机地址为1000_000,该字节的最后一比特由通信时是读操作还是写操作决定,读时是1,写时是0。故其读操作时的地址为0x81,写操作时的地址为0x80,对应到程序中代码如下。

#define READ_ADDR                  0x81	 //A0=GND,A1=GND // R=1, W=0
#define WRITE_ADDR                 0x80

使用多个INA226时,只需要配置每个INA226的A0、A1的电平,保证每个INA226的Slave Address不同,然后使用不同的READ_ADDR和WRITE_ADDR访问不同的INA226。

模块测试

按照上面的接线方式表格接好INA226模块的连线。
最后实物接线图如下。
在这里插入图片描述

使用学生稳压电源对测量回路供电,使用4位半万用表测量回路电流以及总线电压。
在这里插入图片描述

在这里插入图片描述
使用串口助手接收并显示测量数据。
在这里插入图片描述
因为手上只有一个万用表,所以无法在测量电流时,同时测量总线电压。下面就单独测量一次总线电压,测量结果如下。
在这里插入图片描述
在这里插入图片描述

总结

多次测量发现,若以万用表所测电流数据为真实值,那么INA226模块所测电流值接近真实值,在随着电流数据增大时,误差可能会增大。在实际使用中,可以改变采样电阻的阻值大小,进而改变电流的量程,从而改变其分辨率。如觉得本次测量中的模块电流量程太小需要扩大量程,可以减小采样电阻的阻值,但是这样会导致电流分辨率的下降。

在本次测试中,还存在总线电压测不准以及数据不稳定的情况,导致功率测量值不准,不知道是不是测试方法错误,还是什么问题(后面笔者已经找出问题原因,并记录在本文后续中),欢迎大家与笔者交流讨论。

INA226完整驱动程序上面已经给出,可以直接进行移植,若嫌麻烦可以下载工程文件。
INA226完整工程文件

后续

前面说到之前做测试的时候测的总线电压不准的情况,后来思来想去觉得TI的芯片不可能这么拉胯,于是重新看一遍模块原理图,发现模块的电流流出端IN-没有和官方原理框图一样与GND连接起来。所以我又重新做了一遍测试,但是笔者还是保留了博客之前记录的测试结果以作为警醒。
使用跳线将IN-端与GND连接起来。
在这里插入图片描述
排除错误后的测试结果如下。
INA226测量数据。
在这里插入图片描述
总线电压(Bus_V)万用表测量值。
在这里插入图片描述
可以看出INA226测量值虽与万用表测量值有误差,但是两者的误差不大且INA226出来的数据也是比较稳定的。分析此次出现错误的原因,是笔者在先看官方手册的原理框图后先入为主了,没有详细对比实际模块的原理图与PCB,进而导致这次的问题。希望笔者以此作为警醒,以后尽量避免这类似的错误,多多积累经验,早日成为大佬。


http://www.ppmy.cn/news/132163.html

相关文章

FT2004(D2000)开发实战之AMD HD8570显卡驱动适配

一 AMD显卡驱动概述 Linux内核显卡驱动又叫DRM驱动,目前Linux内核中有两种用于Radeon显卡的DRM驱动:一种是radeon驱动,支持R100 ~ GCN2的各个子系列的显卡,代码位于drivers/gpu/drm/radeon目录;另外一种是amdgpu驱动,支持GCN1 ~ GCN5以及RDNA的各个子系列的显卡,代码位…

在C#程序中三菱PLC读写数据

首先添加引用 三菱PLCdll文件 1、导入 命名空间&#xff1a; using HslCommunication.Profinet.Melsec; 2、声明一个PLC对象&#xff1a; private MelsecMcNet melsecMcNet null; 3、读取PLC地址值 /// /// 读取bool值 /// /// PLC地址&#xff1a;如M100,X100,Y100,B100 //…

STM32使用光敏传感器计算光照度Lux,而不是仅仅打印个电压值或者电阻值

最近项目中用到了光敏电阻。搜索资料&#xff0c;发现很多人都使用光敏电阻&#xff0c;只是用了AD读取了电压值&#xff0c;或者算出了电阻值&#xff0c;就发送给上位机或者服务器&#xff0c;美其名曰获取了光照度。 搜索一番&#xff0c;也没找到用光敏电阻计算Lux的方法&a…

【PaddleClas】手把手让你训练自己的人脸识别模型

【PaddleClas】手把手让你训练自己的人脸识别模型 简介 在这个项目中&#xff0c;我们将介绍如何使用PaddleClas仓库训练我们自己的AdaFace模型&#xff0c;为以后的人脸识别做铺垫。在AIStudio中&#xff0c;项目空间大小只有100G&#xff0c;如果你想要在本地训练更大的数据…

Cadence OrCAD Capture 新放置的元件为问号无法自动编号解决方法

🏡《总目录》   🏡《宝典目录》 目录 1,概述2,三种逻辑及应用范围3,设置方法4,总结B站关注“硬小二”浏览更多演示视频 1,概述 本文介绍OrCAD Capture软件新放置元件的三种编号逻辑。 2,三种逻辑及应用范围 在新加或者复制新的元件时,新元件的编号逻辑有三种: 不…

IAR代码界面配色和字体修改

IAR代码界面配色和字体修改 IAR编写代码的界面实在让人难以恭维&#xff0c;所以就自己改了一下编写代码的界面&#xff0c;让写代码变的没那么难受。 效果图↓↓↓ 打开IAR 点开tools中的options一栏 配置editor中的属性 设置配色方案 展开编辑中colors and fonts&#xf…

SAP CO生产订单的标准成本、计划成本、实际成本和目标成本

什么是生产订单的标准成本、计划成本、实际成本、目标成本&#xff0c;我想做成本会计的应该很熟悉&#xff0c;计算公式简单表示如下。 标准成本 标准价格 * 标准数量 作业价格 * 标准数量 计划成本 计划价格 * 计划数量 作业价格 * 计划数量 实际成本 实际价格 * 实际…

Arduino:串口控制led灯的颜色

菜鸡的学习记录 实验目的&#xff1a; 通过本次实验掌握以下知识&#xff1a; 串口通信波特率设置。设计串口通信协议。串口读取字符。串口读取整数值。PWM输出 初步掌握和理解以下协议和软件的使用 MQTT协议NodeRED软件App Inventor软件 实验要求&#xff1a; 编写可以通…