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

        上一篇文章我们讲了如何测试电流,但是INA226有一个非常典型的问题,那就是误差比较大,因为采样电阻非常小,我的开发板用的是100mΩ的采样电阻,在设定中我也用的是这个采样电阻值,但事实上,测试得到的偏差会超过10%,因为采样电阻本身有误差,焊接的工艺,焊锡膏的成分也有带来误差,甚至PCB上的布局和连线也会导致误差!所以,在实际场景中,想要达到比较精确的值,这个采样电阻,绝对不适合采用过小的电阻,比如10mΩ左右的电阻,因为积累误差甚至会超过电阻本身的的值。

        对这个问题,我的思考是只能通过某些特定的办法进行补偿,比如通过对采样电阻值的修正,达到更精确的测量目的。修正的原理也很简单,我们已知总线电压(Vbus,INA226测量总线电压非常方便),找一个非常精确的电阻(RL)作为负载,比如1000欧姆。然后设定采样电阻(Rs)的值就等于其标称值,这样我们能得到一个精准的参考电流值;然后我们再通过INA226测量电流值,得到一个测量电流值,这样,我们就可以通过下面的办法来计算实际的采样电阻偏差是多少:

        令测量电流是 Is,Vx = Is * ( RL + Rs ),得到一个误差总线电压值;用 Vx - Vbus,得到误差电压ΔV,用ΔV / Vbus,就得到了误差值 r,而采样电阻修正值 Rf = Rs * r,给采样电阻加上这个值之后,重新设定校准寄存器,就可以得到比较精确的电流了。但是这个只是基于对采样电阻值的假设,所以,实际电流和采样电流值之间还是存在一定的误差,只是这个误差比较小而已。

        


double INA226Compensation(double load_resisitor, double shunt_resistor)
{
    uint16_t current = 0, voltage = 0;

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

    current = current >> 8 | current << 8;
    double i2 = current * current_lsb;

    i2c_write_blocking(i2c_default, 0x40, & bus_voltage_register, sizeof(bus_voltage_register), true );
    i2c_read_blocking (i2c_default, 0x40, (uint8_t *) & voltage, sizeof(voltage), false );

    voltage = voltage >> 8 | voltage << 8;
    double bus = voltage * 0.00125;

    double i1 = bus / ( load_resisitor + shunt_resistor );
    double vx = i2 *  ( load_resisitor + shunt_resistor );

    double ratio = ( vx - bus ) / bus;
    double r = ratio * shunt_resistor;
    
    Serial.printf( "%f, %f, %fV, %f, %f\n", i1, i2, bus, ratio, r );
    return r;
}

        代码里面有测量电流和总线电压的计算,总线电压非常容易计算,获取到总线电压寄存器的值之后,乘以0.00125就是电压值,这个值非常的精确。

        在调用这个函数之前,需要等待约1秒钟,因为第一次设定校准寄存器之后,需要一定的时间,才能得到采样的电流和总线电压值。

    double rs = 0.1;
    double ie = 0.512;
    uint16_t cal = INA226Calibration( rs, ie );

    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 );

    delay( 1000 );

    // fix
    double rf = INA226Compensation(1011, rs);


    cal = INA226Calibration( rs + rf, ie );

    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 使用 VBUS 测量线电压的工作原理及方法 #### 线电压测量的基本概念 INA226 是一款高精度的电流电压监测器,它可以通过 VBUS 引脚测量电源线电压。此引脚用于检测供电线路中的实际电压值,并将其转换为数字化形式以便后续处理[^1]。 #### 测量范围与连接方式 - **测量范围**:VBUS 引脚支持宽广的输入电压范围(0 至 36V),这使其适用于多种不同的应用场景。 - **连接方式**:通常情况下,将待测系统的主电源轨直接连接到 VBUS 引脚即可完成设置。值得注意的是,尽管技术上允许把 VBUS 接入 IN+ 或者 IN- 来运作,但从提高测量精确性的角度来看,推荐优先考虑将 VBUS 连接到 IN- 上面去操作。这样做主要是基于减少因分流电阻所引入之共模噪声影响这一考量因素所致。 #### 数据采集过程解析 当 VBUS 引脚接收到来自外部电路传来的电信号之后,内部集成了专门设计用来放大弱小信号变化幅度的功能模块会对原始数据进行初步加工整理。接着经过一系列复杂的运算逻辑步骤后得出最终结果输出给用户端查看利用[^2]。 具体来说就是先由 ADC 转换器负责把连续模拟量转变成为离散数字序列表示出来;然后再依据预先存储在校准寄存器内的系数参数来进行必要的调整校正动作以确保获取的数据更加贴近真实情况下的物理量表现特征[^2]。 #### 提升测量准确率的技术手段探讨 为了克服可能存在的系统误差问题从而获得更为精准可靠的测试成果,在实践过程中往往还需要额外采取若干针对性强的有效措施予以辅助改善效果显著。例如通过精心挑选高品质的标准参考组件配合实施细致周全的软件算法补偿方案相结合的方式共同发挥作用等等[^3]。 --- ### 实际应用案例说明 以下是关于如何在 Raspberry Pi Pico 平台上部署配置 INA226 设备的一个实例描述: 在这个项目里头,我们采用了如下所示的一种典型硬件布局结构图来构建整个实验平台框架基础构架体系架构层次分明清晰易懂便于理解维护管理操作简便快捷高效实用性强等特点优势明显突出显示了出来[^4]: ```plaintext +-------------------+ | | | Raspberry Pi |----> SDA (Pin 16) | PICO |----> SCL (Pin 17) | |---> GND --> INA226 GND & IN- | |---> 3.3V --> INA226 VCC & VBUS +-------------------+ Additional Connections: - Potentiometer Midpoint ---> INA226 IN+ - One End of Potentiometer ---> Ground ``` 在此基础上编写相应的程序代码控制驱动装置正常运转起来就能顺利达成预期目标要求了。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值