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;}}	 
}

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

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

相关文章

《数字图像处理-OpenCV/Python》连载(50)非线性灰度变换

《数字图像处理-OpenCV/Python》连载&#xff08;50&#xff09;非线性灰度变换 本书京东优惠购书链接&#xff1a;https://item.jd.com/14098452.html 本书CSDN独家连载专栏&#xff1a;https://blog.csdn.net/youcans/category_12418787.html 第 7 章 图像的灰度变换 灰度变…

Unity | 渡鸦避难所-0 | 创建 URP 项目并导入商店资源

0 前言 知识点零零碎碎&#xff0c;没有目标&#xff0c;所以&#xff0c;一起做游戏吧 各位老师如果有什么指点、批评、漫骂、想法、建议、疑惑等&#xff0c;欢迎留言&#xff0c;一起学习 1 创建 3D&#xff08;URP&#xff09;项目 在 Unity Hub 中点击新项目&#xff…

【ESP32】手势识别实现笔记:红外温度阵列 | 双三次插值 | 神经网络 | TensorFlow | ESP-DL

目录 一、开发环境搭建与新建工程模板1.1、开发环境搭建与卸载1.2、新建工程目录1.3、自定义组件 二、驱动移植与应用开发2.1、I2C驱动移植与AMG8833应用开发2.2、SPI驱动移植与LCD应用开发2.3、绘制温度云图2.4、启用PSRAM&#xff08;可选&#xff09;2.5、画面动静和距离检测…

SSM框架详解:结构创建与注解应用

文章目录 1. 引言2. SSM框架项目结构创建2.1 目录结构2.2 说明 3. 注解的应用3.1 Controller3.2 Service3.3 Repository3.4 Autowired3.5 RequestMapping3.6 Select、Insert等 4. 结语 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢…

专业级音频处理 Logic Pro X 中文 for Mac

Logic Pro X是一款专业音频制作和音乐创作软件。它是Mac电脑上最受欢迎和广泛使用的音频工作站&#xff08;DAW&#xff09;。Logic Pro X提供了丰富的功能和工具&#xff0c;适用于音乐制作、录音、编辑、混音和音频处理等方面。以下是Logic Pro X软件的一些主要特点和功能&am…

怎么取消苹果订阅自动续费?分享3个可行方法!

在日常生活中&#xff0c;我们经常会使用到各种应用程序或服务&#xff0c;其中很多都提供了订阅自动续费的功能。然而&#xff0c;有时候用户可能会忘记取消订阅&#xff0c;从而导致不必要的扣费&#xff0c;给用户带来麻烦和困扰。 那么&#xff0c;对于使用苹果手机的小伙…

【JUC】十八、happens-before先行发生原则

文章目录 1、先行发生原则happens-before2、happens-before总原则3、8条happens-before规则4、案例 1、先行发生原则happens-before 在Java中&#xff0c;Happends-Before本质上是规定了一种可见性&#xff0c; A Happends-Before B&#xff0c;则A发生过的事情对B来说是可见的…

Discuz论坛自动采集发布软件

随着网络时代的不断发展&#xff0c;Discuz论坛作为一个具有广泛用户基础的开源论坛系统&#xff0c;其采集全网文章的技术也日益受到关注。在这篇文章中&#xff0c;我们将专心分享通过输入关键词实现Discuz论坛的全网文章采集&#xff0c;同时探讨采集过程中伪原创的发布方法…

.net-去重的几种情况

文章目录 前言1. int 类型的list 去重2. string类型的 list 去重3. T泛型 List去重4. 使用HashSet List去重5. 创建静态扩展方法 总结 前言 .net 去重的几种情况 1. int 类型的list 去重 // List<int> List<int> myList new List<int>(){ 100 , 200 ,100…

Selenium定位元素的方法css和xpath的区别!

selenium是一种自动化测试工具&#xff0c;它可以通过不同的定位方式来识别网页上的元素&#xff0c;如id、name、class、tag、link text、partial link text、css和xpath。 css和xpath是两种常用的定位方式&#xff0c;它们都可以通过元素的属性或者层级关系来定位元素&#…

