基于STM32的INA226电压电流检测仪

 

 

系统总体框图

功率检测装置原理图功能及模块连接说明

一、系统功能概述

该装置以STM32F103C8T6微控制器为核心,集成功率检测、数据交互、状态显示和用户提示功能,通过模块化设计实现稳定运行。

二、各模块功能及连接方式

  1. 按键模块

功能:用户交互控制(启动/停止设备)。

连接方式:

按键SW1一端接地(GND),另一端通过电阻R5连接至微控制器GPIO引脚PA0。

按键按下时触发PA0电平变化,触发中断或状态读取。

  1. LED指示灯模块

功能:显示设备状态(如运行、告警)。

连接方式:

LED1(R6)和LED2(R7)分别连接至微控制器GPIO引脚PB0和PB1。

GPIO输出高电平时LED点亮,低电平时熄灭。

  1. 微控制器(STM32F103C8T6)

功能:系统控制核心,处理数据、控制外设、驱动显示。

连接方式:

通信接口:

USART1_TX/RX引脚连接调试接口(J4),支持程序烧录和调试。

I2C接口(SCL/SDA)连接OLED屏幕。

控制引脚:

GPIO引脚控制LED、蜂鸣器、按键等外设。

  1. OLED屏幕模块

功能:显示功率检测结果及系统信息。

连接方式:

I2C接口(SCL/SDA)与微控制器相连。

电源由3.3V降压电路供电,接地至GND。

  1. INA226电压电流检测模块

功能:检测电压电流以及功率。

连接方式:

I2C接口(SCL/SDA)与微控制器相连。

电源由3.3V降压电路供电,接地至GND。

  1. 复位电路模块

功能:强制复位微控制器。

连接方式:

复位按钮SW5通过电阻R11连接至NRST引脚,电容C1用于滤波。

  1. 晶振电路模块

功能:提供稳定时钟信号(8MHz主频)。

连接方式:

晶振X1连接至OSC_IN/OSC_OUT引脚,电容C5/C6接地。

  1. 蜂鸣器驱动模块

功能:声音提示(如异常报警)。

连接方式:

蜂鸣器BUZZER2通过三极管Q3和电阻R79/R80连接至微控制器GPIO(BUZZER_PIN)。

GPIO高电平时三极管导通,蜂鸣器发声。

  1. 输入输出接口模块

功能:输入接口用于采集电压电流参数,输出接口接后级用电设备。

连接方式:

通过J2/J3连接器提供VIN+/VIN-/GND等接口。

调试接口模块

功能:程序烧录与调试(SWD或UART)。

连接方式:

J4接口提供USART1_TX/RX/GND信号。

  1. 3.3V降压电路模块

功能:将5V转换为3.3V,为系统供电。

连接方式:

LDO稳压器MEB211输入5V,输出3.3V,电容C3/C4滤波。

三、系统运行逻辑

微控制器通过按键检测用户输入,启动功率检测。

检测数据通过输入接口采集,处理后通过OLED显示。

异常情况触发蜂鸣器报警,LED状态指示同步反馈。

3.3V降压电路为所有模块提供稳定电源,晶振电路确保时序精度。
 


