/ina226

INA226,具有 I2C 兼容接口的高侧/低侧测量、 双向电流/功率监视器。

MIT LicenseMIT

INA226 I2C/SMBUS 电流计&功率计

English

简介

采用TI INA226设计的,具有 I2C 兼容接口的高侧/低侧测量、 双向电流/功率监视器模块,引脚兼容 CH347高速USB桥接模块,可以在调试和测试中方便地测量、记录负载电流和功率。

特性

  • 感测总线电压范围:0V - 36V
  • 高侧/低侧电流感测
  • 电压、电流、功率测量
  • 0.1% 增益误差
  • 10uV 偏移
  • 可配置测量平均值
  • 16个可配置I2C地址
  • 2.7V - 5.5V 电源供电
  • 2路电源轨,可选为负载电源,作为 CH347高速USB桥接模块 扩展时,为 3.3V 和 5V
  • Alert指示灯
  • 非共地连接时,可选远端电压感测

图片

TOP

BOTTOM

CH347扩展

配置

PCB 3D TOP

如上图所示,模块主要有2个跳线配置区域,左上的区域可配置DUT供电电源和电压测量,右下的区域可配置模块I2C地址。

I2C地址

I2C地址

I2C地址由2个跳线配置,分别配置A1和A0,A1和A0都有2位,2个跳线帽分别有4个位置可选,所以一共有$(2^2)^2=16$个可选地址。这个主要用于多个模块同时测量的场景,在硬件接口上也设计为可堆叠,一个CH347模块最多可以接入16个INA226模块。如果没有特别需求,2个跳线帽都接在'00'位置就可以。

A1=00, A0=00

DUT供电电源

DUT供电电源

DUT供电电源选择,可选'3V3'或'5V',选择'3V3'时,DUT电源与模块3.3V电源轨连接;选择'5V'时,DUT电源与模块5V电源轨连接。注意这里的'3.3V'和'5V'是针对模块电源轨而言的,具体取决于模块的接口连接,当模块连接CH347模块时,'3.3V'和'5V'分别对应CH347模块的3.3V和5V电源。这个设计主要为方便日常使用,因为大多数电路模块都是3.3V或5V供电。

注意

当需要外部电源给DUT供电时,务必将这个跳线帽拔下,或接在如下位置,否则将损坏模块。

DUT外部供电

电压测量

电压测量

电压测量方式可选近端和远端,当用跳线帽连接时,为近端测量;不接跳线帽时,为远端测量。

近端测量时,INA226测量的是模块POWER OUT端子两端的电压;远端测量时,拔下跳线帽,用导线直接将DUT待测点与模块V+、V-连接,INA226测量的是DUT待测点两端的电压。通常情况下采用近端测量就可以,当所测DUT负载电流比较大时(比如1A以上),电源线压降变得可观,此时采用远端测量可以减小线损误差,使测量电压和功率更接近DUT负载。

测试

测量ESP32模块

简单测试:

sensor = INA226()
print(sensor.get_config())
sensor.set_alert_limit(0x1000)
print(sensor.get_calibration())
print(sensor.get_shunt_voltage(), 'uV')
print(sensor.get_bus_voltage(), 'mV')
print(sensor.get_current(), 'uA')
print(sensor.get_power(), 'mW')
sensor.set_mask_enable('SOL')
print(sensor.get_mask_enable())
sensor.close()

输出:

{'reset': False, 'avg': 0, 'vbus_ct': 4, 'vsh_ct': 4, 'mode': 7}
2048
522.5 uV
5040.0 mV
26125.0 uA
134.375 mW
{'SOL': True, 'SUL': False, 'BOL': False, 'BUL': False, 'POL': False, 'CNVR': False, 'AFF': False, 'CVRF': True, 'OVF': False, 'APOL': False, 'LEN': False}

动态测试:

10Hz采样率测量ESP32模块

测量方法

硬件连接

原理图

3d PCB

模块实物

P4为10*2 2.54mm插针,是模块的电源和I2C接口,兼容CH347模块接口,可以直接插到CH347模块上使用。P4实际使用了加长排座,这样INA226模块插到CH347模块上时不会影响CH347模块连接其他设备,尤其是可以多个INA226模块同时插到CH347模块上使用,测量多路电流。

INA226模块上实际连接的插针只有8个引脚,1个5V电源,1个3.3V电源,1个SCL,1个SDA,4个GND

