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

        TI的INA226是一款不错的16位电流测量芯片,拥有非常高的性价比,而且测量精度能够覆盖我们大多数的应用场景,INA226的接线也比较简单,通过I2C读取数据会稍微麻烦一点。

        INA226可以在淘宝上直接买开发板,非常的便宜,我买的是100mΩ的版本,因为测试中测量的电压和电流并不是很高(3.3V总线电压和500mA最大测量电流),如果电流大,可以选择10mΩ的版本。

        测量的线路也非常简单,用PICO的3.3V输出电压作为INA226的Vcc输入并接到Vbus,将PICO的GND接到INA226的GND,同时接到IN-;Vbus接线到一个电位器中位,并将一端接到IN+;这样,3.3V输入电压通过电位器和采样电阻到地。剩下的就需要接I2C连线了,考虑到板子的距离(越短越好),我选择了PICO的pin 16和17作为I2C的接口。

        给测试板接上输入电源,简单的测量了一下各个位置的电压,没问题后,接上电脑开始写代码。

        在进行编程之前,我们有必要简单的了解一下如何从INA226获取数据,通过手册,我们得知,我们是通过I2C访问INA226的寄存器来获取测量数据,寄存器的编号和作用如下:

        在测量之前,必须先设置好两个寄存器,即0x01和0x05,第一个是配置寄存器,需要设置INA226的工作状态,第二个是校准寄存器,在校准寄存器设置之前,INA226是不会进行测量的。

        第一个配置寄存器需要设置4个参数,分别是采样平均次数,总线电压转换时间,分流器电压转换时间,还有操作模式。

        采样平均次数决定了采样的次数,并将这些值做平均处理,两个转换时间一个是针对Vbus,一个是针对Shunt Resistor,时间从140us到8244us不等,总的来讲,采样时间越长,得到的噪音越小,再加上平均次数,完成一次采样的时间是:平均次数 * ( 总线采样时间 + 分流器采样时间)。所以,需要用户自己针对自己的应用场景设置好这三个参数。

         第四个参数是工作模式:

        这个根据自己的需要选取,我选择的就是最后一个,连续测量Vbus和分流器。参数决定好之后,就可以设置0x01号寄存器了,寄存器参数组装的代码如下:


enum INA226_AVERAGE_TIMES
{
  IAT_1 = 0,
  IAT_4,
  IAT_16,
  IAT_64,
  IAT_128,
  IAT_256,
  IAT_512,
  IAT_1024,
  IAT_AMOUNT
};

enum INA226_CONVERSION_TIME
{
  ICT_140US,
  ICT_204US,
  ICT_332US,
  ICT_588US,
  ICT_1100US,
  ICT_2116US,
  ICT_4156US,
  ICT_8244US,
  ICT_AMOUNT
};

enum INA226_OPERATION_MODE
{
  IOM_POWER_DOWN_0,
  IOM_TRIGGERED_SHUNT_VOLTAGE,
  IOM_TRIGGERED_BUS_VOLTAGE,
  IOM_TRIGGERED_SHUNT_AND_BUS_VOLTAGE,
  IOM_POWER_DOWN_1,
  IOM_CONTINUOUS_SHUNT_VOLTAGE,
  IOM_CONTINUOUS_BUS_VOLTAGE,
  IOM_CONTINUOUS_SHUNT_AND_BUS_VOLTAGE,
  IOM_AMOUNT
};


uint16_t INA226Reset()
{
  return 0xC000;
}

uint16_t INA226Config(uint16_t average_times, uint16_t vbus_voltage_conversion_time, uint16_t shunt_voltage_conversion_time, uint16_t operation_mode)
{
    uint16_t result = 0x0400;
    average_times                 = min( average_times, IAT_1024 );
    vbus_voltage_conversion_time  = min( vbus_voltage_conversion_time,  ICT_8244US );
    shunt_voltage_conversion_time = min( shunt_voltage_conversion_time, ICT_8244US );
    operation_mode                = min( operation_mode, IOM_CONTINUOUS_SHUNT_AND_BUS_VOLTAGE );

    result = result | average_times << 9 | vbus_voltage_conversion_time << 6 | shunt_voltage_conversion_time << 3 | operation_mode;
    return result;
}

设置寄存器的代码如下:

#include "hardware/i2c.h"
#include "pico/binary_info.h"
#define I2C_SDA 16
#define I2C_SCL 17


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

        我使用的是PICO的SDK,代码稍微复杂点,首先是初始化 I2C,我们这儿使用I2C0,所以直接用i2c_default,并设置通讯速率是100K,如果是用I2C1,则只需要替换成 i2c1 就行了。PICO 已经定义了两个I2C通道:

extern i2c_inst_t i2c0_inst;
extern i2c_inst_t i2c1_inst;

#define i2c0 (&i2c0_inst) ///< Identifier for I2C HW Block 0
#define i2c1 (&i2c1_inst) ///< Identifier for I2C HW Block 1

#if !defined(PICO_DEFAULT_I2C_INSTANCE) && defined(PICO_DEFAULT_I2C)
#define PICO_DEFAULT_I2C_INSTANCE (__CONCAT(i2c,PICO_DEFAULT_I2C))
#endif

#ifdef PICO_DEFAULT_I2C_INSTANCE
#define i2c_default PICO_DEFAULT_I2C_INSTANCE
#endif

        然后就是分别设定16,17号脚的功能是I2C,拉高16, 17的电平,最后绑定16, 17号脚到I2C这个功能上。

        接下来就是选择参数,配置好平均次数,采样时间,模式等,得到一个uint16_t的值,这个值不能直接传递给INA226,因为I2C通讯传递的是大端数据,即高位在前(字节为单位),而PICO使用的是小端数据,所以,需要对数据进行一次位变换。传输的帧格式是:寄存器编号 + 大端数据,组装好数据帧就可以发送给INA226了。

        到此,第一步设置配置寄存器的工作就做好了,接下来还需要配置校准寄存器(参见 树莓派PICO使用INA226测量电流和总线电压(2))。

### 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、付费专栏及课程。

余额充值