INA219电流、电压、功率测量芯片应用
INA219电流、电压、功率测量芯片应用
- 简述
- 芯片引脚
- 应用电路
- 寄存器
- 驱动代码
简述
INA219是一款由德州仪器(Texas Instruments)生产的高精度电流/功率监测芯片,广泛应用于电池监控、电源管理等需要精确电流和功率测量的应用中。该芯片通过I2C总线接口与微控制器进行通信,能够实时监测负载电流、电压和功率等参数。
技术参数:
- 电压测量范围:0V到26V,适用于广泛的应用场景。
- 电流测量范围:通过外部电流检测电阻,可测量的电流范围一般从0A到3.2A或更高。
- 功率计算范围:根据测量的电压和电流决定,单位为瓦特。
- 分辨率:电流分辨率最高可达0.1mA,电压分辨率最高可达0.1mV。
特点和应用场景
INA219具有以下特点:
- 高精度:能够提供高精度的电流和电压测量。
- 低功耗:适用于需要低功耗的应用场景。
- 多种型号:包括INA219A、INA219B和INA219C,每个型号有不同的特点和适用场景 。
常见型号及其特点:
- INA219A:适用于一般低功耗应用,具有较高的电流测量精度和较低的偏置电流。
- INA219B:具有更低的功耗,并且在电流测量方面提供更高的精度,适用于需要高精度电流监控的系统。
- INA219C:提供较宽的工作电压范围和更高的电流量程,适用于更高电流范围的监测应用。
芯片引脚
- IN+和IN_:分别是接检测分流电阻的两端。
- GND:接电源负极
- Vs:电源正极(电压范围:3-5.5V)
- SCL:通讯时钟线
- SDA:通讯数据线
- A0和A1:地址选择引脚(地址对应表如下图)
应用电路
配置用于检测分流和总线电压:
- 分流电压:指的是分流电阻 R S H U N T R_{SHUNT} RSHUNT两端的电压。
- 总线电压:指的是 V I N − V_{IN-} VIN−和GND之间的电压。
- 带有输入滤波的应用电路:
寄存器
INA219通信协议使用的是I2C总线协议,16bit寄存器即2个字节。一共有6个寄存器,其中只需要设置00h和05h两个寄存器,其他为只读寄存器:
-
00:配置寄存器,主要用来配置INA219的工作方式和配置参数(读/写)
-
01:分流电阻电压寄存器(只读)
-
02:总线电压寄存器 V I N − V_{IN-} VIN−和GND之间的电压(只读)
-
03:功率寄存器(只读)
-
04:电流寄存器(只读)
-
05:校准寄存器(读/写)
-
RST:Bit 15复位位,设置为1产生系统复位,就像上电复位一样,所有寄存器复位成默认值。该位自清零。
-
BRNG:Bit 13总线电压量程范围,0=16V,1=32V(默认值)
-
PG:Bits[11, 12] PGA(设置分流电阻最大的电压,用于计算最大检测电流):
BADC: Bits[7-10]总线电压ADC分辨率/平均值设置(总线电压寄存器02h)
SADC: Bits[3-6]分压电阻电压ADC分辨率/平均值设置(分流电压寄存器01h)
MODE: Bit[0-2]运行模式
数据输出寄存器: -
分流电压寄存器(01h):
-
总线电压寄存器(02h):
CNVR:Bit 1 转换完成 为1表示转换完成。
OVF: Bit 0 数学溢出标志位,为1表示功率或电流计算结果溢出,指示电流或功率寄存器数据可能无意义。
-
功率寄存器(03h)
-
电流寄存器(04h)
-
校准寄存器(05h)
校准值计算:
校准值可通过如下公式计算:
首先确定分流电阻 R S H U N T R_{SHUNT} RSHUNT的阻值=0.1R,设置最大检测电压为:32V,设置分流电阻电压范围:320mV
所以最大检测电流 I M A X I_{MAX} IMAX=320mV/0.1R=0.32V/0.1R=3.2A
Current_LSB_MIN= I M A X / 2 15 I_{MAX}/2^{15} IMAX/215=3.2/23767=0.00009766 ADC@15bit
Current_LSB_MAX= I M A X / 2 12 I_{MAX}/2^{12} IMAX/212=3.2/4096=0.00078125 ADC@12bit
Current_LSB的选值范围为Current_LSB_MIN和Current_LSB_MAX之间,选择靠近Current_LSB_MIN
因此这里选择Current_LSB=10010^-6=100uA=0.0001A(每bit位对应的电流大小)
计算基准值:Cal=0.04096/(Current_LSB/R)=0.04096/(0.0001A0.1R)=4096=0x1000
当配置05寄存器的值为:0x1000
但是这样配置完后发现测量到的电流值不对,官方手册还给出了Cal的校准公式:
用电流表测到的实际值为0.290A,INA219测量结果为0.342A,
校准后的cal=4096*0.290/0.3421 = 3472 = 0x0D90
设置后的测量值正确
计算功率LSB
P_LSB=20I_LSB=200.0001A=0.002W
驱动代码
Type_def.h
typedef signed char s8; // 8 bits
typedef signed int s16; // 16 bits
typedef signed long s32; // 32 bits typedef unsigned char u8; // 8 bits
typedef unsigned int u16; // 16 bits
typedef unsigned long u32; // 32 bits typedef signed char int8; // 8 bits
typedef signed int int16; // 16 bits
typedef signed long int32; // 32 bits typedef unsigned char uint8; // 8 bits
typedef unsigned int uint16; // 16 bits
typedef unsigned long uint32; // 32 bits typedef signed char int8_t; // 8 bits
typedef signed int int16_t; // 16 bits
typedef signed long int32_t; // 32 bits typedef unsigned char uint8_t; // 8 bits
typedef unsigned int uint16_t; // 16 bits
typedef unsigned long uint32_t; // 32 bits
drv_ina219.h
#ifndef __DRV_INA219_H__
#define __DRV_INA219_H__// I2C Address Options
#define INA219_I2C_ADDRESS_CONF_0 (u8)(0x40 << 1) // A0 = GND, A1 = GND
#define INA219_I2C_ADDRESS_CONF_1 (u8)(0x41 << 1) // A0 = VS+, A1 = GND
#define INA219_I2C_ADDRESS_CONF_2 (u8)(0x42 << 1) // A0 = SDA, A1 = GND
#define INA219_I2C_ADDRESS_CONF_3 (u8)(0x43 << 1) // A0 = SCL, A1 = GND
#define INA219_I2C_ADDRESS_CONF_4 (u8)(0x44 << 1) // A0 = GND, A1 = VS+
#define INA219_I2C_ADDRESS_CONF_5 (u8)(0x45 << 1) // A0 = VS+, A1 = VS+
#define INA219_I2C_ADDRESS_CONF_6 (u8)(0x46 << 1) // A0 = SDA, A1 = VS+
#define INA219_I2C_ADDRESS_CONF_7 (u8)(0x47 << 1) // A0 = SCL, A1 = VS+
#define INA219_I2C_ADDRESS_CONF_8 (u8)(0x48 << 1) // A0 = GND, A1 = SDA
#define INA219_I2C_ADDRESS_CONF_9 (u8)(0x49 << 1) // A0 = VS+, A1 = SDA
#define INA219_I2C_ADDRESS_CONF_A (u8)(0x4A << 1) // A0 = SDA, A1 = SDA
#define INA219_I2C_ADDRESS_CONF_B (u8)(0x4B << 1) // A0 = SCL, A1 = SDA
#define INA219_I2C_ADDRESS_CONF_C (u8)(0x4C << 1) // A0 = GND, A1 = SCL
#define INA219_I2C_ADDRESS_CONF_D (u8)(0x4D << 1) // A0 = VS+, A1 = SCL
#define INA219_I2C_ADDRESS_CONF_E (u8)(0x4E << 1) // A0 = SDA, A1 = SCL
#define INA219_I2C_ADDRESS_CONF_F (u8)(0x4F << 1) // A0 = SCL, A1 = SCL
#define INA219_I2C_ADDRESS INA219_I2C_ADDRESS_CONF_0/*----------------------------------------------------------------------------*/
// Register Addresses
#define INA219_REG_CONFIG (u8)(0x00) // CONFIG REGISTER (R/W)
#define INA219_REG_SHUNTVOLTAGE (u8)(0x01) // SHUNT VOLTAGE REGISTER (R)
#define INA219_REG_BUSVOLTAGE (u8)(0x02) // BUS VOLTAGE REGISTER (R)
#define INA219_REG_POWER (u8)(0x03) // POWER REGISTER (R)
#define INA219_REG_CURRENT (u8)(0x04) // CURRENT REGISTER (R)
#define INA219_REG_CALIBRATION (u8)(0x05) // CALIBRATION REGISTER (R/W)/*----------------------------------------------------------------------------*/
// Macros for assigning config bits
#define INA219_CFGB_RESET(x) (u16)((x & 0x01) << 15) // Reset Bit
#define INA219_CFGB_BUSV_RANGE(x) (u16)((x & 0x01) << 13) // Bus Voltage Range
#define INA219_CFGB_PGA_RANGE(x) (u16)((x & 0x03) << 11) // Shunt Voltage Range
#define INA219_CFGB_BADC_RES_AVG(x) (u16)((x & 0x0F) << 7) // Bus ADC Resolution/Averaging
#define INA219_CFGB_SADC_RES_AVG(x) (u16)((x & 0x0F) << 3) // Shunt ADC Resolution/Averaging
#define INA219_CFGB_MODE(x) (u16) (x & 0x07) // Operating Mode/*----------------------------------------------------------------------------*/
// Configuration Register
#define INA219_CFG_RESET INA219_CFGB_RESET(1) // Reset Bit#define INA219_CFG_BVOLT_RANGE_MASK INA219_CFGB_BUSV_RANGE(1) // Bus Voltage Range Mask
#define INA219_CFG_BVOLT_RANGE_16V INA219_CFGB_BUSV_RANGE(0) // 0-16V Range
#define INA219_CFG_BVOLT_RANGE_32V INA219_CFGB_BUSV_RANGE(1) // 0-32V Range (default)#define INA219_CFG_SVOLT_RANGE_MASK INA219_CFGB_PGA_RANGE(3) // Shunt Voltage Range Mask
#define INA219_CFG_SVOLT_RANGE_40MV INA219_CFGB_PGA_RANGE(0) // Gain 1, 40mV Range
#define INA219_CFG_SVOLT_RANGE_80MV INA219_CFGB_PGA_RANGE(1) // Gain 2, 80mV Range
#define INA219_CFG_SVOLT_RANGE_160MV INA219_CFGB_PGA_RANGE(2) // Gain 4, 160mV Range
#define INA219_CFG_SVOLT_RANGE_320MV INA219_CFGB_PGA_RANGE(3) // Gain 8, 320mV Range (default)#define INA219_CFG_BADCRES_MASK INA219_CFGB_BADC_RES_AVG(15) // Bus ADC Resolution and Averaging Mask
#define INA219_CFG_BADCRES_9BIT_1S_84US INA219_CFGB_BADC_RES_AVG(0) // 1 x 9-bit Bus sample
#define INA219_CFG_BADCRES_10BIT_1S_148US INA219_CFGB_BADC_RES_AVG(1) // 1 x 10-bit Bus sample
#define INA219_CFG_BADCRES_11BIT_1S_276US INA219_CFGB_BADC_RES_AVG(2) // 1 x 11-bit Bus sample
#define INA219_CFG_BADCRES_12BIT_1S_532US INA219_CFGB_BADC_RES_AVG(3) // 1 x 12-bit Bus sample (default)
#define INA219_CFG_BADCRES_12BIT_2S_1MS INA219_CFGB_BADC_RES_AVG(9) // 2 x 12-bit Bus samples averaged together
#define INA219_CFG_BADCRES_12BIT_4S_2MS INA219_CFGB_BADC_RES_AVG(10) // 4 x 12-bit Bus samples averaged together
#define INA219_CFG_BADCRES_12BIT_8S_4MS INA219_CFGB_BADC_RES_AVG(11) // 8 x 12-bit Bus samples averaged together
#define INA219_CFG_BADCRES_12BIT_16S_8MS INA219_CFGB_BADC_RES_AVG(12) // 16 x 12-bit Bus samples averaged together
#define INA219_CFG_BADCRES_12BIT_32S_17MS INA219_CFGB_BADC_RES_AVG(13) // 32 x 12-bit Bus samples averaged together
#define INA219_CFG_BADCRES_12BIT_64S_34MS INA219_CFGB_BADC_RES_AVG(14) // 64 x 12-bit Bus samples averaged together
#define INA219_CFG_BADCRES_12BIT_128S_68MS INA219_CFGB_BADC_RES_AVG(15) // 128 x 12-bit Bus samples averaged together#define INA219_CFG_SADCRES_MASK INA219_CFGB_SADC_RES_AVG(15) // Shunt ADC Resolution and Averaging Mask
#define INA219_CFG_SADCRES_9BIT_1S_84US INA219_CFGB_SADC_RES_AVG(0) // 1 x 9-bit Shunt sample
#define INA219_CFG_SADCRES_10BIT_1S_148US INA219_CFGB_SADC_RES_AVG(1) // 1 x 10-bit Shunt sample
#define INA219_CFG_SADCRES_11BIT_1S_276US INA219_CFGB_SADC_RES_AVG(2) // 1 x 11-bit Shunt sample
#define INA219_CFG_SADCRES_12BIT_1S_532US INA219_CFGB_SADC_RES_AVG(3) // 1 x 12-bit Shunt sample (default)
#define INA219_CFG_SADCRES_12BIT_2S_1MS INA219_CFGB_SADC_RES_AVG(9) // 2 x 12-bit Shunt samples averaged together
#define INA219_CFG_SADCRES_12BIT_4S_2MS INA219_CFGB_SADC_RES_AVG(10) // 4 x 12-bit Shunt samples averaged together
#define INA219_CFG_SADCRES_12BIT_8S_4MS INA219_CFGB_SADC_RES_AVG(11) // 8 x 12-bit Shunt samples averaged together
#define INA219_CFG_SADCRES_12BIT_16S_8MS INA219_CFGB_SADC_RES_AVG(12) // 16 x 12-bit Shunt samples averaged together
#define INA219_CFG_SADCRES_12BIT_32S_17MS INA219_CFGB_SADC_RES_AVG(13) // 32 x 12-bit Shunt samples averaged together
#define INA219_CFG_SADCRES_12BIT_64S_34MS INA219_CFGB_SADC_RES_AVG(14) // 64 x 12-bit Shunt samples averaged together
#define INA219_CFG_SADCRES_12BIT_128S_68MS INA219_CFGB_SADC_RES_AVG(15) // 128 x 12-bit Shunt samples averaged together#define INA219_CFG_MODE_MASK INA219_CFGB_MODE(7) // Operating Mode Mask
#define INA219_CFG_MODE_POWERDOWN INA219_CFGB_MODE(0) // Power-Down
#define INA219_CFG_MODE_SVOLT_TRIGGERED INA219_CFGB_MODE(1) // Shunt Voltage, Triggered
#define INA219_CFG_MODE_BVOLT_TRIGGERED INA219_CFGB_MODE(2) // Bus Voltage, Triggered
#define INA219_CFG_MODE_SANDBVOLT_TRIGGERED INA219_CFGB_MODE(3) // Shunt and Bus, Triggered
#define INA219_CFG_MODE_ADCOFF INA219_CFGB_MODE(4) // ADC Off (disabled)
#define INA219_CFG_MODE_SVOLT_CONTINUOUS INA219_CFGB_MODE(5) // Shunt Voltage, Continuous
#define INA219_CFG_MODE_BVOLT_CONTINUOUS INA219_CFGB_MODE(6) // Bus Voltage, Continuous
#define INA219_CFG_MODE_SANDBVOLT_CONTINUOUS INA219_CFGB_MODE(7) // Shunt and Bus, Continuous (default)/*----------------------------------------------------------------------------*/
// Bus Voltage Register
#define INA219_BVOLT_CNVR (u16)(0x0002) // Conversion Ready
#define INA219_BVOLT_OVF (u16)(0x0001) // Math Overflow Flagstruct ina219_value_t
{s16 voltage;s32 shunt;s32 current;s32 power;
};void drv_ina219_init(void);s16 ina219_GetBusVoltage_mV(void);s32 ina219_GetShuntVoltage_uV(void);s32 ina219_GetCurrent_uA(void);s32 ina219_GetPower_mW(void);void ina219_process(void);#endif //__DRV_INA219_H__
drv_ina219.c
#include "config.h"
#include "debug.h"
#include "app_config.h"#include "STC32G_Timer.h"
#include "STC32G_GPIO.h"
#include "STC32G_NVIC.h"
#include "STC32G_Exti.h"
#include "STC32G_I2C.h"
#include "STC32G_Delay.h"
#include "STC32G_Switch.h"#include "drv_ina219.h"#if TCFG_DRV_INA219_SUPPORTstruct ina219_value_t ina219_value;u16 ina219_calValue = 0;u8 ina219_busVolt_LSB_mV = 4; // Bus Voltage LSB value = 4mV
u8 ina219_shuntVolt_LSB_uV = 10; // Shunt Voltage LSB value = 10uVu32 ina219_current_LSB_uA;
u32 ina219_power_LSB_mW;/*** @brief INA219写寄存器
*/
void ina219_Write_Register(u8 reg, u16 dat)
{u8 val[2];val[0] = (u8)(dat >> 8);val[1] = (u8)(dat & 0xFF);I2C_WriteNbyte(INA219_I2C_ADDRESS, reg, val, 2);
}/*** @brief INA219读寄存器
*/
void ina219_Read_Register(u8 reg, u16 *dat)
{u8 val[2];I2C_ReadNbyte(INA219_I2C_ADDRESS, reg, val, 2);*dat = ((u16)(val[0]) << 8) + val[1];
}// INA219 Set Calibration 16V/16A(Max) 0.02|?
void ina219_SetCalibration_16V_16A(void)
{u16 configValue;// By default we use a pretty huge range for the input voltage,// which probably isn't the most appropriate choice for system// that don't use a lot of power. But all of the calculations// are shown below if you want to change the settings. You will// also need to change any relevant register settings, such as// setting the VBUS_MAX to 16V instead of 32V, etc.// VBUS_MAX = 16V (Assumes 16V, can also be set to 32V)// VSHUNT_MAX = 0.32 (Assumes Gain 8, 320mV, can also be 0.16, 0.08, 0.04)// RSHUNT = 0.02 (Resistor value in ohms)// 1. Determine max possible current// MaxPossible_I = VSHUNT_MAX / RSHUNT// MaxPossible_I = 16A// 2. Determine max expected current// MaxExpected_I = 16A// 3. Calculate possible range of LSBs (Min = 15-bit, Max = 12-bit)// MinimumLSB = MaxExpected_I/32767// MinimumLSB = 0.00048 (0.48mA per bit)// MaximumLSB = MaxExpected_I/4096// MaximumLSB = 0,00390 (3.9mA per bit)// 4. Choose an LSB between the min and max values// (Preferrably a roundish number close to MinLSB)// CurrentLSB = 0.00050 (500uA per bit)// 5. Compute the calibration register// Cal = trunc (0.04096 / (Current_LSB * RSHUNT))// Cal = 4096 (0x1000)// ina219_calValue = 0x1000;ina219_calValue = 0x0D90; //0x1000;// 6. Calculate the power LSB// PowerLSB = 20 * CurrentLSB// PowerLSB = 0.01 (10mW per bit)// 7. Compute the maximum current and shunt voltage values before overflow//// Max_Current = Current_LSB * 32767// Max_Current = 16.3835A before overflow//// If Max_Current > Max_Possible_I then// Max_Current_Before_Overflow = MaxPossible_I// Else// Max_Current_Before_Overflow = Max_Current// End If//// Max_ShuntVoltage = Max_Current_Before_Overflow * RSHUNT// Max_ShuntVoltage = 0.32V//// If Max_ShuntVoltage >= VSHUNT_MAX// Max_ShuntVoltage_Before_Overflow = VSHUNT_MAX// Else// Max_ShuntVoltage_Before_Overflow = Max_ShuntVoltage// End If// 8. Compute the Maximum Power// MaximumPower = Max_Current_Before_Overflow * VBUS_MAX// MaximumPower = 1.6 * 16V// MaximumPower = 256W// Set multipliers to convert raw current/power valuesina219_current_LSB_uA = 100; // Current LSB = 500uA per bitina219_power_LSB_mW = 2; // Power LSB = 10mW per bit = 20 * Current LSB// Set Calibration register to 'Cal' calculated aboveina219_Write_Register(INA219_REG_CALIBRATION, ina219_calValue);// Set Config register to take into account the settings aboveconfigValue = ( INA219_CFG_BVOLT_RANGE_16V | INA219_CFG_SVOLT_RANGE_320MV | INA219_CFG_BADCRES_12BIT_16S_8MS | INA219_CFG_SADCRES_12BIT_16S_8MS | INA219_CFG_MODE_SANDBVOLT_CONTINUOUS );// configValue = ( INA219_CFG_BVOLT_RANGE_16V | INA219_CFG_SVOLT_RANGE_320MV | INA219_CFG_BADCRES_12BIT_32S_17MS | INA219_CFG_SADCRES_12BIT_32S_17MS | INA219_CFG_MODE_SANDBVOLT_CONTINUOUS );ina219_Write_Register(INA219_REG_CONFIG, configValue);
}void ina219_configureRegisters(void)
{delay_ms(15);ina219_SetCalibration_16V_16A();
}s16 ina219_GetBusVoltage_raw(void)
{s16 val;ina219_Read_Register(INA219_REG_BUSVOLTAGE, (u16*)&val);val >>= 3; // Shift to the right 3 to drop CNVR and OVFreturn (val);
}s16 ina219_GetCurrent_raw(void)
{s16 val;// Sometimes a sharp load will reset the INA219, which will// reset the cal register, meaning CURRENT and POWER will// not be available ... avoid this by always setting a cal// value even if it's an unfortunate extra stepina219_Write_Register(INA219_REG_CALIBRATION, ina219_calValue);// Now we can safely read the CURRENT register!ina219_Read_Register(INA219_REG_CURRENT, (u16*)&val);return (val);
}s16 ina219_GetBusVoltage_mV(void)
{s16 val;ina219_Read_Register(INA219_REG_BUSVOLTAGE, (u16*)&val);val >>= 3; // Shift to the right 3 to drop CNVR and OVFval *= ina219_busVolt_LSB_mV; // multiply by LSB(4mV)return (s16)(val);
}s32 ina219_GetShuntVoltage_uV(void)
{s32 val;s16 reg;ina219_Read_Register(INA219_REG_SHUNTVOLTAGE, (u16*)®);val = (s32)reg * ina219_shuntVolt_LSB_uV; // multiply by LSB(10uV)return (s32)val;
}s32 ina219_GetCurrent_uA(void)
{s32 val;s16 reg;// Sometimes a sharp load will reset the INA219, which will// reset the cal register, meaning CURRENT and POWER will// not be available ... avoid this by always setting a cal// value even if it's an unfortunate extra stepina219_Write_Register(INA219_REG_CALIBRATION, ina219_calValue);// Now we can safely read the CURRENT register!ina219_Read_Register(INA219_REG_CURRENT, (u16*)®);val = (s32)reg * ina219_current_LSB_uA;return (s32)(val);
}s32 ina219_GetPower_mW(void)
{s32 val;s16 reg;// Sometimes a sharp load will reset the INA219, which will// reset the cal register, meaning CURRENT and POWER will// not be available ... avoid this by always setting a cal// value even if it's an unfortunate extra stepina219_Write_Register(INA219_REG_CALIBRATION, ina219_calValue);// Now we can safely read the POWER register!ina219_Read_Register(INA219_REG_POWER, (u16*)®);val = (s32)reg * ina219_power_LSB_mW;return (s32)(val);
}void ina219_process(void)
{// TODO: 总线电压 Vin-和GND之间的电压ina219_value.voltage = ina219_GetBusVoltage_mV();log_d("ina219 voltage is:%d(mV)\r\n", ina219_value.voltage);// TODO: 分流电阻两端电压ina219_value.shunt = ina219_GetShuntVoltage_uV();log_d("ina219 shunt is:%ld(uV)\r\n",ina219_value.shunt);// TODO: 电流ina219_value.current = ina219_GetCurrent_uA();log_d("ina219 current is:%ld(uA)\r\n",ina219_value.current);ina219_value.power = ina219_GetPower_mW();log_d("ina219 power is:%ld(mW)\r\n",ina219_value.power);
}void drv_ina219_init(void)
{I2C_InitTypeDef i2c;i2c.I2C_Enable = ENABLE;i2c.I2C_Mode = I2C_Mode_Master;i2c.I2C_Speed = MAIN_Fosc/2/(100000*2+4);i2c.I2C_MS_WDTA = DISABLE;i2c.I2C_SL_MA = ENABLE;I2C_Init(&i2c);// NVIC_I2C_Init(I2C_Mode_Master, ENABLE, Priority_1); // I2C Master模式可不用开中断P2_MODE_IO_PU(GPIO_Pin_4);P2_MODE_IO_PU(GPIO_Pin_5);I2C_SW(I2C_P24_P25);ina219_configureRegisters();log_d("INA219 Driver Init\n");
}#endif
main.c
main()
{// drv_ina219_init();ina219_process();
}
相关文章:
INA219电流、电压、功率测量芯片应用
INA219电流、电压、功率测量芯片应用 简述芯片引脚应用电路寄存器驱动代码 简述 INA219是一款由德州仪器(Texas Instruments)生产的高精度电流/功率监测芯片,广泛应用于电池监控、电源管理等需要精确电流和功率测量的应用中。该芯片通…...
深入解析设计模式之工厂模式
深入解析设计模式之工厂模式 在软件开发的复杂体系中,设计模式作为解决常见问题的有效方案,为开发者提供了强大的工具。工厂模式作为一种广泛应用的创建型设计模式,专注于对象的创建过程,通过巧妙的设计,将对象的创建…...
ollama修改监听ip: 0.0.0.0
确认Ollama绑定IP地址 默认情况下,Ollama可能仅监听本地回环地址(127.0.0.1)。要允许外部访问,需将其配置为监听所有IP(0.0.0.0)或指定IP(如10…19)。 修改启动命令(推荐…...
.NET MVC实现电影票管理
.NET MVC(Model-View-Controller)是微软推出的基于 Model-View-Controller 设计模式的 Web 应用框架,属于 ASP.NET Core 的重要组成部分。其核心目标是通过清晰的分层架构实现 高内聚、低耦合 的开发模式,适用于构建可扩展的企业级…...
FPGA DSP:Vivado 中带有 DDS 的 FIR 滤波器
本文使用 DDS 生成三个信号,并在 Vivado 中实现低通滤波器。低通滤波器将滤除相关信号。 介绍 用DDS生成三个信号,并在Vivado中实现低通滤波器。低通滤波器将滤除较快的信号。 本文分为几个主要部分: 信号生成:展示如何使用DDS&am…...
大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(2)
Paimon的下载及安装,并且了解了主键表的引擎以及changelog-producer的含义参考: 大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(1) 利用Paimon表做lookup join,集成mysql cdc等参考: 大数据组件(四)快速入门实时数据…...
vue3父子组件props传值,defineprops怎么用?(组合式)
目录 1.基础用法 2.使用解构赋值的方式定义props 3.使用toRefs的方式解构props (1).通过ref响应式变量,修改对象本身不会触发响应式 1.基础用法 父组件通过在子组件上绑定子组件中定义的props(:props“”)传递数据给子组件 <!-- 父组件…...
Linux /etc/fstab文件详解:自动挂载配置指南(中英双语)
Linux /etc/fstab 文件详解:自动挂载配置指南 在 Linux 系统中,/etc/fstab(File System Table)是一个至关重要的配置文件,它用于定义系统开机时自动挂载的文件系统。如果你想让磁盘分区、远程存储(如 NFS&…...
Test the complete case
Test the complete case python写的一段 由pytest测试框架/allure报告框架/parameters数据驱动组成的完整案例代码 目录结构 project/ ├── test_cases/ │ ├── __init__.py │ └── test_math_operations.py # 测试用例 ├── test_data/ │ └── math_dat…...
装win10系统提示“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”解决方法
问题描述 我们在u盘安装原版win10 iso镜像时,发现在选择硬盘时提示了“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”,直接导致了无法继续安装下去。出现这种情况要怎么解决呢? 原因分析: 当您在安装Windows操作系统…...
【pytest-jira】自动化用例结合jira初版集成思路
【pytest】编写自动化测试用例命名规范README 【python】连接Jira获取token以及jira对象 【python】解析自动化脚本文件并按照测试周期存储记录 【python】向Jira推送自动化用例执行成功 【python】向Jira测试计划下,附件中增加html测试报告 以下内容主要是介绍jira…...
PHP 会话(Session)实现用户登陆功能
Cookie是一种在客户端和服务器之间传递数据的机制。它是由服务器发送给客户端的小型文本文件,保存在客户端的浏览器中。每当浏览器向同一服务器发送请求时,它会自动将相关的Cookie信息包含在请求中,以便服务器可以使用这些信息来提供个性化的…...
大模型安全问题详解(攻击技术、红队测试与安全漏洞)
文章目录 大模型攻击技术提示注入攻击(Prompt Injection)数据投毒攻击(Data Poisoning)模型克隆攻击(Model Cloning)拒绝服务攻击(DoS)和拒绝钱包攻击(DoW)插…...
【愚公系列】《鸿蒙原生应用开发从零基础到多实战》002-TypeScript 类型系统详解
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主&…...
C# 将非托管Dll嵌入exe中(一种实现方法)
一、环境准备 电脑系统:Windows 10 专业版 20H2 IDE:Microsoft Visual Studio Professional 2022 (64 位) - Current 版本 17.11.4 其他: 二、测试目的 将基于C++创建DLL库,封装到C#生成的exe中。 一般C++创建的库,在C#中使用,都是采用DllImport导入的,且要求库处…...
c sharp 特性详解
文章目录 一、特性基础用法二、常见的内置特性三、自定义特性四、通过反射读取特性五、实际应用场景六、练习 一、特性基础用法 什么是特性? 特性是一种继承System.Attribute类,用于标记代码元素 特性的语法: [AttributeName(Parameter1, P…...
Langchain vs. LlamaIndex:哪个在集成MongoDB并分析资产负债表时效果更好?
Langchain vs. LlamaIndex:哪个在集成MongoDB并分析资产负债表时效果更好? 随着大语言模型(LLM)在实际应用中的普及,许多开发者开始寻求能够帮助他们更高效地开发基于语言模型的应用框架。在众多框架中,La…...
MySQL日常维护工具------备份
MySQL日常维护工具-备份 一、MySQL字符集 (一)字符集介绍 字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集…...
硬核技术组合!用 DeepSeek R1、Ollama、Docker、RAGFlow 打造专属本地知识库
文章目录 一、引言二、安装Ollama部署DeepSeekR1三、安装Docker四、安装使用RAGFlow4.1 系统架构4.2 部署流程4.3 使用RAGFlow4.4 在RAGFlow中新增模型4.5 创建知识库4.6 创建私人助理使用RGA 一、引言 本地部署DeepSeek R1 Ollama RAGFlow构建个人知识库,通过将…...
[VSCode]彻底卸载和重装,并搭建Java开发环境
VSCode彻底卸载 由于当初是朋友帮忙装的,所以准备卸载,自己装一遍 从控制面板找到 vscode 将其卸载。 此时仅仅是删除了应用软件 删除安装插件 在图示路径中找到 .vscode 文件夹,将其删除,即可彻底清除安装的插件 C:\Users\user\.vscode …...
Scrum方法论指导下的Deepseek R1医疗AI部署开发
一、引言 1.1 研究背景与意义 在当今数智化时代,软件开发方法论对于项目的成功实施起着举足轻重的作用。Scrum 作为一种广泛应用的敏捷开发方法论,以其迭代式开发、快速反馈和高效协作的特点,在软件开发领域占据了重要地位。自 20 世纪 90 …...
政安晨的AI大模型训练实践 九 - 熟悉LLaMA Factory的详细参数含义-基本概念理解一下
政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 小伙伴铁子们,上手先熟悉起来训练工具的每一个参数,很重要。 参照我…...
保姆级教程 | Office-Word中图目录制作及不显示图注引文的方法
背景 由于毕业论文的格式修改需要(没错,我终于要拿下PhD了。差不多四个月没更新,主要是①根据处理完的数据完成小论文撰写;②找工作...③完成学位论文的撰写。因而对建模和数据处理的需求不高,对有些时隔久远的博文具…...
Linux lsblk 命令详解:查看磁盘和分区信息 (中英双语)
Linux lsblk 命令详解:查看磁盘和分区信息 在 Linux 系统中,管理磁盘设备和分区是日常运维工作的重要部分。而 lsblk 命令是一个强大的工具,它用于列出系统中的块设备(block devices)信息,可以帮助我们快速…...
使用API有效率地管理Dynadot域名,为域名部署DNS安全拓展(DNSSEC)
关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…...
前后端项目部署服务器(传统部署和Docker部署)
内外网 开发环境连外网(8.140.26.187),测试/生产环境连内网(172.20.59.17) 内外网地址不同,但指定的库是同一个 内网IP地址范围包括: 10.0.0.0 到 10.255.255.255172.16.0.0 到 172.31.2551…...
深入HBase——核心组件
引入 通过上一篇对HBase核心算法和数据结构的梳理,我们对于其底层设计有了更多理解。现在我们从引入篇里面提到的HBase架构出发,去看看其中不同组件是如何设计与实现。 核心组件 首先,需要提到的就是HBase架构中会依赖到的Zookeeper和HDFS。…...
虚拟机从零实现机器人控制
1. 系统安装 因Docker不适合需要图形界面的开发,因此使用虚拟机VMware方便可视化界面方式查看效果,相关软件可以从官网下载,这里有一整套免费安装文件百度网盘地址: 2. ROS安装 Ubuntu 22.04:https://docs.ros.org…...
最新本地部署 DeepSeekR1 蒸馏\满血量化版 + WebOpenUI 完整教程(Ubuntu\Linux系统\Ollama)
测试机为6133CPU(40Cores)256G D44*4090D 24G 一种方法是部署蒸馏版Distill模型。一种是部署Huggingface上unsloth的量化版模型 Ollama及模型安装 1.下载并安装ollama curl -fsSL https://ollama.com/install.sh | sh如果下载不动可以试试挂梯子或者再试几次 挂代理代码&…...
Linux基本指令(三)+ 权限
文章目录 基本指令grep打包和压缩zip/unzipLinux和windows压缩包互传tar(重要)Linux和Linux压缩包互传 bcuname -r常用的热键关机外壳程序 知识点打包和压缩 Linux中的权限用户权限 基本指令 grep 1. grep可以过滤文本行 done用于标记循环的结束&#x…...
kafka-集群缩容
一. 简述: 当业务增加时,服务瓶颈,我们需要进行扩容。当业务量下降时,为成本考虑。自然也会涉及到缩容。假设集群有 15 台机器,预计缩到 10 台机器,那么需要做 5 次缩容操作,每次将一个节点下线…...
【nextJs】官网demo学习
最近在看nextjs官方的demo,把一些值得记录的记下来,方便查询; 1.连接数据库 1.1需要把代码传到远程仓库: 执行下面的命令: // 把#后面内容写入readme文件中 echo "# nextjs-dashboard" >> README.…...
在nodejs中使用ElasticSearch(一)安装,使用
使用docker安装ElasticSearch和Kibana 1)创建相应的data文件夹和子文件夹用来持久化ElasticSearch和kibana数据 2)提前创建好elasticsearch配置文件 data/elasticsearch/config/elasticsearch.yml文件 # Elasticsearch Configuration # # NOTE: Elas…...
图的最短路径:Dijkstra算法和Bellman-Ford算法(C++)
上文中我们了解了拓扑排序, 本节我们来学习最短路径的算法. 在图论中, 最短路径问题是指在一个加权图中找到两个节点之间的权重和最小的路径. 最短路径问题是一个基础且重要的主题. 它不仅在理论上具有挑战性, 而且在实际应用中也非常广泛, 比如交通导航, 社交网络分析等. 本…...
【WebGL】fbo双pass案例
双pass渲染案例(离线渲染一个三角面,然后渲染到一个占满屏幕的矩阵上) 离线渲染如何需要开启深度测试的话,需要额外操作,这里不展开 <!DOCTYPE html> <html lang"en"><head><meta ch…...
【机器学习】CNN与Transformer的表面区别与本质区别
仅供参考 表面区别 1. 结构和原理: CNN:主要通过卷积层来提取特征,这些层通过滑动窗口(卷积核)捕捉局部特征,并通过池化层(如最大池化)来降低特征的空间维度。CNN非常适合处理具有网格状拓扑结构的数据,如图像。Transformer:基于自注意力(Self-Attention)机制,能…...
C++:pthread的使用
pthread 简介 pthread 是 POSIX 线程(POSIX Threads)的简称,它是 POSIX 标准中定义的线程接口规范。pthread 库提供了一系列函数,用于创建、销毁、同步和管理线程。在类 Unix 系统(如 Linux、macOS)中&…...
Docker 容器安装 Dify的两种方法
若 Windows 已安装 Docker,可借助 Docker 容器来安装 Dify: 一、方法一 1. 拉取 Dify 镜像 打开 PowerShell 或命令提示符(CMD),运行以下命令从 Docker Hub 拉取 Dify 的镜像(Docker Hub中找到该命令行&…...
nodejs:express + js-mdict 作为后端,vue 3 + vite 作为前端,在线查询英汉词典
向 doubao.com/chat/ 提问: node.js js-mdict 作为后端,vue 3 vite 作为前端,编写在线查询英汉词典 后端部分(express js-mdict ) 1. 项目结构 首先,创建一个项目目录,结构如下࿱…...
mysql之事务深度解析与实战应用:保障数据一致性的基石
文章目录 MySQL 事务深度解析与实战应用:保障数据一致性的基石一、事务核心概念与原理1.1 事务的本质与意义1.2 事务的 ACID 特性1.2.1 原子性 (Atomicity)1.2.2 一致性 (Consistency)1.2.3 隔离性 (Isolation)1.2.4 持久性 (Durability) 1.3 事务隔离级别与并发问题…...
einops测试
文章目录 1. einops2. code3. pytorch 1. einops einops 主要是通过爱因斯坦标记法来处理张量矩阵的库,让矩阵处理上非常简单。 conda : conda install conda-forge::einopspython: 2. code import torch import torch.nn as nn import torch.nn.functional as…...
华为云deepseek大模型平台:deepseek满血版
华为云硅基流动使用Chatbox接入DeepSeek-R1满血版671B 1、注册: 华为云deepseek大模型平台注册:https://cloud.siliconflow.cn/i/aDmz6aVN 说明:填写邀请码的话邀请和被邀请的账号都会获得2000 万 Tokens;2个帐号间不会与其他关联…...
Elasticsearch Open Inference API 增加了对 Jina AI 嵌入和 Rerank 模型的支持
作者:Hemant Malik 及 Joan Fontanals Martnez 探索如何使用 Elasticsearch Open Inference API 访问 Jina AI 模型。 我们在 Jina AI 的朋友们将 Jina AI 的嵌入模型和重新排名产品的原生集成添加到 Elasticsearch 开放推理 API 中。这包括对行业领先的多语言文本嵌…...
在PHP Web开发中,实现异步处理有几种常见方式的优缺点,以及最佳实践推荐方法
1. 消息队列 使用消息队列(如RabbitMQ、Beanstalkd、Redis)将任务放入队列,由后台进程异步处理。 优点: 任务持久化,系统崩溃后任务不丢失。 支持分布式处理,扩展性强。 实现步骤: 安装消息…...
如何设计app测试用例
功能测试 测试方法:等价类划分法、边界值法、场景法、因果图法。优先级设定:核心业务功能设为高优先级。需求覆盖 正向场景、反向场景、关联接口串场景 与后端开发确认测试用例是否全面覆盖后端逻辑。和产品确认用例是否覆盖本次需求,以及是否…...
《炒股养家心法.pdf》 kimi总结
《炒股养家心法.pdf》这篇文章详细阐述了一位超级游资炒股养家的心得与技巧,展示了其从40万到10亿的股市传奇。以下是文章中炒股技巧和心得的详细总结: 1.核心理念 市场情绪的理解:炒股养家强调,股市的本质是群体博弈,…...
DVWA 靶场
DVWA 靶场的通关 刚建立和使用 输入 http://dvwa:8898/setup.php //进入用户名 密码 dvwa 你自己设计的想要进入数据库 点击creat 用户名 密码 admin passwordAttack type Sniper模式 在Sniper模式下,Payload字典用于逐个替换请求中标记的位置。例如&#x…...
【C语言】(一)数据在计算机中的存储与表示
目录 一、存储单位(比特/字节) 二、数制/进制(二/八/十/十六) 三、码制(原码/反码/补码/移码) 四、二进制表示小数 (一)定点数 (二)浮点数 十进制转化…...
大语言模型微调的公开JSON数据
大语言模型微调的公开JSON数据 以下是一些可用于大语言模型微调的公开JSON数据及地址: EmoLLM数据集 介绍:EmoLLM是一系列能够支持理解用户、帮助用户心理健康辅导链路的心理健康大模型,其开源了数据集、微调方法、训练方法及脚本等。数据集按用处分为general和role-play两种…...
solidity之Foundry安装配置(一)
一门面向合约的高级编程语言,主要用来编写以太坊只能合约。 Solidity受C语言,Python和js影响,但为编译成为以太坊虚拟机字节码在EVM上执行,很多特性和限制都和EVM相关。 Solidity 是静态类型语言,支持继承、库、自定义…...