INA219电流感应芯片_程序代码
详细跳转借鉴链接INA219例程此处进行总结
简单介绍一下 INA219:
1、 输入脚电压可以从 0V~26V,INA219 采用 3.3V/5V 供电.
2、 能够检测电流,电压和功率,INA219 内置基准器和乘法器使之能够直接以 A 为单位
读出电流值。
3、 16 位可编程地址,有五个寄存器,有多种采样位数和采样方式供选择。
4、 INA219 能够感应电阻两端的最大电压范围为 VSHUNT= ±320mv.
5、 INA219 有两个地址引脚 A1A0 可以确定器件 I2C 地址(有 16 种)。
几个功能简单介绍
1、启动:可以上电启动或者通过 I2C 启动。
2、ADC 功能:
①可以对分流电阻两端的电压进行 ADC;
②可以对 Vin-进行 ADC;
③可以对采样位数,采样时间,采样方式进行设置。
3、PGA 功能:
①可以设置感应分流电压的范围(±40mv, ±80mv, ±160mv, ± 320mv);
②可以设置感应 bus 电压范围(16V 和 32V);
4、入滤波电路:在输入信号两端接 10R 电阻,两信号间接 0.1uF~1.0uF 这样可以滤除噪声,也有防静电功能(没有验证^),0R 电阻对ADC 精度没有影响。
5、简单电流检测 (不需要对配置寄存器设置): 上电默认 12 位 ADC,320mv 程32Vbus
电压,连续采样。这种检测电流是通过读电压来获取电流值。
计算部分
下图中的方程是功率寄存器的一般方程。数字设计师选择了5000倍,以获得INA219的良好范围。该因素反映了内部寄存器的数学计算

下面的公式显示了如何将总线电压寄存器转换为一个实际的模拟电压。它被代数地重新排列以供以后使用

下面的公式显示了如何将电流电压寄存器转换为一个实际的模拟电压。它被代数地重新排列以供以后使用。

下面的公式显示了如何将电流电压寄存器转换为一个实际的模拟电压。它被代数地重新排列以供以后使用。

将等式2、3、4替换为等式1。

简化


替换P = V*I

双方可取消的分母