Win10任务栏卡死?三个技巧,让你轻松应对!

windows 10作为广受欢迎的操作系统&#xff0c;为用户提供了强大的功能和友好的用户界面。然而&#xff0c;有时用户可能会面临任务栏卡死的问题&#xff0c;这不仅影响使用体验&#xff0c;还可能导致一系列其他问题。本文将深入介绍win10任务栏卡死的原因&#xff0c;并提供三…

【Linux】-信号-(信号的产生,保存,处理,以及os是怎么读取硬件的输入,硬件异常和coredump,定时器的原理简单的用户态和内核态的详细介绍)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

外贸B2B网站独立站建站(零基础全流程)

1.第一步是要先去买个域名&#xff1a; 一般做外贸的购买.com 后缀的国际域名就好&#xff0c;域名可以在阿里云&#xff0c;腾讯云等大的平台上购买&#xff0c;方法很简单&#xff08;但是在确定购买新的域名最好要分析下这个域名有没有被黑过&#xff0c;要不然后期对这个网…

【OpenGL】Clion配置

OpenGL简介 OpenGL&#xff08;Open Graphics Library&#xff09;是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像&#xff08;二维的亦可&#xff09;&#xff0c;是一个功能强大&#xff0c;调用方便的底层图形库。OpenGL是行业领域中…

JVS低代码按钮组件触发逻辑,打破传统功能界限

在现代应用开发中&#xff0c;按钮组件的功能不仅仅局限于触发页面上的简单动作&#xff0c;它更可以成为连接前后端数据交互的桥梁。当按钮被点击时&#xff0c;其背后可能隐藏着复杂的逻辑远程调用过程&#xff0c;这些过程旨在从远程服务器获取数据&#xff0c;并将这些数据…

微信怎么设置自动回复

微信作为一款广受欢迎的社交媒体平台&#xff0c;其聊天功能是非常重要的。许多用户都希望能够快速、自动地回复消息 首先&#xff0c;点击设置&#xff0c;选择机器人下面的自动通过好友 点击新增规则&#xff0c;设置你自动通过好友的时间段&#xff0c;自动通过好友的微信工…

LeetCode Hot100 3.无重复字符的最长子串

题目&#xff1a; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 代码&#xff1a; class Solution {public int lengthOfLongestSubstring(String s) {char[] arr s.toCharArray(); // 转换成 char[] 加快效率&#xff08;忽略带来的空间…

文章解读与仿真程序复现思路——太阳能学报EI\CSCD\北大核心《基于电力CPS联合仿真的主配一体化电网负荷转供方法研究》

这个标题涉及到电力系统、CPS&#xff08;Cyber-Physical Systems&#xff0c;即网络化物理系统&#xff09;联合仿真&#xff0c;以及主配一体化电网负荷转供方法的研究。让我们逐步解读&#xff1a; 基于电力CPS联合仿真&#xff1a; 基于电力&#xff1a; 指的是该研究与电力…

python-nmap库使用教程(Nmap网络扫描器的Python接口)(功能:主机发现、端口扫描、操作系统识别等)

文章目录 Python-nmap库使用教程前置条件引入python-nmap创建Nmap扫描实例执行简单的主机发现&#xff08;nmap -sn&#xff09;示例&#xff0c;我有一台主机配置为不响应 ICMP 请求&#xff0c;但使用nmap -sn&#xff0c;仍然能够探测到设备&#xff1a; 端口扫描扫描特定端…

AIGC实战——生成对抗网络(Generative Adversarial Network)

AIGC实战——生成对抗网络 0. 前言1. 生成对抗网络1.1 生成对抗网络核心思想1.2 深度卷积生成对抗网络 2. 数据集分析3. 构建深度卷积生成对抗网络3.1 判别器3.2 生成器3.3 DCGAN 模型训练 4. GAN 训练技巧4.1 判别器强于生成器4.2 生成器强于判别器4.3 信息量不足4.4 超参数 小…