在实现OLED显示文字的基础上,完成对INA 219数据读取,并且检测5V 或者12 V的电压电流;
一:INA219知识点分享:
1.1 芯片知识点如下:
INA219 是一款具备IIC或 SMBUS 兼容接口的分流器和功率监测计。该器件监测分流器电压降和总线电源电压,转换次数和滤波选项可通过编程设定。可编程校准值与内部乘法器相结合,支持直接读取电流值(单位:安培)。通过附加乘法寄存器可计算功率(单位:瓦)。I2C 或 SMBUS 兼容接口 具有 16 个可编程地址。
INA219 提供两种级别:A级和B级。B级型号的精度更高且精密规范更加严格。
INA219 可在 0V 至 26V 范围内感测总线中的分压。该器件由 3V 至 5.5V 单电源供电,电源的最大流耗为1mA。INA219 的工作温度范围为 -40°C 至 125°C.
1.2 模块的特征:
感测的总线电压范围:0V至26V
报告电流、电压、和功率
16 个可编程地址
高精度:整个温度范围内的精度为0.5%(最大值)(INA219B)
滤波选项
校准寄存器
小外形尺寸品体管(SOT)23-8 和小外形尺寸集成电路(SOIC)-8 封装
二:STM32cube MX 软件配置如下:
这里我所使用的引脚是硬件IIC,该款开发板具有三个IIC接口,所以我们为了快速调试模块,直接使用硬件驱动,参考OLED的模块的驱动,只需要更改寄存器就可以。
三:软件代码如下:
3.1 初始化INA219
/*********************************************************************************************** * @brief void INA219_Init(I2C_HandleTypeDef *hi2c) * @param INA 219模块初始化函数 * @retval 无 * @author 聪聪哥哥 * @version V1.1.0 * @date 25-5-2025 *************************************************************************************************/ void INA219_Init(I2C_HandleTypeDef *hi2c) { float maxExpectedCurrent = 3.2f; currentLSB= maxExpectedCurrent/32768.0f; powerLSB=20.0f * currentLSB; //配置寄存器 uint16_t config=INA219_CONFIG_BVOLTAGERANGE_32V| INA219_CONFIG_GAIN_8_320MV| INA219_CONFIG_BADCRES_12BIT| INA219_CONFIG_SADCRES_12BIT_128S_69MS| INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS; INA219_WriteReg(INA219_REG_CONFIG,config); INA219_WriteReg(INA219_REG_CALIBRATION,INA_CAL); }
3.2 读取模块的寄存器地址:
/*********************************************************************************************** * @brief uint16_t INA219_ReadReg(uint8_t reg) * @param 读取INA 219模块寄存器函数 * @retval 无 * @author 聪聪哥哥 * @version V1.1.0 * @date 25-5-2025 *************************************************************************************************/ uint16_t INA219_ReadReg(uint8_t reg){ uint8_t data[2]; HAL_I2C_Mem_Read(&hi2c3,INA219_ADDRESS,reg,1,data,2,HAL_MAX_DELAY); return(data[0]<<8)|data[1]; }
3.2 写入模块的寄存器地址:
/*********************************************************************************************** * @brief void INA219_WriteReg(uint8_t reg, uint16_t value) * @param 写入INA 219模块寄存器函数 * @retval 无 * @author 聪聪哥哥 * @version V1.1.0 * @date 25-5-2025 *************************************************************************************************/ void INA219_WriteReg(uint8_t reg, uint16_t value){ uint8_t data[2]= {value >>8,value& 0xFF}; HAL_I2C_Mem_Write(&hi2c3, INA219_ADDRESS,reg,1,data,2,HAL_MAX_DELAY); }
3.3 读取功率,电流电压函数如下所示:
/*********************************************************************************************** * @brief float INA219_GetBusVoltage_V * @param * @retval 无 * @author 聪聪哥哥 * @version V1.1.0 * @date 25-5-2025 *************************************************************************************************/ float INA219_GetBusVoltage_V(void) { uint16_t value = INA219_ReadReg(INA219_REG_BUSVOLTAGE); return (value>>3)* 4;//?LSB?=?4mV } /*********************************************************************************************** * @brief float INA219_GetCurrent_mA(void) * @param * @retval 无 * @author 聪聪哥哥 * @version V1.1.0 * @date 25-5-2025 *************************************************************************************************/ float INA219_GetCurrent_mA(void){ int16_t value = (int16_t)INA219_ReadReg(INA219_REG_CURRENT); return value * IAN_I_LSB * 10000.0f; } /*********************************************************************************************** * @brief float INA219_GetPower_mW(void) * @param * @retval 无 * @author 聪聪哥哥 * @version V1.1.0 * @date 25-5-2025 *************************************************************************************************/ float INA219_GetPower_mW(void) { int16_t value = (int16_t)INA219_ReadReg(INA219_REG_POWER); return value * INA_Power_LSB * 1000.0f; }
3.4 显示函数如下:
显示固定如下:
/*********************************************************************************************** * @brief void WorkPageImmobility(void) * @param 工作界面固定显示 * @retval 无 * @author 聪聪哥哥 * @version V1.1.0 * @date 25-5-2025 *************************************************************************************************/ void WorkPageImmobility(void) { OLED_ShowCN(0, 2, 6); OLED_ShowCN(16, 2, 7); OLED_ShowCN(0, 4, 8); OLED_ShowCN(16, 4, 9); OLED_ShowCN(0, 6, 10); OLED_ShowCN(16, 6, 11); OLED_ShowStr(100, 2, (uint8_t *)"MV", 2); OLED_ShowStr(100, 4, (uint8_t *)"MA", 2); OLED_ShowStr(100, 6, (uint8_t *)"MW", 2); }
显示检测到电压电流如下:
/*********************************************************************************************** * @brief void WorkPageDataDisplay(void) * @param 工作界面数据显示 * @retval 无 * @author 聪聪哥哥 * @version V1.1.0 * @date 25-5-2025 *************************************************************************************************/ const uint8_t test[] = "Hello world"; void WorkPageDataDisplay(void) { uint16_t TempStr[16]; sprintf((char*)TempStr,"%3d",iOriginalVoltageData); OLED_ShowStr(40, 2, (uint8_t *)TempStr, 2); OLED_ShowNum(50,4,iOriginalElectriData,5,16); OLED_ShowNum(50,6,iOriginalPowerData,5,16); }
四:实测图片如下所示:
为了保证模块可以正常的工作,这里并没有测试 12V的电压,防止损坏了模块。
测试代码如下:
后记:目前测试 直接读取的数据,会存在误差,需要对数据进行处理。