INA226折腾笔记(一)
其实也算不上折腾,这个模块很简单就一个简单的I2C模块。随便搞个单片机就能读写,之所以玩这个,主要还是对手上的USB表不满意(换句话说就是达不到我的需求)
我手上有几个USB表
左边那个高仿版FNB58,右边那个是科维斯的CC表型号为KWS-1902C,平时就是测测手机充电功率之类的,也够用,FNB58还带了个客户端,如下图:
平时用绝对够用了,并且精度还可以(特别小的负载下精度不是很理想)。
最所以自己折腾INA226,主要是我最近玩耳机测小尾巴的功耗(20mw-1W)那两个U表精度不够,寨板FNB58精度还算可以,但是因为不是直通表,插上小尾巴(USB声卡)会有严重的噪音。另外一个CC表低功耗下(<50mw)直接显示0,网上虽然有一堆堆的U表卖,但具体什么情况还未可知,所以嘛,自己动手搞起。
淘宝上INA226的模块巨便宜,几块钱
一共16块钱,为了标定板子,我还买了块电阻板,如下:
然后画了块电路板,去淘宝5块钱打印了5块,最后一顿焊,成品如下:
INA226买的时候,注意那个采样电阻,上边两个板子一个是R100(0.1欧),一个是R010(0.01欧),理论上说,这个电阻越大,精度越高,代价就是量程变小。INA226通过测量电阻两边的电压来测量电流。最大电压是81.92mv,所以可以简单地通过电压/电阻来确定最大量程,0.08192/0.1=0.8192A 0.08192/0.01=8.192A。也就是这两个板子一个量程是0.8A,一个是8A。
但是我上边的板子设计失误了,为啥呢?可以看到我的红圈处的那两个接线柱是没有供电的。
我一开始的想法是:反正我也不测量大电流,所以没必要从这两个点取电,所以就从右上角的IN+ IN-代替了这两个大焊盘。但是我忽略了电路也是有电阻的!因为电路板的铜层很薄,电阻相对0.01欧来说不可忽略。
结果就是导致:采样电阻阻值改变了。0.1欧版本还好,0.01欧版本直接量程减半(标定为0.0226欧左右)所以我现在这两个板子,一个量程是0.73A,一个是3.6A左右(虽然变相提高了精度)。
关于INA226的寄存器:
寄存器0 配置寄存器,默认1次采样,采样周期1.1ms,连续采样(0x4127)。通常情况下,这个配置已经可以用了
寄存器1 采样电压,也就是采样电阻两端的电压,电阻足够精确的话,这个值*0.08192/采样电阻/32768就是电流值了。
寄存器2 VBUS电压,也就是电源电压,比如5V,10V,读出值*0.0025就是电压。
寄存器3 功率,如果标定寄存器不设置,这个值默认是0
寄存器4 电流,如果标定寄存器不设置,这个值默认是0
寄存器5标定寄存器。这个寄存器是用来标定电流的(同时标定功率),算法如下:
看不懂英文没关系,其实大体意思就是这样的:比如我采样电阻0.01欧,那么我读出1这个测量值代表多少安培呢?
0.08192/0.01/32768=0.00025
但是这样感觉别扭啊,能不能读出1代表0.0001或者0.0002,这样不是方便点?但是问题来了,这是损失量程为代价的。
因为最大读出值就是-32768~32767,标定0.0001的话最大量程就成了3.2767A,标定成0.0002的话最大就是6.5535A,实际最大量程是8.192A。
只有标定为1=0.00025,才能不损失量程。那样的话,寄存器4的值=寄存器1的值。
总之,这个标定没什么意义。直接用寄存器1可以算出电流,寄存器2可以算出电压,这两个寄存器都是可以直接用的。至于功率=电压x电流,这个初中生都知道。
另外,INA226线性度在低功耗下不是很好。所以这个标定值需要修正(即不是一条直线)。
板子焊好后,就开始测试。
先刷个Micropython固件,因为micropython有控制台,先期能迅速调试。
刷完后,先测试I2C通不通:
>>> from machine import Pin, I2C >>> i2c = I2C(0, scl=Pin(8), sda=Pin(9), freq=1000000) >>> i2c.scan() [64]
很顺利,直接搜到一个地址是64的设备。然后读一下寄存器:
>>> i2c.readfrom_mem(64,0x0,2).hex() '4007' >>> i2c.readfrom_mem(64,0x1,2).hex() 'fffa' >>> i2c.readfrom_mem(64,0x2,2).hex() '0003'
都正常,很好。插上一个5V电源,从INA226的datasheet了解到,电压是1.25mv为单位,代码如下:
>>> i2c.readfrom_mem(64,0x2,2).hex() '0fde' >>> int(0xfde)*1.25/1000 5.0775
至此,非常成功。