找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1518|回复: 0
打印 上一主题 下一主题
收起左侧

INA226电流功率监测器 MCU驱动代码

[复制链接]
跳转到指定楼层
楼主
分享这个芯片的驱动代码。

C语言源程序如下:
  1. #include "ina226.h"

  2. INA226_DATA ina226_data0,ina226_data1;

  3. void delay_nms(uint16_t ms)  //毫秒
  4. {
  5. //根据不同芯片替换
  6. }

  7. void delay_nus(uint16_t us)//微秒
  8. {
  9. //根据不同芯片替换
  10. }
  11. void INA226_GPIO_Init(void){

  12.     /*  
  13.     HS_HAL_GPIO_INIT_PARAM_S initParam;
  14.         
  15.     initParam.pin = PIN_SCL;
  16.     initParam.mode = HS_HAL_GPIO_DUALDIRECT;
  17.     initParam.intType = HS_HAL_GPIO_INT_NONE;
  18.     initParam.pull = HS_HAL_GPIO_NOPULL;
  19.     initParam.func = GPIO;
  20.     HS_HAL_GPIO_Init(&initParam);        


  21.     initParam.pin = PIN_SDA;
  22.     HS_HAL_GPIO_Init(&initParam);
  23.     根据不同芯片替换 */
  24.         
  25.     IIC_SDA_H;
  26.     IIC_SCL_H;  
  27.     delay_nms(5);        
  28. }


  29. void INA226_IIC_Start(void){
  30.         IIC_SDA_H;
  31.         IIC_SCL_H;
  32.         delay_nus(2);
  33.         IIC_SDA_L;
  34.         delay_nus(2);
  35.         IIC_SCL_L;
  36. }

  37. void INA226_IIC_Stop(void){
  38.         IIC_SCL_L;
  39.         IIC_SDA_L;
  40.         delay_nus(2);
  41.         IIC_SCL_H;
  42.         delay_nus(2);
  43.         IIC_SDA_H;
  44. }

  45. u8 INA226_Wait_Ack(void){
  46.         u8 ucErrTime=0;
  47.         IIC_SDA_H;delay_nus(2);
  48.         IIC_SCL_H;delay_nus(2);
  49.         while(READ_SDA){
  50.                 ucErrTime++;
  51.                 if(ucErrTime > 250){
  52.                         INA226_IIC_Stop();
  53.                         return 1;
  54.                 }
  55.         }
  56.         IIC_SCL_L;
  57.         return 0;
  58. }

  59. void INA226_Ack(void){
  60.         IIC_SCL_L;
  61.         IIC_SDA_L;
  62.         delay_nus(2);
  63.         IIC_SCL_H;
  64.         delay_nus(2);
  65.         IIC_SCL_L;
  66. }

  67. void INA226_NAck(void){
  68.         IIC_SCL_L;
  69.         IIC_SDA_H;
  70.         delay_nus(2);
  71.         IIC_SCL_H;
  72.         delay_nus(2);
  73.         IIC_SCL_L;
  74. }

  75. void INA226_Send_Byte(u8 tdata){
  76.         u8 t;
  77.         IIC_SCL_L;
  78.         for(t = 0;t < 8;t++){
  79.                 if((tdata&0x80)>>7)
  80.                         IIC_SDA_H;
  81.                 else
  82.                         IIC_SDA_L;
  83.                 tdata <<= 1;
  84.                 delay_nus(2);
  85.                 IIC_SCL_H;
  86.                 delay_nus(2);
  87.                 IIC_SCL_L;
  88.                 delay_nus(2);
  89.         }
  90. }

  91. u8 INA226_Read_Byte(u8 ack){
  92.         u8 i,res = 0;
  93.         IIC_SDA_H;
  94.         for(i = 0;i < 8;i++){
  95.                 IIC_SCL_L;
  96.                 delay_nus(2);
  97.                 IIC_SCL_H;
  98.                 res <<= 1;
  99.                 if(READ_SDA)res++;
  100.                 delay_nus(2);
  101.         }
  102.         if(!ack)
  103.                 INA226_NAck();
  104.         else        
  105.                 INA226_Ack();
  106.         return res;
  107. }

  108. u16 INA226_ReadData(u8 reg_addr,u8 w_addr,u8 r_addr)
  109. {
  110.         u16 reg_data=0;
  111.         u16 temp=0;
  112.         INA226_IIC_Start();
  113.         INA226_Send_Byte(w_addr);
  114.         if(INA226_Wait_Ack())return 0;
  115.         INA226_Send_Byte(reg_addr);   
  116.         if(INA226_Wait_Ack())return 0;
  117.         INA226_IIC_Start();
  118.         INA226_Send_Byte(r_addr);
  119.         if(INA226_Wait_Ack())return 0;
  120.         reg_data= INA226_Read_Byte(1);
  121.         reg_data=(reg_data<<8)&0xFF00;
  122.         temp=INA226_Read_Byte(0);
  123.         INA226_IIC_Stop();
  124.         reg_data|=temp;
  125.         return reg_data;
  126. }

  127. u8 INA226_WriteData(u8 reg_addr,u16 reg_data,u8 w_addr)
  128. {        
  129.         u8 data_high=(u8)((reg_data&0xFF00)>>8);
  130.         u8 data_low=(u8)reg_data&0x00FF;
  131.         INA226_IIC_Start();
  132.         INA226_Send_Byte(w_addr);   
  133.         if(INA226_Wait_Ack())return 0;
  134.         INA226_Send_Byte(reg_addr );   
  135.         if(INA226_Wait_Ack())return 0;        
  136.         INA226_Send_Byte(data_high);
  137.         if(INA226_Wait_Ack())return 0;        
  138.         INA226_Send_Byte(data_low);
  139.         if(INA226_Wait_Ack())return 0;                 
  140.         INA226_IIC_Stop();
  141.         delay_nms(2);
  142.         return 1;
  143. }

  144. 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){
  145.         u16 config_reg_data = 0x4000;
  146.         config_reg_data |= (avg_num << 9);
  147.         config_reg_data |= (vbus_cnum << 6);
  148.         config_reg_data |= (vsh_cnum << 3);
  149.         config_reg_data |= mode;
  150.         printf("config = %x calib = %x\r\n",config_reg_data,CAL);
  151.         INA226_WriteData(CONFIG_REG, config_reg_data,w_addr);
  152.         INA226_WriteData(CALIB_REG, CAL,w_addr);
  153. }

  154. //mV                                
  155. void Get_Bus_Vol(void){
  156.         ina226_data0.bus_v = (float)INA226_ReadData(BUS_V_REG,CHIP1_WRITE_ADDR,CHIP1_READ_ADDR) * 1.25;
  157.         ina226_data1.bus_v = (float)INA226_ReadData(BUS_V_REG,CHIP2_WRITE_ADDR,CHIP2_READ_ADDR) * 1.25;
  158. }
  159. //mV
  160. void Get_Shunt_Vol(void){
  161.         ina226_data0.shunt_v = (float)INA226_ReadData(SHUNT_V_REG,CHIP1_WRITE_ADDR,CHIP1_READ_ADDR) * 2.5 * 0.001;
  162.         ina226_data1.shunt_v = (float)INA226_ReadData(SHUNT_V_REG,CHIP2_WRITE_ADDR,CHIP2_READ_ADDR) * 2.5 * 0.001 * 0.98;
  163.         if(ina226_data0.shunt_v > 81.92) ina226_data0.shunt_v = 0;
  164.         if(ina226_data1.shunt_v > 81.92) ina226_data1.shunt_v = 0;
  165. }
  166. //mA
  167. void Get_Current(void){
  168.         ina226_data0.cur = (float)INA226_ReadData(CURRENT_REG,CHIP1_WRITE_ADDR,CHIP1_READ_ADDR) * CURRENT_LSB / 1000;
  169.         ina226_data1.cur = (float)INA226_ReadData(CURRENT_REG,CHIP2_WRITE_ADDR,CHIP2_READ_ADDR) * CURRENT_LSB / 1000 * 0.98 ; //0.98是校准
  170.         if(ina226_data1.cur > 16384) ina226_data1.cur = 0;
  171.         if(ina226_data0.cur > 16384) ina226_data0.cur = 0;
  172. }
  173. //mW
  174. void Get_Power(void){
  175.         ina226_data0.power = (float)INA226_ReadData(POWER_REG,CHIP1_WRITE_ADDR,CHIP1_READ_ADDR)* CURRENT_LSB / 1000 * 25;
  176.         ina226_data1.power = (float)INA226_ReadData(POWER_REG,CHIP2_WRITE_ADDR,CHIP2_READ_ADDR)* CURRENT_LSB / 1000 * 25 * 0.98 ;
  177. }

  178. void testINA226(void){
  179.         Get_Bus_Vol();
  180.         Get_Shunt_Vol();
  181.         Get_Current();
  182.         Get_Power();
  183.         printf("bus_in_vol = %.3fV  bus_out_vol = %.3fV\r\n",ina226_data0.bus_v/1000,ina226_data1.bus_v/1000);
  184.         printf("shunt_in_vol = %.2fmV shunt_out_vol = %.2fmV \r\n",ina226_data0.shunt_v,ina226_data1.shunt_v);
  185.         printf("cur_in = %.3fA  cur_out = %.3fA \r\n",ina226_data0.cur/1000,ina226_data1.cur/1000);
  186.         printf("power_in = %.3fW power_out = %.3fW \r\n",ina226_data0.power/1000,ina226_data1.power/1000);
  187.         printf("eff = %f\%\r\n",ina226_data1.power/ina226_data0.power);
  188. }
复制代码


上图.c .h文件和pdf下载( 不含keil工程,大家自行移植到各MCU平台):
INA226驱动.rar (1.72 MB, 下载次数: 83)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表