/*** @file INA226.c* @brief INA226电流/功率监测芯片的驱动程序* 使用硬件I2C2接口与INA226通信*/#include "ina226.h"
#include "i2c.h"/*** @brief INA226 I2C初始化* @note 使用Core/Src/i2c.c中已初始化的hi2c1,无需重复初始化*/
void INA226_IIC_Init(void)
{// 使用项目中已初始化的hi2c1
}/*** @brief 初始化INA226芯片* 配置芯片工作模式和校准值*/
void INA226_Init(void)
{INA226_IIC_Init();HAL_Delay(10); // 等待芯片上电稳定// 配置寄存器: 64次平均值,全功能,连续模式INA226_SendData(WRITE_ADDR, Config_Reg, 0x4727);// 校准寄存器: 当单位为mA时,0.002R=0xA00;0.01R=0x200 (最大8A)INA226_SendData(WRITE_ADDR, Calib_Reg, 0x200);
}/*** @brief 向INA226写入数据* @param addr 器件地址(7位)* @param reg 寄存器地址* @param data 要写入的16位数据*/
void INA226_SendData(uint8_t addr, uint8_t reg, uint16_t data)
{uint8_t buf[2] = {(uint8_t)(data >> 8), (uint8_t)(data & 0xFF)};HAL_I2C_Mem_Write(&hi2c1, addr, reg, I2C_MEMADD_SIZE_8BIT, buf, 2, HAL_MAX_DELAY);
}/*** @brief 设置INA226的寄存器指针* @param addr 器件地址(7位)* @param reg 要设置的寄存器地址*/
void INA226_SetRegPointer(uint8_t addr, uint8_t reg)
{HAL_I2C_Master_Transmit(&hi2c1, addr, &reg, 1, HAL_MAX_DELAY);
}/*** @brief 从INA226读取数据* @param addr 器件地址(7位)* @return 读取到的16位数据*/
uint16_t INA226_ReadData(uint8_t addr)
{uint8_t buf[2];HAL_I2C_Master_Receive(&hi2c1, addr | 0x01, buf, 2, HAL_MAX_DELAY);return (buf[0] << 8) | buf[1];
}/*** @brief 获取分流电流值* @param addr 器件地址(7位)* @return 分流电流值(原始数据)*/
uint16_t INA226_GetShuntCurrent(uint8_t addr)
{uint16_t temp = 0;INA226_SetRegPointer(addr, Current_Reg);temp = INA226_ReadData(addr);return temp;
}/*** @brief 获取器件ID* @param addr 器件地址(7位)* @return 器件ID(应为0x2260)*/
uint16_t INA226_Get_ID(uint8_t addr)
{uint16_t temp = 0;INA226_SetRegPointer(addr, ID_Reg);temp = INA226_ReadData(addr);return temp;
}/*** @brief 获取校准寄存器值* @param addr 器件地址(7位)* @return 校准寄存器当前值*/
uint16_t INA226_GET_CAL_REG(uint8_t addr)
{uint16_t temp = 0;INA226_SetRegPointer(addr, Calib_Reg);temp = INA226_ReadData(addr);return temp;
}/*** @brief 获取总线电压值* @param addr 器件地址(7位)* @return 总线电压值(1.25mV/bit)*/
uint16_t INA226_GetVoltage(uint8_t addr)
{uint16_t temp = 0;INA226_SetRegPointer(addr, Bus_V_Reg);temp = INA226_ReadData(addr);return temp;
}/*** @brief 获取分流电压值* @param addr 器件地址(7位)* @return 分流电压值(2.5uV/bit),已处理负数情况*/
uint16_t INA226_GetShuntVoltage(uint8_t addr)
{uint16_t temp = 0;INA226_SetRegPointer(addr, Shunt_V_Reg);temp = INA226_ReadData(addr);if (temp & 0x8000) // 处理负数情况temp = ~(temp - 1);return temp;
}/*** @brief 获取功率值* @param addr 器件地址(7位)* @return 功率值(2.5mW/bit)*/
uint16_t INA226_Get_Power(uint8_t addr)
{uint16_t temp = 0;INA226_SetRegPointer(addr, Power_Reg);temp = INA226_ReadData(addr);return temp;
}
#include "ocv.h"
#include "ina226.h"INA226 CC, OCV; // 定义CC(充电电流)和OCV(开路电压)监测结构体/*** @brief INA226应用示例* 使用步骤:* 1. 调用INA226_Init()初始化INA226芯片* 2. 定期调用Get_Vol()、Get_Cur()、Get_Pow()获取测量值* 3. 从CC结构体读取测量结果*/extern INA226 CC, OCV;
uint8_t CC_MODE[] = "CC MODE";
uint8_t Vol[] = "Voltage:";
uint8_t Cur[] = "Current:";
uint8_t Power[] = "Power:";/*** @brief 测试USB CC模式函数** 在OLED屏幕上显示电压、电流和功率值。** @return 无返回值*/
void USB_CC_TESTER(void)
{OLED_Printf(0, 0, OLED_8X16, "电压电流功率仪");OLED_ShowString(0, 16, (char *)Vol, OLED_8X16);OLED_ShowString(0, 32, (char *)Cur, OLED_8X16);OLED_ShowString(0, 48, (char *)Power, OLED_8X16);OLED_Update();
}/*** @brief 显示电压电流功率仪信息** 在OLED显示屏上显示电压、电流和功率信息,并通过串口输出相同的信息。** @return 无*/
void Show_CC(void)
{OLED_Clear();OLED_Printf(0, 0, OLED_8X16, "电压电流功率仪");OLED_Printf(0, 16, OLED_8X16, "Voltage:%.2f", ((float)CC.voltage_V + ((float)CC.voltage_mV / 100)) * 500);OLED_Printf(0, 32, OLED_8X16, "Current:%.2f", (float)CC.current_A + ((float)CC.current_mA / 1000));OLED_Printf(0, 48, OLED_8X16, "Power:%.2f", ((float)CC.power_W + ((float)CC.power_mW / 100)) * 500);OLED_Update();Serial_Printf_huart2("Voltage:%.2f,Current:%.2f,Power:%.2f\r\n", ((float)CC.voltage_V + ((float)CC.voltage_mV / 100)) * 500, (float)CC.current_A + ((float)CC.current_mA / 1000), ((float)CC.power_W + ((float)CC.power_mW / 100)) * 500);
}/* 示例1: 完整测量流程 */
void Example_MeasureAll(void)
{// 1. 初始化INA226INA226_Init();// 2. 进行测量Get_Vol(); // 获取电压Get_Cur(); // 获取电流Get_Pow(); // 获取功率// 3. 使用测量结果// CC.voltage_V  - 电压整数部分(V)// CC.voltage_mV - 电压小数部分(mV)// CC.current_A  - 电流整数部分(A)// CC.current_mA - 电流小数部分(mA)// CC.power_W    - 功率整数部分(W)// CC.power_mW   - 功率小数部分(mW)
}/* 示例2: 仅电压测量 */
float Example_GetVoltage(void)
{Get_Vol();return CC.voltage_V + (CC.voltage_mV / 1000.0f);
}/* 示例3: 电流方向检测 */
uint8_t Example_IsCharging(void)
{Get_Cur();return (CC.current_signed == 1); // 1表示充电,0表示放电
}/*** @brief 获取电压测量值* 将原始数据转换为实际电压值(V)*/
void Get_Vol(void)
{uint16_t Vol;Vol = INA226_GetVoltage(WRITE_ADDR) / 8; // 1.25mV/bit -> VCC.voltage_V = Vol / 100;				 // 整数部分(V)CC.voltage_mV = Vol % 100;				 // 小数部分(mV)
}/*** @brief 获取电流测量值* 自动检测电流方向(充电/放电)*/
void Get_Cur(void)
{uint16_t Cur;Cur = INA226_GetShuntCurrent(WRITE_ADDR);CC.current_signed = 1; // 默认充电状态if (Cur & 0x8000)	   // 检测电流方向{Cur = ~(Cur - 1);	   // 处理负电流值CC.current_signed = 0; // 设置为放电状态}CC.current_A = Cur / 1000;	// 整数部分(A)CC.current_mA = Cur % 1000; // 小数部分(mA)
}/*** @brief 获取功率测量值* 将原始数据转换为实际功率值(W)*/
void Get_Pow(void)
{uint16_t Pow;Pow = (INA226_Get_Power(WRITE_ADDR) * 5) / 2; // 2.5mW/bit -> WCC.power_W = Pow / 100;						  // 整数部分(W)CC.power_mW = Pow % 100;					  // 小数部分(mW)
}

