树莓派PICO使用INA226测量电流和总线电压(2)

        上一篇文章里,我们讲了如何设置配置寄存器(0x01),在测量电流之前,还需要设置校准寄存器(0x05),校准寄存器非常关键,如果不设置这个寄存器,INA226是不会工作的。

        在设置寄存器之前,有一个概念必须了解:LSB,即最低有效位(least significant bit)。这个值非常的关键,因为它就是ADC能提供的分辨率,在手册里,提供了如何计算校准值的方法,其中最关键的就是计算LSB。

        在计算校准值之前,我们必须知道IN+和IN-之间的电阻大小,在这儿我建议根据电流极限,尽可能使用较大的采样电阻。因为PCB的铜箔也有电阻,虽然值并不大,但也能达到毫欧级别。所以,在设计线路的时候,尽可能将采样电阻贴紧INA226,减少线路带来的误差。

        

        依照手册给出的公式,我们必须人为的指定一个最大的测量电流,然后用这个值除以 32768,即2的15次方,得到的值,就是电流的最低有效位。比如,在这个方案里面,我选择的电流最大测量范围是0.512A,不用奇怪我为啥用一个带三位小数的值,因为 512 是2的9次方。

        根据公式 2,current_lsb = 0.512 / 32768 = 0.000015625;大概15.625 uA。

        然后根据公式 1 计算校准值,因为已知分流器是0.1Ω,计算如下:

        cal = 0.00512 / ( 0.000015625 * 0.1 ) = 3276.8;取整之后,得到 3276,这个就是校准值。

        当然,也可以根据实际情况,将 current_lsb 做略微的调整,比如

        从 0.000015625 调整到 0.000016(16 是 2的4次方),然后计算

        cal = 0.00512 / ( 0.000016 * 0.1 ) = 3200;这样就不存在取整的问题。

        得到 cal 之后,将 current_lsb 和 cal 单独保存下来,后面的计算还需要这两个值。

        计算 cal 的代码如下:


uint8_t config_register         = 0x00;
uint8_t shunt_register          = 0x01;
uint8_t bus_voltage_register    = 0x02;
uint8_t current_register        = 0x04;
uint8_t calibration_register    = 0x05;


double current_lsb = 0.0;
double calibration = 0.0;

uint16_t INA226Calibration(double shunt_resistor, double max_expected_current)
{
    current_lsb = max_expected_current / 32768;
    calibration = 0.00512 / current_lsb;
    calibration = calibration / shunt_resistor;
    return (uint16_t)( calibration );
} 

接下来,就是设置校准寄存器:

        

void setup() 
{
    // put your setup code here, to run once:
    Serial.begin( 115200 );
    i2c_init( i2c_default, 100*1000 );
    gpio_set_function(I2C_SDA, GPIO_FUNC_I2C);
    gpio_set_function(I2C_SCL, GPIO_FUNC_I2C);
    gpio_pull_up(I2C_SDA);
    gpio_pull_up(I2C_SCL);
    bi_decl(bi_2pins_with_func(I2C_SDA, I2C_SCL,GPIO_FUNC_I2C));

    
    uint16_t config = INA226Config( IAT_4, ICT_588US, ICT_8244US, IOM_CONTINUOUS_SHUNT_AND_BUS_VOLTAGE );

    uint8_t data_1[3];
    data_1[0] = config_register;
    data_1[1] = config >> 8;
    data_1[2] = config & 0x00ff;    

    i2c_write_blocking(i2c_default, 0x40, data_1, sizeof(data_1), false );


    uint16_t cal = INA226Calibration( 0.1, 0.512 );

    uint8_t data_2[3]; 
    data_2[0] = calibration_register;
    data_2[1] = cal >> 8;
    data_2[2] = cal & 0x00ff;

    i2c_write_blocking(i2c_default, 0x40, data_2, sizeof(data_2), false );
}

        这两个寄存器设置完成之后,INA226就开始工作了。此时,已经可以通过代码读取INA226的测量数据了。 代码如下:

    for( ;; )
    {
        uint16_t readed = 0;

        i2c_write_blocking(i2c_default, 0x40, & current_register, sizeof(current_register), true );
        i2c_read_blocking (i2c_default, 0x40, (uint8_t *) & readed, sizeof(readed), false );

        readed = readed >> 8 | readed << 8;

        Serial.printf( "%X, %d, %f, %fA\n", cal, config, calibration, readed * current_lsb );
    }

         读取出来的值,需要做大小端交换,然后将这个值乘以 current_lsb,就能得到电流读数。在我的例子中,电压3.3V,电阻调整在1.6k附近,读出来的数据范围和计算数据范围吻合。

### INA226芯片功能概述 INA226是一款数字电流感测放大器,具备I2C™SMBus兼容接口。该芯片设计用于监测分流压降线电源电压,是一种高效的分流/功率监视器[^5]。它的核心功能包括: - **高精度测量**:通过内置的高速差分放大器低阻值电流检测电阻,基于欧姆定律实时监测电流、电压等信号,并输出数字化的结果。 - **可编程参数**:支持校准值、转换时间以及取平均值等功能的编程设置,从而适应不同的应用场景需求。 - **直接读取物理量**:利用内部乘法器计算并提供电流(单位为安培)功率(单位为瓦)的数值,便于进一步处理或显示。 - **宽广的操作范围**:能在0V至36V的共模线电压下工作,不受限于供电源的具体数值;同时接受2.7V至5.5V单一电源供应,典型功耗仅为330μA。 ### 应用场景分析 由于上述特点,INA226广泛应用于多种需要精密控制与高效能管理的情境之中,具体如下: #### 1. **电源管理系统** 在各类设备中负责能量分配及效率优化的任务里,INA226因其卓越的数据采集能力而显得尤为重要。它可以被用来追踪不同负载下的电力消耗情况,进而辅助调整策略以达到节能减排的目的[^4]。 #### 2. **电池监控系统** 对于便携式电子产品而言,准确掌握剩余电量至关重要。借助INA226提供的详尽信息——不仅限于瞬时电流强度还有累积能耗状况——制造商得以构建更加可靠且持久耐用的产品模型[^1]。 #### 3. **嵌入式开发平台** 像树莓派Pico这样的小型计算机模块同样可以从这款集成电路获益匪浅。通过简单的硬件连接加上相应的软件配置即可完成复杂任务比如动态调节风扇转速或者评估外部组件运行状态等等[^3]。 ```python import smbus from time import sleep # Initialize I2C bus and INA226 address i2c_bus = smbus.SMBus(1) ina_address = 0x40 def read_register(reg_addr, length=2): data = i2c_bus.read_i2c_block_data(ina_address, reg_addr, length) return (data[0] << 8) | data[1] current_reg_value = read_register(0x04) / 1000.0 # Assuming calibration factor is set appropriately. print(f"Measured Current: {current_reg_value} A") ``` 以上代码片段展示了如何使用Python语言配合smbus库来访问INA226的相关寄存器,并从中提取有用的信息如当前流经电路的实际电流大小。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值