前言
电流电压检测作为电流电压检测是电子系统的“生命体征监测仪”,实时捕捉电路中的电流流动与电压波动,像安全卫士般守护系统运行——精准识别过流、过压、欠压等异常状态,触发保护机制防止硬件损毁。又能化身“能耗分析师”,精确计算功率损耗与能源效率,为优化电路设计、延长电池续航提供数据基石。
图1 INA226参数图
本期我们介绍德州仪器的INA226实现电流电压检测。
芯片介绍
图 2 INA226架构图
首先我们来看看芯片架构图,INA226主要由左边的模拟电路部分和右边的数字通讯部分组成。
模拟电路部分由五大关键模块构成:电压检测通道,电流检测通道,基准电压源,Σ-Δ型ADC,温度补偿网络。
图 3 总线电压测量示意图
电压ADC通道可以切换测量总线电压,电流经过负载之后,会在采样电阻中产生压降,而INA226则可以通过这个压降来计算出电流大小。
图4 电流测量工作图
这个采样电阻的大小通常在0.1Ω或者0.01Ω,以0.01Ω采样电阻为例,在8x的PGA模式下,最低可以采样到1mA的电流大小。
图5 数字通讯示意图
芯片由五个主要寄存器(图中四个加上一个配置寄存器)和I2C通讯总线组成,其中A0和A1用来决定芯片的I2C通讯地址。
图6 配置寄存器示意图
配置寄存器是INA226的核心控制单元,用于设定芯片的工作模式和性能参数。通过配置寄存器(地址0x00)的16位字段,用户可定义平均采样次数(1~128次)、总线电压与分流电压的独立转换时间(140μs~8.244ms),以及选择连续测量、单次触发或低功耗关机等工作模式。该寄存器还包含软复位功能,可一键恢复默认状态。其配置直接影响测量精度、响应速度和功耗水平,例如高精度场景需增加平均次数和转换时间,而动态检测需缩短转换时间以提升采样率。合理配置能协调ADC、PGA和数字滤波模块的协同工作,确保电流电压检测的可靠性与效率。
图7 电流电压寄存器示意图
分流电压寄存器和总线电压寄存器顾名思义分别用来存储采样电阻两端的电压还有总线电压值。
图 8 功率电流寄存器示意图
功率寄存器和电流寄存器分别存储根据电压电流计算的功率值和经过采样电阻的电流大小。
还有一些其他的寄存器这里不做过多的介绍了,下面让我们编写STM32的代码。
程序设计
typedefstruct {I2C_HandleTypeDef *hi2c;uint8_t address;float current_lsb;float r_shunt;float BusVoltage;float Current;float Power;} INA226_t;
代码块1 : 结构体代码
首先定义一个INA226的结构体,它包含了器件地址,计算用电流变量,采样电阻值,总线电压值,采样电流值,功率。
HAL_StatusTypeDef INA226_WriteReg(INA226_t *dev, uint8_t reg, uint16_t value){uint8_t buf[3];buf[0] = reg;buf[1] = (value >> 8) & 0xFF;buf[2] = value & 0xFF;return HAL_I2C_Master_Transmit(dev->hi2c, dev->address, buf, 3, HAL_MAX_DELAY);}
代码块2 HAL库硬件I2C写操作
使用STM32HAL库实现硬件I2C通讯。
HAL_StatusTypeDef INA226_ReadReg(INA226_t *dev, uint8_t reg, uint16_t *value){uint8_t buf[2];HAL_StatusTypeDef ret;ret = HAL_I2C_Master_Transmit(dev->hi2c, dev->address, ®, 1, HAL_MAX_DELAY);if (ret != HAL_OK) return ret;ret = HAL_I2C_Master_Receive(dev->hi2c, dev->address, buf, 2, HAL_MAX_DELAY);if (ret != HAL_OK) return ret;*value = (buf[0] << 8) | buf[1];return HAL_OK;}
代码块3 HAL库硬件I2C读操作
同样的利用STM32HAL库实现对指定寄存器的读取,利用这种方式我们可以得到获取各寄存器的值。
floatINA226_ReadBusVoltage(INA226_t *dev){uint16_t raw = 0;float Voltage;if (INA226_ReadReg(dev, INA226_REG_BUS_VOLTAGE, &raw) != HAL_OK) return-1;Voltage = raw * 1.25f / 1000.0f;dev->BusVoltage = Voltage;return Voltage;}
代码块3 INA226总线电压读取程序
如上述代码所示,利用STM32读取寄存器总线电压寄存器的值后,再根据手册计算实际电压值后返回。
其他寄存器处理暂不演示,源码已上传至交流群。
程序测试
图9 INA226电压电流功率读取值
图10 实际电压图
经过程序测试,可以看到总线电压测试结果和电压表测试结果几乎无异,后续拟使用INA226配合边缘神经网络实现以下电机故障检测。
9767