单片机定制:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/81272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv2目标检测算法:速度与精度的平衡之道

一、YOLOv2的核心改进&#xff1a;从V1到V2的蜕变 YOLOv2作为YOLO系列的第二代算法&#xff0c;在继承V1端到端、单阶段检测的基础上&#xff0c;针对V1存在的小目标检测弱、定位精度低等问题进行了全方位升级&#xff0c;成为目标检测领域的重要里程碑。 &#xff08;一&am…

将嵌入映射到 Elasticsearch 字段类型:semantic_text、dense_vector、sparse_vector

作者&#xff1a; Andre Luiz 讨论如何以及何时使用 semantic_text、dense_vector 或 sparse_vector&#xff0c;以及它们与嵌入生成的关系。 通过这个自定进度的 Search AI 实践学习亲自体验向量搜索。你可以开始免费云试用&#xff0c;或者在本地机器上尝试 Elastic。 多年来…

uniapp取消浏览自动填充

为了防止浏览器自动将记住的密码回填进type"password"输入框&#xff0c;所以在type"password"输入框上面加了两行代码&#xff0c;使浏览器将密码填充到新加的输入框里&#xff0c;并将这两个input隐藏掉 <input type"password" autocomple…

从数据包到可靠性:UDP/TCP协议的工作原理分析

