0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

INA219电流采集驱动

Harmony&嵌入式学习 来源:Harmony&嵌入式学习 作者:Harmony&嵌入式学 2023-07-17 09:23 次阅读

针对cortexm系列

wKgZomSzuPiAdIO1AAB5a5_A6mo512.png

INA219 是一款具备 I 2C 或 SMBUS 兼容接口的分流器 和功率监测计。该器件监测分流器电压降和总线电源电 压,转换次数和滤波选项可通过编程设定。可编程校准 值与内部乘法器相结合,支持直接读取电流值(单位: 安培)。通过附加乘法寄存器可计算功率(单位: 瓦)。I 2C 或 SMBUS 兼容接口 具有 16 个可编程地 址。

c文件

#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)得到实际的功率
}

H文件


#ifndef _INA219_H_
#define _INA219_H_
#include "stm32f10x.h"
#include "stdbool.h"
// I2C Address Options
/*
#define INA219_I2C_ADDRESS_CONF_0               (u8)(0x40 < < 1)     // A0 = GND, A1 = GND
#define INA219_I2C_ADDRESS_CONF_1               (u8)(0x41 < < 1)     // A0 = VS+, A1 = GND
#define INA219_I2C_ADDRESS_CONF_2               (u8)(0x42 < < 1)     // A0 = SDA, A1 = GND
#define INA219_I2C_ADDRESS_CONF_3               (u8)(0x43 < < 1)     // A0 = SCL, A1 = GND
#define INA219_I2C_ADDRESS_CONF_4               (u8)(0x44 < < 1)     // A0 = GND, A1 = VS+
#define INA219_I2C_ADDRESS_CONF_5               (u8)(0x45 < < 1)     // A0 = VS+, A1 = VS+
#define INA219_I2C_ADDRESS_CONF_6               (u8)(0x46 < < 1)     // A0 = SDA, A1 = VS+
#define INA219_I2C_ADDRESS_CONF_7               (u8)(0x47 < < 1)     // A0 = SCL, A1 = VS+
#define INA219_I2C_ADDRESS_CONF_8               (u8)(0x48 < < 1)     // A0 = GND, A1 = SDA
#define INA219_I2C_ADDRESS_CONF_9               (u8)(0x49 < < 1)     // A0 = VS+, A1 = SDA
#define INA219_I2C_ADDRESS_CONF_A               (u8)(0x4A < < 1)     // A0 = SDA, A1 = SDA
#define INA219_I2C_ADDRESS_CONF_B               (u8)(0x4B < < 1)     // A0 = SCL, A1 = SDA
#define INA219_I2C_ADDRESS_CONF_C               (u8)(0x4C < < 1)     // A0 = GND, A1 = SCL
#define INA219_I2C_ADDRESS_CONF_D               (u8)(0x4D < < 1)     // A0 = VS+, A1 = SCL
#define INA219_I2C_ADDRESS_CONF_E               (u8)(0x4E < < 1)     // A0 = SDA, A1 = SCL
#define INA219_I2C_ADDRESS_CONF_F               (u8)(0x4F < < 1)     // A0 = SCL, A1 = SCL
*/
#define INA219_ADDRESS  (0x40 < < 1)     // A0 = GND, A1 = GND

// 寄存器地址
#define INA219_REG_CONFIG                       (u8)(0x00)      // 模式配置寄存器 (R/W)
#define INA219_REG_SHUNTVOLTAGE                 (u8)(0x01)      // 分流电阻电压寄存器 (R)
#define INA219_REG_BUSVOLTAGE                   (u8)(0x02)      // 总线电压寄存器 (R)
#define INA219_REG_POWER                        (u8)(0x03)      // 功率寄存器 (R)
#define INA219_REG_CURRENT                      (u8)(0x04)      // 电流寄存器 (R)
#define INA219_REG_CALIBRATION                  (u8)(0x05)      // 基准值寄存器 (R/W)

//寄存器(0x01)参数定义
#define INA219_CONFIG_RESET                    (0x8000)  // Reset Bit

#define INA219_CONFIG_BVOLTAGERANGE_MASK       (0x2000)  // Bus Voltage Range Mask
#define INA219_CONFIG_BVOLTAGERANGE_16V        (0x0000)  // 0-16V Range
#define INA219_CONFIG_BVOLTAGERANGE_32V        (0x2000)  // 0-32V Range

#define INA219_CONFIG_GAIN_MASK                (0x1800)  // Gain Mask
#define INA219_CONFIG_GAIN_1_40MV              (0x0000)  // Gain 1, 40mV Range		//配置检测电阻上的最大检测电压
#define INA219_CONFIG_GAIN_2_80MV              (0x0800)  // Gain 2, 80mV Range
#define INA219_CONFIG_GAIN_4_160MV             (0x1000)  // Gain 4, 160mV Range
#define INA219_CONFIG_GAIN_8_320MV             (0x1800)  // Gain 8, 320mV Range

