久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2586|回復: 0
收起左側

INA226電流功率監測器 MCU驅動代碼

[復制鏈接]
ID:277039 發表于 2023-4-17 16:13 | 顯示全部樓層 |閱讀模式
分享這個芯片的驅動代碼。

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. }
復制代碼
51hei.png

上圖.c .h文件和pdf下載( 不含keil工程,大家自行移植到各MCU平臺):
INA226驅動.rar (1.72 MB, 下載次數: 110)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 三级欧美| 91欧美精品 | 久久久www成人免费精品张筱雨 | 天天干天天干 | 91一区二区| 国产乱码一二三区精品 | 日本一区二区三区精品视频 | 一区二区三区国产精品 | 国内自拍视频在线观看 | 亚洲在线视频 | 一区二区三区影院 | 国产jizz女人多喷水99 | 亚洲国产欧美在线人成 | 在线观看国产视频 | 成人深夜小视频 | 一二三区av | 成人av片在线观看 | 波多野结衣精品 | 日韩视频区 | 亚洲美女一区 | 91久久国产综合久久91精品网站 | 中文字幕亚洲免费 | 免费精品视频一区 | 国产精品久久久久久久久久免费看 | 久久av一区二区三区 | 久久久久久久av麻豆果冻 | 中文字幕一区二区三区日韩精品 | 亚洲成人av | 日本一道本视频 | 免费不卡视频 | 福利片在线观看 | 国家aaa的一级看片 h片在线看 | 国产欧美一区二区精品忘忧草 | 青草青草久热精品视频在线观看 | 青青草精品 | 亚洲精品毛片av | 一本大道久久a久久精二百 国产成人免费在线 | 天堂av资源| 中文字幕在线观看一区 | 国产成人综合网 | 中文字幕高清免费日韩视频在线 |