之前我们已经使用udp/tcp的相关接口写了一些简单的客户端与服务端代码。也了解了协议是什么&#xff0c;包括自定义协议和知名协议比如http/https和ssh等。现在我们再回到传输层&#xff0c;对udp和tcp这两传输层巨头协议做更深一步的分析。 一.UDP UDP相关内容很简单&#xf…

显卡、Cuda和pytorch兼容问题

这里写目录标题 驱动与CUDA版本兼容性问题1. **驱动与CUDA版本兼容性问题**2. **任务特性与硬件适配差异**3. **优化策略与框架配置差异**4. **散热与功耗限制**5. **数据传输与CPU瓶颈**排查建议总结 查询PyTorch中实际使用的CUDA版本**1. 查询PyTorch中实际使用的CUDA版本***…

DeepSeek 大模型部署全指南:常见问题、优化策略与实战解决方案

DeepSeek 作为当前最热门的开源大模型之一&#xff0c;其强大的语义理解和生成能力吸引了大量开发者和企业关注。然而在实际部署过程中&#xff0c;无论是本地运行还是云端服务&#xff0c;用户往往会遇到各种技术挑战。本文将全面剖析 DeepSeek 部署中的常见问题&#xff0c;提…

Hadoop的目录结构和组成

Hadoop 目录结构 bin 目录&#xff1a;包含了 Hadoop 的各种命令行工具&#xff0c;如hadoop、hdfs等&#xff0c;用于启动和管理 Hadoop 集群&#xff0c;以及执行各种数据处理任务。etc 目录&#xff1a;存放 Hadoop 的配置文件&#xff0c;包括core-site.xml、hdfs-site.xm…

Python Matplotlib 库【绘图基础库】全面解析

让AI成为我们的得力助手&#xff1a;《用Cursor玩转AI辅助编程——不写代码也能做软件开发》 一、发展历程 Matplotlib 由 John D. Hunter 于 2003 年创建&#xff0c;灵感来源于 MATLAB 的绘图系统。作为 Python 生态中最早的可视化工具之一&#xff0c;它逐渐成为科学计算领…

车载以太网驱动智能化:域控架构设计与开发实践

title: 车载以太网驱动专用车智能化&#xff1a;域控架构设计与开发实践 date: 2023-12-01 categories: 新能源汽车 tags: [车载以太网, 电子电气架构, 域控架构, 专用车智能化, SOME/IP, AUTOSAR] 引言&#xff1a;专用车智能化转型的挑战与机遇 专用车作为城市建设与工业运输…

图论模板(部分)

图论模板&#xff08;部分&#xff09; maincpp #include <iostream> #include <climits> #include <limits>typedef unsigned long long ull; typedef long long ll; typedef long double ld; typedef std::pair<int, int> PII;#define rep(i, n) f…

2025年【道路运输企业安全生产管理人员】考试题库及道路运输企业安全生产管理人员考试内容

