基于HAL库的INA219

简介:

      INA219是一款电流分流和电源监视器,具有I2C或smbus兼容接口。该设备监测分流压降和母线供电电压,具有可编程的转换时间和滤波。可编程的校准值,与内部倍增器相结合,可以直接读出以安培为单位的电流。一个额外的乘法寄存器以瓦为单位计算功率。I2C或smbus兼容接口具有16个可编程地址。

原理图:

引脚配置和功能 :

         A0和A1根据接的位置不同它的从机地址也不一样

                        

 程序部分:

        我用的是硬件I2C,所以没有软件I2C那么复杂

        1.程序的地址以及配置

#define INA219_ADDRESS                            0x40 /* INA219 传感器的设备地址 */

#define INA219_REG_CONFIG                         0x00 /* 配置寄存器的地址 */
#define INA219_REG_SHUNTVOLTAGE                   0x01 /* 分流电压寄存器的地址 */
#define INA219_REG_BUSVOLTAGE                     0x02 /* 总线电压寄存器的地址 */
#define INA219_REG_POWER                          0x03 /* 功率寄存器的地址 */
#define INA219_REG_CURRENT                        0x04 /* 电流寄存器的地址 */
#define INA219_REG_CALIBRATION                    0x05 /* 校准寄存器的地址 */

#define INA219_CONFIG_RESET                       0x8000 /* 复位位的配置值 */

#define INA219_CONFIG_BVOLTAGERANGE_16V           0x0000 /* 电压测量范围的配置值 0 - 16 V */
#define INA219_CONFIG_BVOLTAGERANGE_32V           0x2000 /* 电压测量范围的配置值 0 - 32 V  */

#define INA219_CONFIG_GAIN_1_40MV                 0x0000 /* 增益和分辨率的配置值 增益为1,电流测量范围为40mV*/
#define INA219_CONFIG_GAIN_2_80MV                 0x0800 /* 增益和分辨率的配置值 增益为2,电流测量范围为80mV*/
#define INA219_CONFIG_GAIN_4_160MV                0x1000 /* 增益和分辨率的配置值 增益为4,电流测量范围为160mV*/
#define INA219_CONFIG_GAIN_8_320MV                0x1800 /* 增益和分辨率的配置值 增益为8,电流测量范围为320mV*/

#define INA219_CONFIG_BADCRES_9BIT                0x0000 /* 总线电压ADC分辨率的配置值 范围为0到511 */
#define INA219_CONFIG_BADCRES_10BIT               0x0080 /* 总线电压ADC分辨率的配置值 范围为0到1023 */
#define INA219_CONFIG_BADCRES_11BIT               0x0100 /* 总线电压ADC分辨率的配置值 范围为0到2047 */
#define INA219_CONFIG_BADCRES_12BIT               0x0180 /* 总线电压ADC分辨率的配置值 范围为0到4097 */
#define INA219_CONFIG_BADCRES_12BIT_2S_1060US     0x0480 /* 总线电压ADC采样和平均化的配置值 2次12位总线电压采样,然后对它们进行平均化,整个过程耗时约为1060微秒*/
#define INA219_CONFIG_BADCRES_12BIT_4S_2130US     0x0500 /* 总线电压ADC采样和平均化的配置值 4次12位总线电压采样,然后对它们进行平均化,整个过程耗时约为2130微秒*/
#define INA219_CONFIG_BADCRES_12BIT_8S_4260US     0x0580 /* 总线电压ADC采样和平均化的配置值 8次12位总线电压采样,然后对它们进行平均化,整个过程耗时约为4260微秒*/
#define INA219_CONFIG_BADCRES_12BIT_16S_8510US    0x0600 /* 总线电压ADC采样和平均化的配置值 16次12位总线电压采样,然后对它们进行平均化,整个过程耗时约为8510微秒*/
#define INA219_CONFIG_BADCRES_12BIT_32S_17MS      0x0680 /* 总线电压ADC采样和平均化的配置值 32次12位总线电压采样,然后对它们进行平均化,整个过程耗时约为17毫秒*/
#define INA219_CONFIG_BADCRES_12BIT_64S_34MS      0x0700 /* 总线电压ADC采样和平均化的配置值 64次12位总线电压采样,然后对它们进行平均化,整个过程耗时约为34微秒*/
#define INA219_CONFIG_BADCRES_12BIT_128S_69MS     0x0780 /* 总线电压ADC采样和平均化的配置值 128次12位总线电压采样,然后对它们进行平均化,整个过程耗时约为69微秒*/