代码部分
STM32标准库
#include "ina219.h"void INA_REG_Write(unsigned char reg,unsigned int data);#ifdef INA_INSIDE_IIC
void INA_IIC_Delay()
{unsigned char x;for(x=1;x>0;x--){__NOP();__NOP();__NOP();__NOP();__NOP();}
}
void INA_IIC_INIT(void) //IIC初始化
{GPIO_InitTypeDef GPIO_INIT;RCC_APB2PeriphClockCmd(IIC_RCC,ENABLE);GPIO_INIT.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_INIT.GPIO_Pin=IIC_SDA | IIC_SCL;GPIO_INIT.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(IIC_PORT,&GPIO_INIT);IIC_SDA_H;IIC_SCL_H;
}void INA_IIC_SDA_OUT(void) //SDA配置为输出
{GPIO_InitTypeDef GPIO_INIT;GPIO_INIT.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_INIT.GPIO_Pin=IIC_SDA ;GPIO_INIT.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(IIC_PORT,&GPIO_INIT);
}
void INA_IIC_SDA_IN(void) //SDA配置为输入
{GPIO_InitTypeDef GPIO_INIT;GPIO_INIT.GPIO_Mode=GPIO_Mode_IPU;GPIO_INIT.GPIO_Pin=IIC_SDA ;GPIO_INIT.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(IIC_PORT,&GPIO_INIT);
}void INA_IIC_Start(void) //开始信号
{IIC_SDA_H;IIC_SCL_H;INA_IIC_Delay();IIC_SDA_L;INA_IIC_Delay();IIC_SDA_L;
}
void INA_IIC_Stop(void ) //结束信号
{IIC_SDA_L;IIC_SCL_H;INA_IIC_Delay();IIC_SDA_H;INA_IIC_Delay();IIC_SCL_L;IIC_SCL_H;IIC_SDA_H;
}
bool INA_IIC_ACK_Read(void) //读取应答信号
{bool ack;IIC_SDA_H;INA_IIC_SDA_IN();IIC_SCL_H;INA_IIC_Delay();if(IIC_SDA_READ() == SET) ack=false;else ack=true;IIC_SCL_L;INA_IIC_SDA_OUT();return ack;
}
void INA_IIC_ACK_Send(bool ack) //发送应答信号
{IIC_SCL_L;if(ack == true) IIC_SDA_L;else IIC_SDA_H;IIC_SCL_H;INA_IIC_Delay();IIC_SCL_L;
}
void INA_IIC_Send_Byte(unsigned char byte) //IIC发送一位数据
{unsigned char i;IIC_SCL_L;for(i=0;i<8;i++){if(byte & 0x80 ) IIC_SDA_H;else IIC_SDA_L;IIC_SCL_H;INA_IIC_Delay();IIC_SCL_L;INA_IIC_Delay();byte<<=1;}INA_IIC_ACK_Read();
}
unsigned char INA_IIC_Read_Byte(void) //IIC读取一位数据
{unsigned char i,byte=0;INA_IIC_SDA_IN();for(i=0;i<8;i++){IIC_SCL_H;byte<<=1;if(IIC_SDA_READ() == SET) byte |= 0x01;else byte &= 0xFE;IIC_SCL_L;INA_IIC_Delay();}INA_IIC_SDA_OUT();return byte;
}
#endif
void INA_Read_Byte_s(unsigned char reg,unsigned char *data) //读两位数据
{INA_IIC_Start();INA_IIC_Send_Byte(INA219_ADDRESS); //发送INA219地址sINA_IIC_Send_Byte(reg);INA_IIC_Start();INA_IIC_Send_Byte(INA219_ADDRESS+0x01); //设置iic为读模式*data=INA_IIC_Read_Byte();data++;INA_IIC_ACK_Send(1);*data=INA_IIC_Read_Byte();INA_IIC_ACK_Send(0);INA_IIC_Stop();
}
void INA_REG_Write(unsigned char reg,unsigned int data) //写寄存器 测试成功
{unsigned char data_temp[2];data_temp[0]=(unsigned char )(data>>8);data_temp[1]=(unsigned char )(data & 0xFF);INA_IIC_Start();INA_IIC_Send_Byte(INA219_ADDRESS); //发送INA219地址INA_IIC_Send_Byte(reg); //发送寄存器地址INA_IIC_Send_Byte(data_temp[0]); //发送高8位数据data++;INA_IIC_Send_Byte(data_temp[1]) ; //发送低8位数据INA_IIC_Stop();
}void INA_Init(void )
{INA_IIC_INIT();INA_REG_Write(INA219_REG_CONFIG,INA219_CONFIG_value);INA_REG_Write(INA219_REG_CALIBRATION,INA_CAL);
}
unsigned int INA_GET_Voltage_MV(void) //获取电压(单位:mv)
{unsigned char data_temp[2];INA_Read_Byte_s(0x02,data_temp);return (int)((((data_temp[0]<<8)+data_temp[1]) >> 3)*4); //右移3为去掉:bit2,CNVR,OVF三位,再乘以 4MV (官方文档规定),得到当前总线的电压值
}
unsigned int INA_GET_Current_MA(void) //获取电流(单位:mA)
{unsigned char data_temp[2];INA_REG_Write(INA219_REG_CONFIG,INA219_CONFIG_value);INA_Read_Byte_s(INA219_REG_CURRENT,data_temp);return (int)((((data_temp[0]<<8)+data_temp[1]))*IAN_I_LSB); //得到寄存器的值在乘以每位对应的值(IAN_I_LSB)得到实际的电流
}
unsigned int INA_GET_Power_MW(void) //获取当前功率(单位:mw)
{unsigned char data_temp[2];INA_Read_Byte_s(INA219_REG_POWER,data_temp);return (int)(((data_temp[0]<<8)+data_temp[1])*INA_Power_LSB); //得到寄存器的值在乘以每位对应的值(INA_Power_LSB)得到实际的功率
}
主函数部分
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "usmart.h"
#include "24cxx.h"
#include "ina219.h"
#include "stdio.h"#define SIZE sizeof(TEXT_Buffer) //要写入到24c02的字符串数组
const u8 TEXT_Buffer[]={"Elite STM32 IIC TEST"};
unsigned int voltage_mv,Current_ma,Power_mw,R_mv;
float voltage_mv_float,
Current_ma_float,
Power_mw_float,
R_mv_float;int main(void){ u8 key;u16 i=0,mv=0;u8 datatemp[SIZE];delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级uart_init(115200); //串口初始化为115200LED_Init(); //初始化与LED连接的硬件接口INA_Init();while(1){delay_ms(100); voltage_mv=INA_GET_Voltage_MV(); //得到电压(mV)voltage_mv_float=(float)voltage_mv/1000; //转换为浮点型电压(V)Current_ma=INA_GET_Current_MA(); //得到电流(mA)Current_ma_float=(float)Current_ma; 得到浮点型电流(V)Power_mw=INA_GET_Power_MW();//得到功率(mW)Power_mw_float=(float)Power_mw;//得到浮点型功率(mW)printf("电压:%f\n",0.9963*(voltage_mv_float)+0.3047);printf("电流:%f\n",Current_ma_float);printf("功率:%f\n",Power_mw_float); i++;delay_ms(10);if(i==10){LED2=!LED2;//提示系统正在运行 i=0;}}
}
相关文章:
INA219电流感应芯片_程序代码
详细跳转借鉴链接INA219例程此处进行总结 简单介绍一下 INA219: 1、 输入脚电压可以从 0V~26V,INA219 采用 3.3V/5V 供电. 2、 能够检测电流,电压和功率,INA219 内置基准器和乘法器使之能够直接以 A 为单位 读出电流值。 3、 16 位可编程地…...
FlinkSql-Temporal Joins-Lookup Join
说明 在 Flink SQL 中,Temporal Joins 是一种常见的数据关联操作,特别适用于处理包含时间维度的数据。Lookup Join 是 Temporal Joins 的一种类型,它允许将流数据与维表数据进行关联。使用场景如下: 实时维度关联: 当…...
STM32之定时器
目录 1、定时器介绍 1.定时器工作原理 2.定时器的分类 3.通用定时器主要功能介绍 4.定时器计数模式 5.定时器时钟源 6.定时器溢出时间计算公式 2、定时器中断的实验 codeMX的配置 代码编写 1.使用到的HAL库函数 1.中断回调函数需要我们重写 2. 在中断模式下启动TIM…...
Canvas鼠标画线
鼠标按下开始画线,鼠标移动根据鼠标的轨迹去画,鼠标抬起停止画线 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…...
Docker 安装部署 Sentinel Dashboard
1、下载 jar 包 官方 jar 包下载地址:https://github.com/alibaba/Sentinel/releases 或者点击 链接 直接跳转到下载页 进入链接下载你需要的版本 下载完毕(我这里统一放在一个sentinel目录内) 2、编写 Dockerfile 文件(这里我不…...
第21章网络通信
Internet 提供了大量有用的信息,很少有人能在接触过Internet后拒绝它的诱惑。计算机网络实现了多台计算机间的互联,使得它们彼此之间能够进行数据交流。网络应用程序就是在已连接的不同计算机上运行的程序,这些程序借助于网络协议,…...
一、运行时数据区域
根据 《Java 虚拟机规范》的规定,Java 虚拟机所管理的内存将会包括以下截个运行时数据区域,如图所示。 1、程序计数器 程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。在 Java 虚拟机的概念模型里&#x…...
OCR原理解析
目录 1.概述 2.应用场景 3.发展历史 4.基于传统算法的OCR技术原理 4.1 图像预处理 4.1.1 灰度化 4.1.2 二值化 4.1.3 去噪 4.1.4 倾斜检测与校正 4.1.4.2 轮廓矫正 4.1.5 透视矫正 4.2 版面分析 4.2.1 连通域检测文本 4.2.2 MSER检测文本 4.3 字符切割 4.3.1 连…...
使用com组件编辑word
一个普通的窗体应用,6个button using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; u…...
国产Euler(欧拉)系统安装docker
国产的真™难用呀 生态又差还不开源 血泪经验 解压Docker安装包。 tar zxf docker-19.03.10.tgz 将解压后目录中的文件移动到“/usr/bin”下。 cp docker/* /usr/bin配置docker.service文件。 编辑docker.service文件。 vim /usr/lib/systemd/system/docker.service添加以…...
Linux 进程控制
文章目录 进程创建进程终止进程结果wait函数waitpid函数status参数 进程替换进程替换原理进程替换函数 补充/拓展 进程创建 fork函数 #include <unistd.h>pid_t fork(void);函数返回值: 在父进程中,fork函数返回子进程的进程ID(PID&…...
[ Linux Audio 篇 ] 音频开发入门基础知识
在短视频兴起的背景下,音视频开发越来越受到重视。接下来将为大家介绍音频开发者入门知识,帮助读者快速了解这个领域。 轻柔的音乐、程序员有节奏感的键盘声、嗡嗡的发动机、刺耳的手提钻……这些声音是如何产生的呢?又是如何传到我们耳中的…...
关于高校电子邮件系统开通双因素认证的经验分享-以清华大学为例
清华大学信息化技术中心 马云龙 作者简介: 马云龙,男,清华大学信息化技术中心高级工程师;Coremail管理员社区大咖嘉宾 深耕高校计算机网络/信息化/网络安全岗位20年,对大规模计算机网络及信息系统规划,开发/建设,运维有深刻体会。 目前,越来越多的高校/企业/政府机关…...
「Swift」类淘宝商品瀑布流展示
前言:需要做一个类似于淘宝商品页面的瀑布流展示 结构分析: ps:图片来源 思路分析: 该瀑布流主要还是基于UICollectionView进行展示,只是在cell展示的UICollectionViewFlowLayout需要进行相应调整和自定义ÿ…...
道可云会展元宇宙平台全新升级,打造3D沉浸式展会新模式
随着VR虚拟现实、人工智能、虚拟数字人等元宇宙技术的快速发展,各个行业正试图通过元宇宙技术寻求新的发展突破口,会展行业也不例外。会展作为经贸领域的重要产业形态,越来越多的企业和组织开始寻求通过元宇宙技术为展会赋能,以满…...
Ant Design Pro初始化报错
今天按照官网步骤初始化项目,第一次报错 fatal: unable to access https://github.com/ant-design/ant-design-pro/: SSL certificate problem: unable to get local issuer certificate 致命:无法访问https://github.com/ant-design/ant-design-pro/&…...
第16届中国R会议暨2023X-AGI大会开幕,和鲸科技分享ModelOps在数据科学平台中的实践与应用
11月25日,第 16 届中国 R 会议暨 2023 X-AGI 大会在在中国人民大学逸夫会堂拉开帷幕,本次会议由中国人民大学统计学院、中国人民大学应用统计科学研究中心、统计之都、原灵科技和中国商业统计学会人工智能分会(筹)主办,…...
❀My学习Linux命令小记录(12)❀
目录 ❀My学习Linux命令小记录(12)❀ 46.arp指令 47.tcpdump指令 48.chmod指令 49.chown指令 50.bash调用脚本指令 shell介绍 shell脚本的组成部分 脚本执行方式 检查脚本语法 bash之变量 变量的种类:根据生效的范围不同来区分 …...
MySQL学习day05
DCL(Data Control Language)数据控制语言学习 作用:用来创建数据库用户、控制数据库的访问权限 1)查询用户: use mysql; select * from user; 2)创建用户: create user 用户名主机名 identifi…...
JAVA面试题7
1.Java中的ClassLoader是什么? 它有什么作用? 答案:ClassLoader是一种加载Java类文件的机制,可以从不同的来源加载类文件,如本地文件系统、网络等。ClassLoader可以帮助实现模块化开发和动态加载类等功能。 2.什么是J…...
第08章 FastAPI 与 SSE 流式 RAG 后端
第08章 FastAPI 与 SSE 流式 RAG 后端 到目前为止,知识库、检索工具、MCP 客户端都已经就绪,但仍缺少一个面向最终用户的入口。本章用 FastAPI 把整条 RAG 链路串起来:接收前端发来的自然语言问题,调用 MCP 工具检索相关工单&…...
智能路由器项目解析:基于策略路由实现多线路流量智能调度
1. 项目概述:一个“聪明”的路由器能做什么?最近在GitHub上看到一个挺有意思的项目,叫smart-router,作者是c0nSpIc0uS7uRk3r。光看名字,你可能会觉得这又是一个关于家庭网络优化的工具,但点进去仔细研究后&…...
Arm Neoverse CMN-700 HN-F寄存器架构与缓存一致性配置详解
1. Arm Neoverse CMN-700 HN-F寄存器架构概述在现代SoC设计中,一致性互连网络(Coherent Mesh Network)是实现多核处理器高效协同工作的核心基础设施。作为Arm Neoverse平台的关键组件,CMN-700通过其独特的网格拓扑结构和分布式节点…...
构建轻量级LLM工具集:模块化设计、多模型集成与本地化部署实践
1. 项目概述:一个面向日常的轻量级LLM工具集最近在GitHub上闲逛,发现了一个挺有意思的项目,叫“Daily-LLM”。光看名字,你可能会觉得这又是一个庞大的、需要海量算力才能跑起来的“大模型”项目。但点进去仔细研究后,我…...
如何永久保存你的微信聊天记录?WeChatExporter开源工具完整指南
如何永久保存你的微信聊天记录?WeChatExporter开源工具完整指南 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾经历过手机丢失、微信重装后珍贵聊天…...
嵌入式动画优化:DMA驱动位图渲染在SAMD21上的实现
1. 项目概述与核心思路如果你玩过嵌入式开发,尤其是想在小小的微控制器屏幕上搞点流畅的动画,大概率会被“卡顿”和“闪屏”折磨过。传统的逐像素绘制,在需要全屏更新时,CPU时间几乎全耗在了等待屏幕刷新上,用户体验大…...
大语言模型可靠性监测与压缩的谱方法研究
1. 大语言模型可靠性监测与压缩的谱方法研究概述在深度学习领域,大语言模型(LLM)和视觉语言模型(VLM)的可靠性问题与计算效率挑战日益凸显。模型幻觉(生成与输入无关或错误的内容)和分布偏移(面对训练数据分布外的输入时性能下降)会严重损害用户信任,而庞…...
如何让Photoshop图层批量导出速度提升3倍?这个开源脚本做到了!
如何让Photoshop图层批量导出速度提升3倍?这个开源脚本做到了! 【免费下载链接】Photoshop-Export-Layers-to-Files-Fast This script allows you to export your layers as individual files at a speed much faster than the built-in script from Ado…...
MySQL-MVCC核心原理-版本链ReadView与可见性判断
MVCC 全称是 Multi-Version Concurrency Control,也就是多版本并发控制。它的核心思想是:为同一行数据维护多个版本,让读写在很多情况下不用互相阻塞。 没有 MVCC 时,读写冲突通常要大量依赖锁。MVCC 让普通 select 可以读一个可见…...
OPAL:基于OPA的实时策略数据分发与权限治理实践
1. 项目概述:什么是OPAL,以及它解决了什么核心痛点?如果你在负责一个微服务架构或者分布式系统的权限管理,大概率遇到过这样的场景:每次权限策略有更新,都需要重启服务、重新部署,或者等待一个漫…...
