INA226是一款分流/功率監視器,具有IPCTM或SMBUS兼容接口。該器件監視分流壓降和總線電源電壓。可編程校準值、轉換時間和取平均值功能與內部乘法器相結合,可實現電流值(單位為安培)和功率值(單位為瓦)的直接讀取。
INA226可在OV至36V的共模總線電壓范圍內感測電流,與電源電壓無關。該器件由一個2.7V至5.5V的單電源供電,電源電流典型值為330uA。該器件的額定工作溫度范圍為-40°C至125°C,PC兼容接口上具有多達16個可編程地址。
C文件
#define _LED_C_
#include "led.h"
#include "delay.h"
#include "system.h"
#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_4 //SCL引腳
#define IIC_SCL_H GPIO_SetBits(IIC_PORT,IIC_SCL) //拉高SCL
#define IIC_SCL_L GPIO_ResetBits(IIC_PORT,IIC_SCL) //拉低SCL
char time=5;
void INA_IIC_Delay()
{unsigned char x;
for(x=1;x>0;x--)
{
__NOP();__NOP();__NOP();__NOP();__NOP();
}
}
void INAInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = IIC_SDA | IIC_SCL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
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;i8;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;i8;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;
}
void INA226_SetRegPointer(u8 addr,u8 reg)
{
INA_IIC_Start();
INA_IIC_Send_Byte(addr);
INA_IIC_Send_Byte(reg);
INA_IIC_Stop();
}
void INA226_SendData(u8 addr,u8 reg,u16 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(addr); //發送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 INA226_Init(void)
{
INAInit();
DELAY_Ms(10);
INA226_SendData(INA226_ADDR1,CFG_REG,0x484f);//設置轉換時間204us,求平均值次數128,采樣時間204*128,設置模式為分流模式和總線連續模式
INA226_SendData(INA226_ADDR1,CAL_REG,0x0012);//設置分流電壓轉轉電流轉換參數
}
u16 INA226_ReadData(u8 addr)
{
u16 temp=0;
INA_IIC_Start();
INA_IIC_Send_Byte(addr+1);
temp = INA_IIC_Read_Byte();
temp<=8;
INA_IIC_ACK_Send(1);
temp |= INA_IIC_Read_Byte();
INA_IIC_ACK_Send(0);
INA_IIC_Stop();
return temp;
}
/*
u8 INA226_AlertAddr()
{
u8 temp;
IIC_Start();
IIC_Send_Byte(INA226_GETALADDR);
IIC_Wait_Ack();
temp = IIC_Read_Byte(1);
IIC_Stop();
return temp;
}
*/
//1mA/bit
u16 INA226_GetShunt_Current(u8 addr)
{
u16 temp=0;
INA226_SetRegPointer(addr,CUR_REG);
temp = INA226_ReadData(addr);
if(temp&0x8000) temp = ~(temp - 1);
return temp;
}
//?? id
u16 INA226_Get_ID(u8 addr)
{
u32 temp=0;
INA226_SetRegPointer(addr,INA226_GET_ADDR);
temp = INA226_ReadData(addr);
return (u16)temp;
}
//?????
u16 INA226_GET_CAL_REG(u8 addr)
{
u32 temp=0;
INA226_SetRegPointer(addr,CAL_REG);
temp = INA226_ReadData(addr);
return (u16)temp;
}
//1.25mV/bit
u16 INA226_GetVoltage(u8 addr)
{
u32 temp=0;
INA226_SetRegPointer(addr,BV_REG);
temp = INA226_ReadData(addr);
return (u16)temp;
}
//1.25mV/bit
u16 INA226_GeTCCC(u8 addr)
{
u32 temp=0;
INA226_SetRegPointer(addr,BV_REG);
temp = INA226_ReadData(addr);
return (u16)temp;
}
//2.5uV/bit,??????????,??????2.2?
u16 INA226_GetShuntVoltage(u8 addr)
{
int16_t temp=0;
INA226_SetRegPointer(addr,SV_REG);
temp = INA226_ReadData(addr);
if(temp&0x8000) temp = ~(temp - 1);
return (u16)temp;
}
u16 INA226_Get_Power(u8 addr)
{
int16_t temp=0;
INA226_SetRegPointer(addr,PWR_REG);
temp = INA226_ReadData(addr);
return (u16)temp;
}
void GetVoltage(float *Voltage)//mV
{
Voltage[0] = INA226_GetVoltage(INA226_ADDR1)*1.25f;
}
void Get_Shunt_voltage(float *Voltage)//uV
{
Voltage[0] = (INA226_GetShuntVoltage(INA226_ADDR1)*2.2);//?????????2.5
}
void Get_Shunt_Current(float *Current)//mA
{
Current[0] = (INA226_GetShunt_Current(INA226_ADDR1)* 2.5f);
}
void GetPower()//W
{
GetVoltage(&INA226_data.voltageVal); //mV
Get_Shunt_voltage(&INA226_data.Shunt_voltage); //uV
Get_Shunt_Current(&INA226_data.Shunt_Current); //mA
INA226_data.powerVal=INA226_data.voltageVal*0.001f * INA226_data.Shunt_Current*0.001f;
}
H文件
#ifndef __LED_H
#define __LED_H
// Files includes
#include
#include "mm32_device.h"
#include "hal_conf.h"
#define CFG_REG 0x00 //
#define SV_REG 0x01 //分流電壓,分流電阻為0.1歐姆
#define BV_REG 0x02 //總線電壓
#define PWR_REG 0x03 //電源功率
#define CUR_REG 0x04 //電流
#define CAL_REG 0x05 //校準,設定滿量程范圍以及電流功率測數
#define ONFF_REG 0x06 //屏蔽 使能
#define AL_REG 0x07 //警報功能的閾值
#define INA226_GET_ADDR 0XFF//唯一芯片識別號
#define INA226_ADDR1 0x80 //芯片地址
#define INA226_ADDR2 0x88 //芯片地址
#define CAL 456 //0.00512/(Current_LSB*R_SHUNT) = 470 //電流偏大改小
typedef struct
{
float voltageVal; //mV
float Shunt_voltage; //uV
float Shunt_Current; //mA
float powerVal;
}INA226;
void INA226_Init(void);
void INA226_SetRegPointer(u8 addr,u8 reg);
void INA226_SendData(u8 addr,u8 reg,u16 data);
u16 INA226_ReadData(u8 addr);
u16 INA226_Get_ID(u8 addr); //獲取ID
u16 INA226_GetVoltage( u8 addr); //獲取總線電壓
u16 INA226_GetShunt_Current(u8 addr); //獲取分流電壓
u16 INA226_GetShuntVoltage(u8 addr); //分流電壓
u16 INA226_Get_Power(u8 addr); //獲取功率
u16 INA226_GET_CAL_REG(u8 addr);
void GetVoltage(float *Voltage);
void Get_Shunt_voltage(float *Current);
void Get_Shunt_Current(float *Current);
//void Get_Power(float *Current);
void GetPower();//W
extern INA226 INA226_data;
#define Key4 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8) //RST
#define Key3 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5) //DOWN
#define Key2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6) //UP
#define Key1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7) //MODE
#define IN3 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define IN4 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4)
#define IN5 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5)
#define IN6 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)
#define IN7 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)
#define KEY8 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)
#define KEY9 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)
#define KEY10 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)
#define KEY11 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)
#define KEY12 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)
#endif
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
接口
+關注
關注
33文章
8526瀏覽量
150861 -
監視器
+關注
關注
1文章
780瀏覽量
33104 -
驅動程序
+關注
關注
19文章
827瀏覽量
47969 -
乘法器
+關注
關注
8文章
205瀏覽量
36984
發布評論請先 登錄
相關推薦
INA226讀取vbus電壓異常的原因?怎么解決?
BQ24610我在項目中使用了兩片ina226,一片用于監測BQ24610給電池充電時的電流和電池電壓,另一片用于檢測一路buck電路的輸入電壓及電流。原理圖如下
兩路ina226模塊掛載在同一
發表于 07-29 07:57
求助,INA226 I2C總線上的地址配置問題求解
我們的項目需要用到很多片INA226,現有的設計計劃安排1個I2C總線上掛12片INA226芯片,我們沒有這樣用過,有些擔心INA226芯片的A1和A0腳的配置影響I2C總線的通訊。 具體說就是
發表于 08-01 07:00
請問INA226怎么校準?校準寄存器應該寫入多少?
如圖使用INA226高端檢測,電流LSB是1MA,平均數16,連續檢測,校準寄存器為0xA00。電流顯示單位A,位數為00.00A,shunt電阻2mΩ,最大檢測電流20A。
在實際測試中,負載
發表于 08-02 07:49
自己搭的INA226的板子,怎么用官方的INA226EVM Software軟件調試?
我是自己搭的INA226的板子,怎么用官方的INA226EVM Software軟件調試,不知道板子怎么和電腦連接。
發表于 08-15 07:30
請問INA226是沒有辦法測量空載電流嗎?
INA226使用INA226做微安級電流檢測,使用低端檢測,在接負載時測量正常,而在空載時(斷開負載,IN+懸空,IN-接GND)出現異常測量,異常測量值為6.55mV左右,四路測量中兩路出現這樣的異常;
請問INA226是沒
發表于 08-16 06:04
請問ina226怎么測量-5v驅動電路的負電流?
設計電流計用到了ina226,結果發現電路只能測+5v驅動的模塊電流,-5v的電流無法驅動,有沒具體的負壓驅動的電流參考電路?
發表于 09-02 07:25
INA226模塊的相關資料推薦
筆者最近有個項目需要測量電流參數,于是買來INA226模塊測試一下。文章目錄應用電路程序設計模塊測試應用電路首先測試的INA226模塊如下圖所示。INA226模塊原理圖如下圖所示。官方
發表于 02-08 07:12
INA226 支持報警功能的 36V、雙向、超高精度、低側/高側、I2C 輸出電流/功率監控器
電子發燒友網為你提供TI(ti)INA226相關產品參數、數據手冊,更有INA226的引腳圖、接線圖、封裝手冊、中文資料、英文資料,INA226真值表,INA226管腳等資料,希望可以
發表于 11-02 18:03
STM32HAL庫硬件I2C驅動INA226保姆級教程
STM32HAL庫硬件I2C驅動INA226保姆級教程廢話不多說直接上代碼ina226.h/**@brief STM32 HAL Library for INA226 Curren
發表于 12-04 16:51
?141次下載
INA226使用之程序與模塊測試
筆者最近有個項目需要測量電流參數,于是買來INA226模塊測試一下。文章目錄應用電路程序設計模塊測試應用電路首先測試的INA226模塊如下圖所示。INA226模塊原理圖如下圖所示。官方
發表于 12-04 18:51
?149次下載
使用INA226/INA228監控AM263x MCU上的總線電壓和功率測量
電子發燒友網站提供《使用INA226/INA228監控AM263x MCU上的總線電壓和功率測量.pdf》資料免費下載
發表于 08-31 09:38
?2次下載
評論