#define INA219_CONFIG_BADCRES_MASK             (0x0780)  // Bus ADC Resolution Mask
#define INA219_CONFIG_BADCRES_9BIT             (0x0080)  // 9-bit bus res = 0..511
#define INA219_CONFIG_BADCRES_10BIT            (0x0100)  // 10-bit bus res = 0..1023
#define INA219_CONFIG_BADCRES_11BIT            (0x0200)  // 11-bit bus res = 0..2047
#define INA219_CONFIG_BADCRES_12BIT            (0x0400)  // 12-bit bus res = 0..4097

#define INA219_CONFIG_SADCRES_MASK             (0x0078)  // Shunt ADC Resolution and Averaging Mask
#define INA219_CONFIG_SADCRES_9BIT_1S_84US     (0x0000)  // 1 x 9-bit shunt sample
#define INA219_CONFIG_SADCRES_10BIT_1S_148US   (0x0008)  // 1 x 10-bit shunt sample
#define INA219_CONFIG_SADCRES_11BIT_1S_276US   (0x0010)  // 1 x 11-bit shunt sample
#define INA219_CONFIG_SADCRES_12BIT_1S_532US   (0x0018)  // 1 x 12-bit shunt sample
#define INA219_CONFIG_SADCRES_12BIT_2S_1060US  (0x0048)	 // 2 x 12-bit shunt samples averaged together
#define INA219_CONFIG_SADCRES_12BIT_4S_2130US  (0x0050)  // 4 x 12-bit shunt samples averaged together
#define INA219_CONFIG_SADCRES_12BIT_8S_4260US  (0x0058)  // 8 x 12-bit shunt samples averaged together
#define INA219_CONFIG_SADCRES_12BIT_16S_8510US (0x0060)  // 16 x 12-bit shunt samples averaged together
#define INA219_CONFIG_SADCRES_12BIT_32S_17MS   (0x0068)  // 32 x 12-bit shunt samples averaged together
#define INA219_CONFIG_SADCRES_12BIT_64S_34MS   (0x0070)  // 64 x 12-bit shunt samples averaged together
#define INA219_CONFIG_SADCRES_12BIT_128S_69MS  (0x0078)  // 128 x 12-bit shunt samples averaged together

#define INA219_CONFIG_MODE_MASK                (0x0007)  // Operating Mode Mask
#define INA219_CONFIG_MODE_POWERDOWN           (0x0000)
#define INA219_CONFIG_MODE_SVOLT_TRIGGERED     (0x0001)
#define INA219_CONFIG_MODE_BVOLT_TRIGGERED     (0x0002)
#define INA219_CONFIG_MODE_SANDBVOLT_TRIGGERED (0x0003)
#define INA219_CONFIG_MODE_ADCOFF              (0x0004)
#define INA219_CONFIG_MODE_SVOLT_CONTINUOUS    (0x0005)
#define INA219_CONFIG_MODE_BVOLT_CONTINUOUS    (0x0006)
#define INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS (0x0007)	
//INA配置的参数
#define INA_R 0.1									//阻值大小(单位ohm)
#define INA_I_MAX	3								//硬件最大检测电流(单位:A)	INA219_CONFIG_GAIN_电压/INA_R
#define IAN_I_LSB	0.1							//(0x04)检测出值对应每位电流值	选择接近 = (INA_I_MAX/32767(2^15))*1000(为了得到单位为A)		(A)
#define INA_Power_LSB 2						//(0x03)检测出值对应每位功率值	= 20 * IAN_I_LSB	(MW)
#define INA_CAL 4096							//(0x05)寄存器基准值
//根据上面定义设置 配置寄存器(0x00)的值:0x3C1F
#define INA219_CONFIG_value	INA219_CONFIG_BVOLTAGERANGE_32V|INA219_CONFIG_GAIN_8_320MV|INA219_CONFIG_BADCRES_12BIT|INA219_CONFIG_SADCRES_12BIT_1S_532US|INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS


#define INA_INSIDE_IIC	//使用自带的io模拟iic
#ifdef INA_INSIDE_IIC	
		#define IIC_PORT	GPIOA																				//IIC IO端口
		#define IIC_RCC 	RCC_APB2Periph_GPIOA												//端口时钟
		#define IIC_SDA GPIO_Pin_5																		//SDA引脚
		#define IIC_SDA_H	GPIO_SetBits(IIC_PORT,IIC_SDA)							//拉高SDA
		#define IIC_SDA_L	GPIO_ResetBits(IIC_PORT,IIC_SDA)						//拉低SDA
		#define IIC_SDA_READ()	GPIO_ReadInputDataBit(GPIOA,IIC_SDA)	//读取SDA

		#define IIC_SCL GPIO_Pin_6																		//SCL引脚
		#define IIC_SCL_H	GPIO_SetBits(IIC_PORT,IIC_SCL)							//拉高SCL
		#define IIC_SCL_L	GPIO_ResetBits(IIC_PORT,IIC_SCL)						//拉低SCL
