INA219电流感应芯片_程序代码

news2024/9/21 18:55:29

详细跳转借鉴链接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地址s
	INA_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);	 	//串口初始化为115200
	LED_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;
		}
	}	 
}

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

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

相关文章

GPT-4 惨遭削弱;拼多多市值一度超阿里;雷军回应个人向武汉大学捐款 13 亿元丨 RTE 开发者日报 Vol.96

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有…

【Openstack Train安装】三、openstack安装

本文在所有节点安装openstack包&#xff0c;请确保按照以下教程完成了相关配置&#xff1a; 【Openstack Train安装】一、虚拟机创建 【Openstack Train安装】二、NTP安装 安装环境如下 VMware WorkstationV17.0本机系统win11虚拟机系统CentOS 7.5 openstack包含多个版本&…

传智杯第五届题解

B.莲子的机械动力学 分析&#xff1a;这题有个小坑&#xff0c;如果是00 0&#xff0c;结果记得要输出0。 得到的教训是&#xff0c;避免前导0出现时&#xff0c;要注意答案为0的情况。否则有可能会没有输出 #include<assert.h> #include<cstdio> #include<…

【神印王座】永恒之塔秘密透露,林鑫告白李馨,皓晨采儿甜蜜接吻

Hello,小伙伴们&#xff0c;我是拾荒君。 《神印王座》第83集如期而至&#xff0c;带来了令人期待已久的更新。与众多热情的观众一样&#xff0c;拾荒君一得到更新消息&#xff0c;便急不可耐地观赏起来。这一集中&#xff0c;龙皓晨随着月魔宫的月夜商队成功抵达联盟&#xf…

下载并安装anaconda和VScode,配置虚拟环境,并使用VScode运行代码

文章目录 前言软件下载Anaconda下载VScode下载 软件安装Anaconda安装Vscod安装 配置虚拟环境并运行代码Anaconda创建环境VScode使用&#xff0c;运行代码1. 打开代码所在文件夹2. 选择解释器3. 运行代码 总结 前言 运行python代码&#xff0c;需要2个软件如下&#xff1a; Ana…

漏洞扫描服务是什么

漏洞扫描服务是维护网络安全的重要一环。通过定期或实时的漏洞扫描&#xff0c;组织可以及时发现并修复可能存在的安全威胁&#xff0c;增强自身网络的安全性。在选择漏洞扫描服务时&#xff0c;需要明确自身的需求和目标&#xff0c;并选择合适的工具和服务提供商。只有这样&a…

TFIDF、BM25、编辑距离、倒排索引

TFIDF TF刻画了词语t对某篇文档的重要性&#xff0c;IDF刻画了词语t对整个文档集的重要性

MySQL数据库如何应对故障恢复与数据恢复回滚

一个最基本的数据库&#xff0c;应当可以做到以下几点 数据持久化&#xff0c;可以将数据保存到磁盘&#xff0c;服务重启数据依然存在。 可以按照某种关系存储数据&#xff0c;如果你用过IO流&#xff0c;那么你会发现整理数据也是一件复杂的事情。我是该追加写呢还是找到某条…

一文讲清楚Python流程控制语句

流程控制就是控制程序如何执行的方法&#xff0c;它适用于任何一门编程语言&#xff0c;其作用在于可以根据用户的需求决定程序执行的顺序。计算机在运行程序时有三种执行方法&#xff1a;第一种是顺序执行&#xff0c;自上而下顺序执行所有的语句&#xff0c;对应程序设计中的…

客户案例:EDLP助力金融行业打造高效数据防泄露体系

客户背景 某金融机构是一家以金融科技为核心&#xff0c;致力于为客户提供全方位、智能化、便捷化金融服务的综合性企业。公司总部位于南京&#xff0c;业务范围覆盖全国&#xff0c;拥有强大的技术研发团队和优秀的业务精英&#xff0c;为客户提供全方位的金融服务解决方案。 …

“最甜港姐”走的与众不同之路

网络图片 媒体最新报道&#xff0c;她被誉为“最甜港姐”&#xff0c;曾是TVB炙手可热的当红花旦&#xff0c;却在最当红的时候选择急流勇退。 她不是退圈去相夫教子&#xff0c;而是读书深造&#xff0c;成为一名专业律师。 前不久&#xff0c;又有消息传出&#xff0c;明年…

06_MySQL数据库高可用解决方案(MHA)

各位道友好&#xff0c;鼠鼠我呀校招刚通过了移动的面试 &#xff0c;但是安排的岗位是偏远县城里面的岗位&#xff0c;各位能给给建议吗&#xff1f;鼠鼠我啊真不想有时候变成销售员去卖产品&#xff01;&#xff01;&#xff01; 任务背景 一、真实案例 公司现在需要做MySQ…

docker集群的详解以及超详细搭建

文章目录 一、问题引入1. 多容器位于同一主机2. 多容器位于不同主机 二、介绍三、特性四、概念1. 节点nodes2. 服务(service)和任务(task)3. 负载均衡 五、docker网络1. overlay网络 六、docker集群搭建1. 环境介绍2. 创建集群3. 集群网络4. 加入工作节点 七、部署可视化界面po…

Python多线程优化:提升程序性能的实例

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是涛哥&#xff0c;今天为大家分享 Python多线程优化&#xff1a;提升程序性能的实例&#xff0c;全文5600字&#xff0c;阅读大约16钟。 多线程是一种有效的并发编程方式&#xff0c;能够提高程序的性能。本文…

基于Java SSM框架实现KTV点歌系统项目【项目源码+论文说明】

基于java的SSM框架实现KTV点歌系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个KTV点歌系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述KTV点歌系…

【模电】放大电路的性能指标

放大电路的性能指标 放大倍数输入电阻输出电阻通频带非线性失真系数最大不失真输出电压最大输出功率与效率 下图所示为放大电路的示意图。 对于信号而言&#xff0c;任何一个放大电路均可看成一个两端口网络。左边为输入端口&#xff0c;当内阻为 R s R\tiny s Rs的正弦波信号…

C语言练习记录(蓝桥杯练习)(小蓝数点)

目录 小蓝数点 第一题程序的输出结果是&#xff1f;: 第二题下面代码的执行结果是什么&#xff1f;: 第三题下面代码的执行结果是什么&#xff1f;: 第四题关于关系操作符说法错误的是&#xff1f;: 第五题对于下面代码段&#xff0c;y的值为&#xff1f; 第六题sum 21 …

Microsoft Expression Web - 网页布局

在本章中&#xff0c;我们将介绍网页的基本布局。在创建我们的网页布局之前&#xff0c;我们需要考虑我们的内容&#xff0c;然后设计我们希望如何呈现该内容&#xff0c;因为它是在我们的网站上可见的内容。 由我们如何呈现我们的内容&#xff0c;以便我们的观众找到我们的网…

人工智能概论

一、关键技术 人工智能包含了七项关键技术: 1. 机器学习: 机器学习是研究计算机怎样模拟或实现人类的学习行为&#xff0c;以获取新的知识或技能&#xff0c;重新组织已有的知识结构使之不断改善自身的性能&#xff0c;是人工智能技术的核心。 从学习模式划分&#xff0c;分…

Redis:主从复制

目录 概念配置步骤通过命令配置主从复制原理薪火相传反客为主哨兵(Sentinel)模式原理配置SpringBoot整合Sentinel模式 概念 主机更新后根据配置和策略&#xff0c;自动同步到备机的master/slave机制&#xff0c;Master以写为主&#xff0c;Slave以读为主。 作用&#xff1a; …