完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
笔者最近有个项目需要测量电流参数,于是买来INA226模块测试一下。
文章目录 应用电路 首先测试使用的INA226模块如下图所示。 INA226模块原理图如下图所示。 官方手册的参考电路如下图所示。 结合上述图片以及数据手册,可知使用INA226模块时,与单片机的接线方式如下。 [tr]INA226模块单片机[/tr]
INA226.h文件如下。 #ifndef __INA226_H#define __INA226_H#include "sys.h"#define READ_ADDR 0x81 //A1=GND,A2=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 mVrn", INA226_Read2Byte(Bus_V_Reg),INA226_Read2Byte(Bus_V_Reg)*1.25);printf("data=%-5d, Shunt_V=%f mVrn", INA226_Read2Byte(Shunt_V_Reg),INA226_Read2Byte(Shunt_V_Reg)*2.5*0.001);printf("data=%-5d, Curent =%f mArn", INA226_Read2Byte(Current_Reg),INA226_Read2Byte(Current_Reg)*0.02);printf("data=%-5d, Power =%f mWrn", 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模块的连线。 最后实物接线图如下。 使用学生稳压电源对测量回路供电,使用4位半万用表测量回路电流以及总线电压。 使用串口助手接收并显示测量数据。 因为手上只有一个万用表,所以无法在测量电流时,同时测量总线电压。下面就单独测量一次总线电压,测量结果如下。 总结 多次测量发现,若以万用表所测电流数据为真实值,那么INA226模块所测电流值接近真实值,在随着电流数据增大时,误差可能会增大。在实际使用中,可以改变采样电阻的阻值大小,进而改变电流的量程,从而改变其分辨率。如觉得本次测量中的模块电流量程太小需要扩大量程,可以减小采样电阻的阻值,但是这样会导致电流分辨率的下降。 在本次测试中,还存在总线电压测不准以及数据不稳定的情况,导致功率测量值不准,不知道是不是测试方法错误,还是什么问题(后面笔者已经找出问题原因,并记录在本文后续中),欢迎大家与笔者交流讨论。 INA226完整驱动程序上面已经给出,可以直接进行移植,若嫌麻烦可以下载工程文件。 INA226完整工程文件 后续 前面说到之前做测试的时候测的总线电压不准的情况,后来思来想去觉得TI的芯片不可能这么拉胯,于是重新看一遍模块原理图,发现模块的电流流出端IN-没有和官方原理框图一样与GND连接起来。所以我又重新做了一遍测试,但是笔者还是保留了博客之前记录的测试结果以作为警醒。 使用跳线将IN-端与GND连接起来。 排除错误后的测试结果如下。 INA226测量数据。 总线电压(Bus_V)万用表测量值。 可以看出INA226测量值虽与万用表测量值有误差,但是两者的误差不大且INA226出来的数据也是比较稳定的。分析此次出现错误的原因,是笔者在先看官方手册的原理框图后先入为主了,没有详细对比实际模块的原理图与PCB,进而导致这次的问题。希望笔者以此作为警醒,以后尽量避免这类似的错误,多多积累经验,早日成为大佬。 |
|
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 05:41 , Processed in 0.628712 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号