当前位置: 首页 > news >正文

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&#xff1a; 1、 输入脚电压可以从 0V~26V,INA219 采用 3.3V/5V 供电. 2、 能够检测电流&#xff0c;电压和功率&#xff0c;INA219 内置基准器和乘法器使之能够直接以 A 为单位 读出电流值。 3、 16 位可编程地…...

FlinkSql-Temporal Joins-Lookup Join

说明 在 Flink SQL 中&#xff0c;Temporal Joins 是一种常见的数据关联操作&#xff0c;特别适用于处理包含时间维度的数据。Lookup Join 是 Temporal Joins 的一种类型&#xff0c;它允许将流数据与维表数据进行关联。使用场景如下&#xff1a; 实时维度关联&#xff1a; 当…...

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 包下载地址&#xff1a;https://github.com/alibaba/Sentinel/releases 或者点击 链接 直接跳转到下载页 进入链接下载你需要的版本 下载完毕&#xff08;我这里统一放在一个sentinel目录内&#xff09; 2、编写 Dockerfile 文件&#xff08;这里我不…...

第21章网络通信

Internet 提供了大量有用的信息&#xff0c;很少有人能在接触过Internet后拒绝它的诱惑。计算机网络实现了多台计算机间的互联&#xff0c;使得它们彼此之间能够进行数据交流。网络应用程序就是在已连接的不同计算机上运行的程序&#xff0c;这些程序借助于网络协议&#xff0c…...

一、运行时数据区域

根据 《Java 虚拟机规范》的规定&#xff0c;Java 虚拟机所管理的内存将会包括以下截个运行时数据区域&#xff0c;如图所示。 1、程序计数器 程序计数器是一块较小的内存空间&#xff0c;它可以看做是当前线程所执行的字节码的行号指示器。在 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

一个普通的窗体应用&#xff0c;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);函数返回值&#xff1a; 在父进程中&#xff0c;fork函数返回子进程的进程ID&#xff08;PID&…...

[ Linux Audio 篇 ] 音频开发入门基础知识

在短视频兴起的背景下&#xff0c;音视频开发越来越受到重视。接下来将为大家介绍音频开发者入门知识&#xff0c;帮助读者快速了解这个领域。 轻柔的音乐、程序员有节奏感的键盘声、嗡嗡的发动机、刺耳的手提钻……这些声音是如何产生的呢&#xff1f;又是如何传到我们耳中的…...

关于高校电子邮件系统开通双因素认证的经验分享-以清华大学为例

清华大学信息化技术中心 马云龙 作者简介: 马云龙,男,清华大学信息化技术中心高级工程师;Coremail管理员社区大咖嘉宾 深耕高校计算机网络/信息化/网络安全岗位20年,对大规模计算机网络及信息系统规划,开发/建设,运维有深刻体会。 目前,越来越多的高校/企业/政府机关…...

「Swift」类淘宝商品瀑布流展示

前言&#xff1a;需要做一个类似于淘宝商品页面的瀑布流展示 结构分析&#xff1a; ps&#xff1a;图片来源 思路分析&#xff1a; 该瀑布流主要还是基于UICollectionView进行展示&#xff0c;只是在cell展示的UICollectionViewFlowLayout需要进行相应调整和自定义&#xff…...

道可云会展元宇宙平台全新升级,打造3D沉浸式展会新模式

随着VR虚拟现实、人工智能、虚拟数字人等元宇宙技术的快速发展&#xff0c;各个行业正试图通过元宇宙技术寻求新的发展突破口&#xff0c;会展行业也不例外。会展作为经贸领域的重要产业形态&#xff0c;越来越多的企业和组织开始寻求通过元宇宙技术为展会赋能&#xff0c;以满…...

Ant Design Pro初始化报错

今天按照官网步骤初始化项目&#xff0c;第一次报错 fatal: unable to access https://github.com/ant-design/ant-design-pro/: SSL certificate problem: unable to get local issuer certificate 致命&#xff1a;无法访问https://github.com/ant-design/ant-design-pro/&…...

第16届中国R会议暨2023X-AGI大会开幕,和鲸科技分享ModelOps在数据科学平台中的实践与应用

11月25日&#xff0c;第 16 届中国 R 会议暨 2023 X-AGI 大会在在中国人民大学逸夫会堂拉开帷幕&#xff0c;本次会议由中国人民大学统计学院、中国人民大学应用统计科学研究中心、统计之都、原灵科技和中国商业统计学会人工智能分会&#xff08;筹&#xff09;主办&#xff0c…...

❀My学习Linux命令小记录(12)❀

目录 ❀My学习Linux命令小记录&#xff08;12&#xff09;❀ 46.arp指令 47.tcpdump指令 48.chmod指令 49.chown指令 50.bash调用脚本指令 shell介绍 shell脚本的组成部分 脚本执行方式 检查脚本语法 bash之变量 变量的种类&#xff1a;根据生效的范围不同来区分 …...

MySQL学习day05

DCL&#xff08;Data Control Language&#xff09;数据控制语言学习 作用&#xff1a;用来创建数据库用户、控制数据库的访问权限 1&#xff09;查询用户&#xff1a; use mysql; select * from user; 2&#xff09;创建用户&#xff1a; create user 用户名主机名 identifi…...

JAVA面试题7

1.Java中的ClassLoader是什么&#xff1f; 它有什么作用&#xff1f; 答案&#xff1a;ClassLoader是一种加载Java类文件的机制&#xff0c;可以从不同的来源加载类文件&#xff0c;如本地文件系统、网络等。ClassLoader可以帮助实现模块化开发和动态加载类等功能。 2.什么是J…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...