#define INA219_CONFIG_SADCRES_9BIT_1S_84US        0x0000 /* 电流采样分辨率的配置值 1次9位电流采样,整个过程耗时约为84微秒*/
#define INA219_CONFIG_SADCRES_10BIT_1S_148US      0x0008 /* 电流采样分辨率的配置值 1次10位电流采样,整个过程耗时约为148微秒*/
#define INA219_CONFIG_SADCRES_11BIT_1S_276US      0x0010 /* 电流采样分辨率的配置值 1次11位电流采样,整个过程耗时约为276微秒*/
#define INA219_CONFIG_SADCRES_12BIT_1S_532US      0x0018 /* 电流采样分辨率的配置值 1次12位电流采样,整个过程耗时约为532微秒*/
#define INA219_CONFIG_SADCRES_12BIT_2S_1060US     0x0048 /* 电流采样和平均化的配置值 2次12位总线电流采样,然后对它们进行平均化,整个过程耗时约为1060微秒*/
#define INA219_CONFIG_SADCRES_12BIT_4S_2130US     0x0050 /* 电流采样和平均化的配置值 4次12位总线电流采样,然后对它们进行平均化,整个过程耗时约为2130微秒*/
#define INA219_CONFIG_SADCRES_12BIT_8S_4260US     0x0058 /* 电流采样和平均化的配置值 8次12位总线电流采样,然后对它们进行平均化,整个过程耗时约为4260微秒*/
#define INA219_CONFIG_SADCRES_12BIT_16S_8510US    0x0060 /* 电流采样和平均化的配置值 16次12位总线电流采样,然后对它们进行平均化,整个过程耗时约为8510微秒*/
#define INA219_CONFIG_SADCRES_12BIT_32S_17MS      0x0068 /* 电流采样和平均化的配置值 32次12位总线电流采样,然后对它们进行平均化,整个过程耗时约为17微秒*/
#define INA219_CONFIG_SADCRES_12BIT_64S_34MS      0x0070 /* 电流采样和平均化的配置值 54次12位总线电流采样,然后对它们进行平均化,整个过程耗时约为34微秒*/
#define INA219_CONFIG_SADCRES_12BIT_128S_69MS     0x0078 /* 电流采样和平均化的配置值 128次12位总线电流采样,然后对它们进行平均化,整个过程耗时约为69微秒*/

#define INA219_CONFIG_MODE_MASK                   0x07 /* 掩码,用于提取配置寄存器中的模式位*/
#define INA219_CONFIG_MODE_POWERDOWN              0x00 /* INA219 传感器处于电源关闭模式*/
#define INA219_CONFIG_MODE_SVOLT_TRIGGERED        0x01 /* INA219 传感器在检测到电流变化时进行一次瞬态的电压测量*/
#define INA219_CONFIG_MODE_BVOLT_TRIGGERED        0x02 /* INA219 传感器在检测到总线电压变化时进行一次瞬态的电压测量*/
#define INA219_CONFIG_MODE_SANDBVOLT_TRIGGERED    0x03 /* INA219 传感器在检测到电流或总线电压变化时进行一次瞬态的电压测量*/
#define INA219_CONFIG_MODE_ADCOFF                 0x04 /* INA219 传感器的ADC关闭,不进行任何电流或电压测量*/
#define INA219_CONFIG_MODE_SVOLT_CONTINUOUS       0x05 /* INA219 传感器以连续模式进行电流测量,并持续地测量瞬态的电压*/
#define INA219_CONFIG_MODE_BVOLT_CONTINUOUS       0x06 /* INA219 传感器以连续模式进行总线电压测量,并持续地测量瞬态的电压*/
#define INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS   0x07 /* INA219 传感器以连续模式进行电流和总线电压测量,并持续地测量瞬态的电压*/

        2.向INA219写入16位数据

