#i2c-driver #driver #i2c #embedded-hal-driver #async #analog

no-std ina226-tp

INA226设备高侧或低侧测量、双向电流和功率监测的Rust驱动程序

3个版本 (重大更新)

0.3.0 2024年6月30日
0.2.0 2024年3月6日
0.1.0 2023年7月9日

132嵌入式开发

Download history 150/week @ 2024-06-25 51/week @ 2024-07-02

每月119次下载

MIT/Apache

73KB
1.5K SLoC

ina226

INA226高侧或低侧测量、双向电流和功率监测的I²C API

ina226 数据手册

描述

此crate是为德州仪器的INA226而设计和测试的,它基于嵌入式-hal crate中的I2C。此crate的实现基于#![no_std],但经过一些小的调整,它也可以在std环境中使用。

此驱动程序允许您

  • 手动配置INA226地址
  • 自动检测INA226地址
  • 完全配置配置寄存器
  • 校准设备
  • 手动配置掩码/使能寄存器
  • 手动配置警报寄存器
  • 读取电压、分流电压、电流和功率
  • 测试设备连接以查找错误
  • 将设备重置为出厂规格

此驱动程序包含两种模式:非操作模式和操作模式:非操作模式

  • 在创建设备时,它以该模式启动
  • 您可以手动设置地址或自动检测它
  • 初始化设备时,它将测试连接,然后移动到操作模式。

操作模式

  • 设置配置、掩码/使能和警报寄存器
  • 根据Rshunt和MaxAmp设置校准寄存器(set_ina_calibration)
  • 手动设置校准寄存器(set_ina_calibration_value)
  • 读取配置的值
  • 将设备重置为出厂规格
  • 读取电压、分流电压、电流和功率

请注意,在配置更改之后,必须执行提交操作,以便信息可以发送到IC。

如果设备未校准,则假定分流电阻值为2毫欧姆,最大电流为10安培

版本修订

0.1.0 - 第一个版本 0.2.0 - 实现了与embedded_hal 1.0的兼容性 0.3.0 - 实现了异步兼容性并修复了在未执行搜索地址之前初始化方法不正确的问题。

功能

features = ["async"] - 启用对异步Rust的支持

示例

要使用此驱动程序,您必须具有嵌入式-hal traits的具体实现。此示例使用stm32f4xx-hal

如果您需要在总线上搜索 INA 地址,或者需要与其他 I2C 设备一起使用,那么您需要使用以下嵌入式_hal_bus 实现方案

use core::cell::RefCell;
use embedded_hal_bus::i2c;

    let mut i2c = dp.I2C1.i2c(
        (scl, sda),
        Mode::Standard {
            frequency: 100.kHz(),
        },
        &clocks,
    );

    let i2c_ref_cell = RefCell::new(i2c);

    let mut ina_device = ina226::Ina226::new(Some(i2c::RefCellDevice::new(&i2c_ref_cell)));

    match ina_device.search_ina_address() {
        Ok(_) => {
            rprintln!(
                "Found Address {:#02x}",
                ina_device.get_ina_address().unwrap()
            );
        }
        Err(x) => {
            rprintln!("Error: {}", x);
            panic!();
        }
    };

    let mut ina_device = match ina_device.initialize(i2c::RefCellDevice::new(&i2c_ref_cell)) {
        Ok(x) => {
            rprintln!("Found INA226!");
            x
        }
        Err(err) => {
            rprintln!("Invalid device: {}", err);
            panic!();
        }
    };

如果您不需要搜索其地址或者总线上有其他 I2C 设备,则只需将 None 传递给新函数,直接使用 i2c 即可

    let mut i2c = dp.I2C1.i2c(
        (scl, sda),
        Mode::Standard {
            frequency: 100.kHz(),
        },
        &clocks,
    );

    let mut ina_device = ina226::Ina226::new(None);

    ina_device.set_address(0x40);

    let mut ina_device = match ina_device.initialize(i2c) {
        Ok(x) => {
            rprintln!("Found INA226!");
            x
        }
        Err(err) => {
            rprintln!("Invalid device: {}", err);
            panic!();
        }
    };

从现在起,您可以正常配置和使用该设备

    ina_device
        .set_ina_mode(InaMode::ShuntAndBusContinuous)
        .set_ina_average(InaAverage::_512)
        .set_ina_vbusct(InaVbusct::_1_1_ms)
        .set_ina_vscht(InaVshct::_1_1_ms)
        .commit();

    ina_device.set_ina_calibration_value(6000).commit();

    rprintln!("Voltage: {:.2} V", ina_device.read_voltage());
    rprintln!("Current: {:.3} A", ina_device.read_current());
    rprintln!("Power: {:.3} W", ina_device.read_power());
    rprintln!(
        "Shunt Voltage: {:.6} V",
        ina_device.read_shunt_voltage()
    );

许可证

根据以下任一许可证授权

您可以选择。

贡献

除非您明确声明,否则您根据 Apache-2.0 许可证定义的,有意提交给作品中的任何贡献,都将根据上述条款双授权,不附加任何额外条款或条件。

依赖项

~1.5MB
~38K SLoC