#endif

void INA_Init(void );
unsigned int INA_GET_Voltage_MV(void);//获取电压(单位:mv)
unsigned int INA_GET_Current_MA(void);//获取电流(单位:mA)
unsigned int INA_GET_Power_MW(void);	//获取当前功率(单位:mw)
unsigned int INA_GET_R_MV(void);
#endif



 

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117719
  • 接口
    +关注

    关注

    33

    文章

    7639

    浏览量

    148485
  • 电流采集
    +关注

    关注

    0

    文章

    3

    浏览量

    6512
收藏 人收藏

    评论

    相关推荐

    转:USB电流、电压监测仪

    上传主控芯片是atmel的Atmega32,USB监测仪的另一个核心是TI的具有I2C接口、高精度的零漂移、双向电流/电压监控芯片INA219INA219中文数据手册)。附件提供了USB监测仪的原理图、代码等资料。
    发表于 07-22 10:50

    有关INA219芯片的使用问题

    在使用TI 公司的INA219芯片进行电流,电压以及功率的数值进行测量时,遇到了如下几个问题1.只有先配置Calibration Register 才能检测到电流吗?如何精准的配置
    发表于 01-20 10:26

    请问INA219软件怎样读出eZdspC5535上INA219的数据?

    INA219软件 怎样读出eZdspC5535上INA219的数据?
    发表于 06-18 11:33

    用msp430f5529通过软件iic与ina219电源检测计通信,为什么接收不到ina219回复的低电平信号(从机无应答)?

    `用msp430f5529通过软件iic与ina219电源检测计通信,为什么接收不到ina219回复的低电平信号?使用的是msp430f5529launchpad,以及INA219电源检测计我把
    发表于 04-19 20:06

    如何去使用INA219零漂移双向电流/功率监测计呢

    INA219是什么?如何去使用INA219零漂移双向电流/功率监测计呢?
    发表于 10-15 06:54

    INA219电压电流表的资料分享

    描述电压电流INA219这真的是一个很酷的小设备,它不仅可以让你测量电流,还可以测量电压。通过一点乘法,您甚至可以测量功率。在电压方面,您可以直接超过 Arduino 5 伏的限制。事实上,您最多
    发表于 08-18 07:16

    INA219,pdf(Zerø-Drift,

    The INA219 is a high-side current shunt and power monitor with an I2C interface. The INA219
    发表于 09-24 23:17 57次下载

    INA219EVM User's Guide

    This user’s guide describes the characteristics, operation, and use of the INA219 evaluation module
    发表于 09-24 23:21 25次下载

    INA219 26V、双向、零漂移、低侧/高侧、I2C 输出电流/功率监控器

    电子发烧友网为你提供TI(ti)INA219相关产品参数、数据手册,更有INA219的引脚图、接线图、封装手册、中文资料、英文资料,INA219真值表,INA219管脚等资料,希望可以
    发表于 11-02 18:02
    <b class='flag-5'>INA219</b> 26V、双向、零漂移、低侧/高侧、I2C 输出<b class='flag-5'>电流</b>/功率监控器

    INA219电量监测芯片的使用经验和资料及使用步骤详细说明

    手册如上,INA219 是TI推出的具有I2C 接口的零漂移双向电流/功率监测计,INA219内部结构图如上,芯片同是支持差分分压电流检测跟总线电压检测
    的头像 发表于 09-08 11:37 6.9w次阅读

    ti公司ina219 i2c接口 stm32驱动文件

    可以通过采样电阻测量电流解决了霍尔元件测量小电流不精准的问题ina219.c:#include "ina219.h"#include "delay.h"
    发表于 12-04 18:51 25次下载
    ti公司<b class='flag-5'>ina219</b> i2c接口 stm32<b class='flag-5'>驱动</b>文件

    电压电流INA219开源项目

    电子发烧友网站提供《电压电流INA219开源项目.zip》资料免费下载
    发表于 07-29 10:42 23次下载
    电压<b class='flag-5'>电流</b>表<b class='flag-5'>INA219</b>开源项目

    INA219电流电压检测模块

    电子发烧友网站提供《INA219电流电压检测模块.zip》资料免费下载
    发表于 08-09 11:31 11次下载
    <b class='flag-5'>INA219</b><b class='flag-5'>电流</b>电压检测模块

    使用传感器INA219电流分流器和具有I2C或SMBUS的电源监控器

    电子发烧友网站提供《使用传感器INA219电流分流器和具有I2C或SMBUS的电源监控器.zip》资料免费下载
    发表于 11-16 11:36 2次下载
    使用传感器<b class='flag-5'>INA219</b><b class='flag-5'>电流</b>分流器和具有I2C或SMBUS的电源监控器

    隔离INA219模块开源分享

    电子发烧友网站提供《隔离INA219模块开源分享.zip》资料免费下载
    发表于 11-22 09:18 3次下载
    隔离<b class='flag-5'>INA219</b>模块开源分享