void INA219_Write16(uint8_t Register, uint16_t Value)
{
    uint8_t value[2];
    value[0] = (Value >> 0) & 0xff;
    value[1] = (Value >> 8) & 0xff;

    HAL_I2C_Mem_Write(&hi2c2, (INA219_ADDRESS << 1), Register, I2C_MEMADD_SIZE_8BIT, (uint8_t *)value, 2, 1000);
}

        3.从INA219读取16位数据

uint16_t INA219_Read16(uint8_t Register)
{
    uint8_t Value[2];

    HAL_I2C_Mem_Read(&hi2c2, (INA219_ADDRESS << 1), Register, I2C_MEMADD_SIZE_8BIT, Value, 2, 1000);

    return ((Value[0] << 8) | Value[1]);
}

        4.复位INA219

void INA219_Reset(void)
{
    INA219_Write16(INA219_REG_CONFIG, INA219_CONFIG_RESET);
    delay_ms(1);
}

        5.配置INA219的校准值

void INA219_setCalibration(uint16_t CalibrationData)
{
    INA219_Write16(INA219_REG_CALIBRATION, CalibrationData);
}

        6.配置INA219

oid INA219_setConfig(uint16_t Config)
{
    INA219_Write16(INA219_REG_CONFIG, Config);
}

        7.配置INA219的测量范围为16V电压和最大400mA电流

void INA219_setCalibration_16V_400mA(void)
{
    uint16_t config = INA219_CONFIG_BVOLTAGERANGE_16V |
                      INA219_CONFIG_GAIN_1_40MV | INA219_CONFIG_BADCRES_12BIT |
                      INA219_CONFIG_SADCRES_12BIT_1S_532US |
                      INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS;

    ina219_calibrationValue = 8192;

    INA219_setCalibration(ina219_calibrationValue);
    INA219_setConfig(config);
}

        8.INA219初始化

uint8_t INA219_Init(void)
{
    uint8_t ina219_isReady = HAL_I2C_IsDeviceReady(&hi2c2, (INA219_ADDRESS << 1), 3, 2);

    if(ina219_isReady == HAL_OK)
    {
        INA219_Reset();
        INA219_setCalibration_16V_400mA();

        return 0;
    }

    else
    {
        return 1;
    }
}

        9.读取总线电压值(mV)

uint32_t INA219_ReadBusVoltage(void)
{
    uint16_t BusVoltage = INA219_Read16(INA219_REG_BUSVOLTAGE);

    return (BusVoltage >> 3) * 4;
}

        10.读取电流值(mA)

uint32_t INA219_ReadCurrent(void)
{
    uint16_t Current = INA219_Read16(INA219_REG_CURRENT);

    return Current * 0.1;
}

        11.读取功率值(mW)

uint32_t INA219_Power(void)
{
    uint16_t Power = INA219_Read16(INA219_REG_POWER);

    return Power * 2;
}

  • 15
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于hal库的DDS(数据分发服务)是一种用于实时数据通讯的中间件,它能够在分布式系统中快速、可靠地传输大量数据。HAL(硬件抽象层)是一种软件接口,用于将软件和硬件设备相互连接和沟通。基于HAL库的DDS利用这一接口,提供了一套完整的通信框架和API,使得开发者可以轻松地实现分布式系统之间的数据交换。 基于HAL库的DDS具有以下特点: 1. 高效可靠:DDS使用高效的数据传输机制,能够在分布式环境下快速传输大量数据。同时,它提供了强大的错误处理和冗余机制,保证数据的可靠性。 2. 低延迟高实时性:DDS支持实时性要求较高的应用场景,可以在毫秒级的延迟下进行数据传输和处理,确保及时性。 3. 可扩展的架构:DDS采用模块化设计,可以方便地扩展功能和性能。开发者可以根据具体需求选择适合的插件和扩展,满足不同应用场景的需求。 4. 跨平台支持:DDS基于HAL库,能够适应不同的操作系统和硬件配置,实现跨平台的数据通讯。 5. 简化开发流程:DDS提供了一套易用的API和工具,简化了开发者的工作,减少了开发周期。开发者可以通过配置文件和接口调用,实现数据的发布和订阅。 基于HAL库的DDS在工业自动化、机器人、通信等领域具有广泛的应用。它能够有效地解决分布式系统中的数据通讯问题,提供可靠的数据交换机制,为实时性要求较高的应用提供了强大的支持。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值