一、考试概述 2025年道路运输企业安全生产管理人员考试题库由【安全生产模拟考试一点通】平台发布&#xff0c;涵盖安全生产法律法规、车辆技术管理、从业人员管理、应急预案编制等核心领域。考试重点考察考生对安全生产主体责任、风险管控、隐患排查等实务操作的掌握程度&…

分贝计在噪音污染源识别中的用途

分贝计在噪音污染源识别中的作用 噪音污染是现代社会面临的一个普遍问题&#xff0c;尤其在城市化进程加快的背景下&#xff0c;交通、工业、建筑和娱乐活动等产生的噪音对人们的生活质量和健康造成了严重影响。为了有效管理和控制噪音污染&#xff0c;首先需要准确识别噪音的…

deepin v23.1 搜狗输入法next配置中文输入法下默认用英文标点

deepin23.1下, fcitx5的 deepin next搜狗输入法的属性页无法配置中文状态下默认用英文标点, 但是可以改以下配置来实现这一点. 搜狗输入法运行期间&#xff0c;用户修改的配置被存储在以下位置&#xff1a; ~/.config/cpis/module/im/fcitx5/com.sogou.ime.ng.fcitx5.deepin/k…

C语言:在 Win 10 上,g++ 如何编译 gtk 应用程序

在 Windows 10 上使用 g&#xff08;或 gcc&#xff09;编译基于 GTK 的 C 语言程序是完全可行的&#xff0c;且相比 Tcc 更为推荐&#xff0c;因为 g&#xff08;GNU 编译器套件&#xff09;对 GTK 的支持更加完善&#xff0c;配置也更简单。以下是详细步骤和注意事项&#xf…

84.评论日记

原链接 这个视频我发了四五条评论。评论内容甚至和下面这个视频内的其他评论一样。 找了另外的账号也发了。 发现&#xff0c;无论是我这个账号&#xff0c;还是其他的账号&#xff0c;评论都无法看到。 我大胆猜测有一种机制&#xff0c;某些官号会被设置成一种高检测的等…

【RabbitMQ】整合 SpringBoot,实现工作队列、发布/订阅、路由和通配符模式

文章目录 工作队列模式引入依赖配置声明生产者代码消费者代码 发布/订阅模式引入依赖声明生产者代码发送消息 消费者代码运行程序 路由模式声明生产者代码消费者代码运行程序 通配符模式声明生产者代码消费者代码运行程序 工作队列模式 引入依赖 我们在创建 SpringBoot 项目的…

Python-92:最大乘积区间问题

问题描述 小R手上有一个长度为 n 的数组 (n > 0)&#xff0c;数组中的元素分别来自集合 [0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]。小R想从这个数组中选取一段连续的区间&#xff0c;得到可能的最大乘积。 你需要帮助小R找到最大乘积的区间&#xff0c;并输出这…

windows触摸板快捷指南

以下是结构化整理后的触控手势说明&#xff0c;采用清晰的层级划分和标准化表述&#xff1a; **触控手势操作规范****1. 单指操作****2. 双指操作****3. 三指操作****4. 四指操作** **优化说明&#xff1a;** 触控手势操作规范 1. 单指操作 手势功能描述等效操作单击滑动选择…

VSCode launch.json 配置参数详解

使用 launch.json 配置调试环境时&#xff0c;会涉及到多个参数&#xff0c;用于定义调试器的行为和目标执行环境。以下是一些常用的配置参数&#xff1a; 1、"type" &#xff1a;指定调试器的类型&#xff0c;例如 "node" 表示 Node.js 调试器&#xff0…

mAP、AP50、AR50:目标检测中的核心评价指标解析

在目标检测任务中&#xff0c;评价指标是衡量模型性能的核心工具。其中&#xff0c;mAP&#xff08;mean Average Precision&#xff09;、AP50&#xff08;Average Precision at IoU0.5&#xff09;和AR50&#xff08;Average Recall at IoU0.5&#xff09;是最常用的指标。本…