INA226芯片实际使用3.3V电源,CH347模块上有5V3.3V两路电源,所以在接口设计上这两路电源都接入INA226模块了,其中5V电源连接到J1,3.3V电源除了给INA226芯片供电,还连接到J2J1J2可以通过跳线帽选通为待测设备供电,也就是P1端口。

注意:

如果使用外部电源为待测设备供电,一定要将J1J2上的短路帽拔下来,否则会损坏模块!

J1J2不能同时连接短路帽!

当仅测量电流时,可以像使用电流表一样,将待测点断开,然后将P1的1引脚和P2的2引脚,也就是电路板上标注的"+"的两个脚串入,这样就可以测量电流了。当电流流向与板子上箭头相同时为正,反向则为负。

当需要测量电压和功率时,接线就稍微复杂一些,既要测量电流,又要测量电压,此时需要将待测设备的电源接入P1,待测设备接入P2,注意极性,"+"接电源正极,"-"接电源负极。如果待测设备为5V3.3V电源供电,电流小于500mA,则可以通过短路帽选通J1J2来为待测设备供电,省去连接外部电源。如果待测设备电流较大,为了精确测量功率,则需要考虑远端测量电压,此时要将J3J4上的短路帽拔下来,而使用杜邦线或其他导线将"V+"和"V-"连接到设备端的电源引脚,要注意极性不要接反,这样可以测量远端电压,从而排除电源线损耗对功率测量的影响。

J5 J6 J7 J8为电流计模块I2C地址设置,单个模块使用时保持短路帽默认位置即可,此时对应7位地址为0b1000000。多个模块同时使用时可以设置不同地址来区分各个模块。

LED为INA226芯片的Alert指示灯,可以通过软件设置报警逻辑和阈值来触发报警。

INA226模块目前发货默认感测电阻为20mΩ,对应电流测量范围为0 - 4A,分辨率为125uA,电压分辨率为1.25mV,非常给力,应对常规测量绰绰有余。并且可以编程自动化测量,连续监测记录数据。

示例程序

之前示例测试ESP32模块的电压、电流、功率,代码如下:

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
from time import sleep
from i2c_devices.ina226 import INA226

# Initialize the INA226 sensor
sensor = INA226()

def read_sensor_data():
    return [sensor.get_bus_voltage(), sensor.get_current(), sensor.get_power()]

# Generator function to produce data from the sensor sensor
def generate_sensor_data():
    data_buffer = []
    while True:
        data = read_sensor_data()
        data_buffer.append(data)
        yield data_buffer
        sleep(0.1)

# Create a figure with 6 subplots for accelerometer and gyroscope data
fig, axs = plt.subplots(3, 1, figsize=(8, 12))

# Initialize empty lines for the accelerometer and gyroscope data plots
lines = [axs[i].plot([], [], lw=2)[0] for i in range(3)]

# Set the number of data points to be displayed on the plot
num_display_points = 50

def init():
    for line in lines:
        line.set_data([], [])
    return lines

def update(frame):
    data_buffer = next(data_generator)

    # Generate the x-axis values (time steps) based on the number of data points
    time_steps = np.arange(len(data_buffer))

    # Get the starting index to display a specific number of data points
    start_index = max(0, len(data_buffer) - num_display_points)

    # Update the plot data for accelerometer and gyroscope
    for i in range(3):
        lines[i].set_data(time_steps[start_index:], [data[i] for data in data_buffer[start_index:]])
        axs[i].set_xlim(start_index, start_index + num_display_points - 1)

    # Update the x-axis limits for scrolling effect
    axs[0].set_ylim(0, 10000)
    axs[1].set_ylim(0, 100000)
    axs[2].set_ylim(0, 200)

    return lines

# Create the generator for sensor sensor data
data_generator = generate_sensor_data()

# Create an animation for real-time plotting, update every 100 milliseconds (0.1 seconds)
ani = animation.FuncAnimation(fig, update, frames=range(100), init_func=init, blit=True, interval=100)

# Add labels and title to each subplot
axis_labels = ['Voltage in mV', 'Current in uA', 'Power in mW']
for i in range(3):
    axs[i].set_title(f'{axis_labels[i]}')
    axs[i].set_xlabel('Time Steps')
    axs[i].set_ylabel('INA226 Data Value')

plt.tight_layout()
plt.show()
sensor.close()

相关项目

购买