標題:
INA226電流功率監(jiān)測器 MCU驅(qū)動代碼
[打印本頁]
作者:
user2402162
時間:
2023-4-17 16:13
標題:
INA226電流功率監(jiān)測器 MCU驅(qū)動代碼
分享這個芯片的驅(qū)動代碼。
C語言源程序如下:
#include "ina226.h"
INA226_DATA ina226_data0,ina226_data1;
void delay_nms(uint16_t ms) //毫秒
{
//根據(jù)不同芯片替換
}
void delay_nus(uint16_t us)//微秒
{
//根據(jù)不同芯片替換
}
void INA226_GPIO_Init(void){
/*
HS_HAL_GPIO_INIT_PARAM_S initParam;
initParam.pin = PIN_SCL;
initParam.mode = HS_HAL_GPIO_DUALDIRECT;
initParam.intType = HS_HAL_GPIO_INT_NONE;
initParam.pull = HS_HAL_GPIO_NOPULL;
initParam.func = GPIO;
HS_HAL_GPIO_Init(&initParam);
initParam.pin = PIN_SDA;
HS_HAL_GPIO_Init(&initParam);
根據(jù)不同芯片替換 */
IIC_SDA_H;
IIC_SCL_H;
delay_nms(5);
}
void INA226_IIC_Start(void){
IIC_SDA_H;
IIC_SCL_H;
delay_nus(2);
IIC_SDA_L;
delay_nus(2);
IIC_SCL_L;
}
void INA226_IIC_Stop(void){
IIC_SCL_L;
IIC_SDA_L;
delay_nus(2);
IIC_SCL_H;
delay_nus(2);
IIC_SDA_H;
}
u8 INA226_Wait_Ack(void){
u8 ucErrTime=0;
IIC_SDA_H;delay_nus(2);
IIC_SCL_H;delay_nus(2);
while(READ_SDA){
ucErrTime++;
if(ucErrTime > 250){
INA226_IIC_Stop();
return 1;
}
}
IIC_SCL_L;
return 0;
}
void INA226_Ack(void){
IIC_SCL_L;
IIC_SDA_L;
delay_nus(2);
IIC_SCL_H;
delay_nus(2);
IIC_SCL_L;
}
void INA226_NAck(void){
IIC_SCL_L;
IIC_SDA_H;
delay_nus(2);
IIC_SCL_H;
delay_nus(2);
IIC_SCL_L;
}
void INA226_Send_Byte(u8 tdata){
u8 t;
IIC_SCL_L;
for(t = 0;t < 8;t++){
if((tdata&0x80)>>7)
IIC_SDA_H;
else
IIC_SDA_L;
tdata <<= 1;
delay_nus(2);
IIC_SCL_H;
delay_nus(2);
IIC_SCL_L;
delay_nus(2);
}
}
u8 INA226_Read_Byte(u8 ack){
u8 i,res = 0;
IIC_SDA_H;
for(i = 0;i < 8;i++){
IIC_SCL_L;
delay_nus(2);
IIC_SCL_H;
res <<= 1;
if(READ_SDA)res++;
delay_nus(2);
}
if(!ack)
INA226_NAck();
else
INA226_Ack();
return res;
}
u16 INA226_ReadData(u8 reg_addr,u8 w_addr,u8 r_addr)
{
u16 reg_data=0;
u16 temp=0;
INA226_IIC_Start();
INA226_Send_Byte(w_addr);
if(INA226_Wait_Ack())return 0;
INA226_Send_Byte(reg_addr);
if(INA226_Wait_Ack())return 0;
INA226_IIC_Start();
INA226_Send_Byte(r_addr);
if(INA226_Wait_Ack())return 0;
reg_data= INA226_Read_Byte(1);
reg_data=(reg_data<<8)&0xFF00;
temp=INA226_Read_Byte(0);
INA226_IIC_Stop();
reg_data|=temp;
return reg_data;
}
u8 INA226_WriteData(u8 reg_addr,u16 reg_data,u8 w_addr)
{
u8 data_high=(u8)((reg_data&0xFF00)>>8);
u8 data_low=(u8)reg_data&0x00FF;
INA226_IIC_Start();
INA226_Send_Byte(w_addr);
if(INA226_Wait_Ack())return 0;
INA226_Send_Byte(reg_addr );
if(INA226_Wait_Ack())return 0;
INA226_Send_Byte(data_high);
if(INA226_Wait_Ack())return 0;
INA226_Send_Byte(data_low);
if(INA226_Wait_Ack())return 0;
INA226_IIC_Stop();
delay_nms(2);
return 1;
}
void INA226_Init(AVG_NUM_E avg_num,VBUS_CHANGE_TIME_E vbus_cnum,VSH_CHANGE_TIME_E vsh_cnum,OPERATION_MODE_E mode,u8 w_addr){
u16 config_reg_data = 0x4000;
config_reg_data |= (avg_num << 9);
config_reg_data |= (vbus_cnum << 6);
config_reg_data |= (vsh_cnum << 3);
config_reg_data |= mode;
printf("config = %x calib = %x\r\n",config_reg_data,CAL);
INA226_WriteData(CONFIG_REG, config_reg_data,w_addr);
INA226_WriteData(CALIB_REG, CAL,w_addr);
}
//mV
void Get_Bus_Vol(void){
ina226_data0.bus_v = (float)INA226_ReadData(BUS_V_REG,CHIP1_WRITE_ADDR,CHIP1_READ_ADDR) * 1.25;
ina226_data1.bus_v = (float)INA226_ReadData(BUS_V_REG,CHIP2_WRITE_ADDR,CHIP2_READ_ADDR) * 1.25;
}
//mV
void Get_Shunt_Vol(void){
ina226_data0.shunt_v = (float)INA226_ReadData(SHUNT_V_REG,CHIP1_WRITE_ADDR,CHIP1_READ_ADDR) * 2.5 * 0.001;
ina226_data1.shunt_v = (float)INA226_ReadData(SHUNT_V_REG,CHIP2_WRITE_ADDR,CHIP2_READ_ADDR) * 2.5 * 0.001 * 0.98;
if(ina226_data0.shunt_v > 81.92) ina226_data0.shunt_v = 0;
if(ina226_data1.shunt_v > 81.92) ina226_data1.shunt_v = 0;
}
//mA
void Get_Current(void){
ina226_data0.cur = (float)INA226_ReadData(CURRENT_REG,CHIP1_WRITE_ADDR,CHIP1_READ_ADDR) * CURRENT_LSB / 1000;
ina226_data1.cur = (float)INA226_ReadData(CURRENT_REG,CHIP2_WRITE_ADDR,CHIP2_READ_ADDR) * CURRENT_LSB / 1000 * 0.98 ; //0.98是校準
if(ina226_data1.cur > 16384) ina226_data1.cur = 0;
if(ina226_data0.cur > 16384) ina226_data0.cur = 0;
}
//mW
void Get_Power(void){
ina226_data0.power = (float)INA226_ReadData(POWER_REG,CHIP1_WRITE_ADDR,CHIP1_READ_ADDR)* CURRENT_LSB / 1000 * 25;
ina226_data1.power = (float)INA226_ReadData(POWER_REG,CHIP2_WRITE_ADDR,CHIP2_READ_ADDR)* CURRENT_LSB / 1000 * 25 * 0.98 ;
}
void testINA226(void){
Get_Bus_Vol();
Get_Shunt_Vol();
Get_Current();
Get_Power();
printf("bus_in_vol = %.3fV bus_out_vol = %.3fV\r\n",ina226_data0.bus_v/1000,ina226_data1.bus_v/1000);
printf("shunt_in_vol = %.2fmV shunt_out_vol = %.2fmV \r\n",ina226_data0.shunt_v,ina226_data1.shunt_v);
printf("cur_in = %.3fA cur_out = %.3fA \r\n",ina226_data0.cur/1000,ina226_data1.cur/1000);
printf("power_in = %.3fW power_out = %.3fW \r\n",ina226_data0.power/1000,ina226_data1.power/1000);
printf("eff = %f\%\r\n",ina226_data1.power/ina226_data0.power);
}
復(fù)制代碼
51hei.png
(4.01 KB, 下載次數(shù): 28)
下載附件
2023-4-17 17:21 上傳
上圖.c .h文件和pdf下載( 不含keil工程,大家自行移植到各MCU平臺):
INA226驅(qū)動.rar
(1.72 MB, 下載次數(shù): 110)
2023-4-17 16:13 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1