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…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
