INA226模块驱动代码-STM32F103

模块:

平台:STM32F103C8T6

标准库

软件模拟IIC

C文件:

#include "ina226.h"

//delay
static void delay_nns(uint16_t D)  //30纳秒ns  根据手册要用到IIC的HS高速模式
{
    while(--D);
}

void delay_nms(uint16_t ms)  //毫秒
{
    uint16_t i;
    uint32_t M = 0;//720W
    for(i = 0;i < ms; i++)
    for(M=12000;M > 0;M--);
}

void delay_nus(uint16_t us)//微秒
{
    uint16_t i;
    uint16_t M = 0;//720W
    for(i = 0;i < us; i++)
    for(M=72;M > 0;M--);
}

//IIC

/****************IIC***************************/
void INA226_IIC_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(INA_SCL_RCC|INA_SDA_RCC, ENABLE);	/* 打开GPIO时钟 */
    
    GPIO_InitStructure.GPIO_Pin=INA_SCL_PIN;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  
    GPIO_Init(INA_SCL_GPIO_PORT, &GPIO_InitStructure);
	
	  GPIO_InitStructure.GPIO_Pin=INA_SDA_PIN;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  
    GPIO_Init(INA_SDA_GPIO_PORT, &GPIO_InitStructure);
    
    INA_SCL=1;
    INA_SDA=1;  
    delay_nms(5);
}
    
void INA226_IIC_Start(void)
{
    INA_SCL=1;
    INA_SDA=1;
    delay_nns(5);
     INA_SDA=0;//START:when CLK is high,DATA change form high to low 
    delay_nns(5);
    INA_SCL=0;;//钳住I2C总线,准备发送或接收数据 
    delay_nns(5);
}    

void INA226_IIC_Stop(void)
{
    INA_SDA=0;//STOP:when CLK is high DATA change form low to high
     delay_nns(5);
    INA_SCL=1; 
     delay_nns(5);
    INA_SDA=1;//发送I2C总线结束信号
    delay_nns(5);                                   
}

void INA226_IIC_Ack(void)
{
    INA_SDA=0;
    delay_nns(5);
    INA_SCL=1;
    delay_nns(5);
    INA_SCL=0;;
    delay_nns(5);
    INA_SDA=1;
}

void INA226_IIC_NAck(void)
{
    INA_SDA=1;
    delay_nns(5);
    INA_SCL=1;
delay_nns(5);
    INA_SCL=0;;
    delay_nns(5);
    INA_SDA=0;
}        

uint8_t INA226_IIC_Wait_Ack(void)
{
    uint8_t ucErrTime=0;
   
    INA_SDA=1;
    delay_nns(5);       
    INA_SCL=1;
    delay_nns(5);          
    
    while(READ_SDA)
    {
        ucErrTime++;
        if(ucErrTime>250)
        {
            INA226_IIC_Stop();
            return 1;
        }
    }
    INA_SCL=0;//时钟输出0        
    return 0;  
}

void INA226_IIC_Send_Byte(uint8_t txd)
{  int i;                           
   INA_SCL=0;;//拉低时钟开始数据传输
   for( i = 0;i < 8;i++)
    {              
        if(txd&0x80)
                    INA_SDA=1;
                else
                    INA_SDA=0;                
        txd<<=1;       
                
        INA_SCL=1;
        delay_nns(5);
        INA_SCL=0;
        delay_nns(5);
    }            
} 

uint8_t INA226_IIC_Read_Byte(unsigned char ack)
{
      uint8_t TData=0,i;
    for(i=0;i<8;i++)
    {
        INA_SCL=1;
        delay_nns(5);
        TData=TData<<1;
            if(READ_SDA)
        {
            TData|=0x01;
        }
        INA_SCL=0;;
        delay_nns(5);
    }
        if(!ack)
            INA226_IIC_NAck();
        else
            INA226_IIC_Ack();
    return TData;
}

/**********************IIC_END*************************/

void INA226_Init(void)
{
    INA226_IIC_Init();
    delay_nms(10);

    INA226_SendData(WRITE_ADDR,0x00,0x4727);//初始化结果采用64次平均值,全功能,连续模式
    INA226_SendData(WRITE_ADDR,0x05,0x200);//(当单位为mA时:0.002R=0xA00;0.01R=0x200);(上限8A)
}

void INA226_SendData(uint8_t addr,uint8_t reg,uint16_t data)
{
    uint8_t temp = 0;
    INA226_IIC_Start();
    INA226_IIC_Send_Byte(addr);
    INA226_IIC_Wait_Ack();
 
    INA226_IIC_Send_Byte(reg);
    INA226_IIC_Wait_Ack();
    
    temp = (uint8_t)(data>>8);
    INA226_IIC_Send_Byte(temp);
    INA226_IIC_Wait_Ack();
 
    temp = (uint8_t)(data&0x00FF);
    INA226_IIC_Send_Byte(temp);
    INA226_IIC_Wait_Ack();
    
    INA226_IIC_Stop();
}


void INA226_SetRegPointer(uint8_t addr,uint8_t reg)
{
    INA226_IIC_Start();
 
    INA226_IIC_Send_Byte(addr);
    INA226_IIC_Wait_Ack();
 
    INA226_IIC_Send_Byte(reg);
    INA226_IIC_Wait_Ack();
 
    INA226_IIC_Stop();
}


uint16_t INA226_ReadData(uint8_t addr)
{
    uint16_t temp=0;
    INA226_IIC_Start();
 
    INA226_IIC_Send_Byte(addr+1);
    INA226_IIC_Wait_Ack();
    
    temp = INA226_IIC_Read_Byte(1);
    temp<<=8;    
    temp |= INA226_IIC_Read_Byte(0);
    
    INA226_IIC_Stop();
    return temp;
}


uint16_t INA226_GetShuntCurrent(uint8_t addr)
{
    uint16_t temp=0;    
    INA226_SetRegPointer(addr,Current_Reg);
    temp = INA226_ReadData(addr);
//   if(temp&0x8000)    temp = ~(temp - 1);//保留符号留给读数函数处理
        return temp;
}
 
//获取 id
uint16_t  INA226_Get_ID(uint8_t addr)
{
    uint16_t temp=0;
    INA226_SetRegPointer(addr,ID_Reg);
    temp = INA226_ReadData(addr);
    return (uint16_t)temp;
}
 
//获取校准值
uint16_t INA226_GET_CAL_REG(uint8_t addr)
{    
    uint16_t temp=0;
    INA226_SetRegPointer(addr,Calib_Reg);
    temp = INA226_ReadData(addr);
    return temp;
}
 
//1.25mV/bit
uint16_t INA226_GetVoltage(uint8_t addr)
{
    uint16_t temp=0;
    INA226_SetRegPointer(addr,Bus_V_Reg);
    temp = INA226_ReadData(addr);
    return temp;    
}
 
 
 
//2.5uV/bit
uint16_t INA226_GetShuntVoltage(uint8_t addr)
{
	  uint16_t temp=0;
    INA226_SetRegPointer(addr,Shunt_V_Reg);
    temp = INA226_ReadData(addr);
    if(temp&0x8000)    temp = ~(temp - 1);    
    return temp;
}
 
//2.5mW/bit
uint16_t INA226_Get_Power(uint8_t addr)
{
    uint16_t temp=0;
    INA226_SetRegPointer(addr,Power_Reg);
    temp = INA226_ReadData(addr);
    return temp;
}

H文件

#ifndef INA226_H
#define INA226_H
#include "sys.h"

#define INA_SCL PBout(8)  //SCL引脚
#define INA_SDA PBout(9)  //SDA引脚

#define INA_SCL_GPIO_PORT	GPIOB			/* GPIO端口 */
#define INA_SCL_RCC 	      RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
#define INA_SCL_PIN		    GPIO_Pin_8			/* 连接到SCL时钟线的GPIO */

#define INA_SDA_GPIO_PORT	GPIOB			/* GPIO端口 */
#define INA_SDA_RCC 	      RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
#define INA_SDA_PIN		    GPIO_Pin_9			/* 连接到SDA数据线的GPIO */

#define READ_SDA GPIO_ReadInputDataBit(INA_SDA_GPIO_PORT,INA_SDA_PIN)

#define READ_ADDR         0x81	 	//A0=GND,A1=GND // R=1, W=0
#define WRITE_ADDR        0x80		//芯片IIC地址

#define Config_Reg        0x00		//模式配置寄存器
#define Shunt_V_Reg       0x01		//采样电阻压差;取值:2.5uV~81.92mV(0~7FFF)(10mΩ采样电阻下最大电流8A)
#define Bus_V_Reg         0x02		//BUS总线电压:1.25mV~40.96V(0~7FFF)
#define Power_Reg         0x03		//功率;Current_LSB * 25,FSR = 0xFFFF
#define Current_Reg       0x04		//电流;LSB = 0.02mA,FSR = 0x7FFF
#define Calib_Reg         0x05		//(当单位为mA时:采样电阻0.002R=0xA00;0.01R=0x200);写入Calibration Register的数据需要根据实际电路中的采样电阻阻值以及电流分辨率来设置
#define Mask_En_Reg       0x06		//
#define Alert_Reg         0x07		//
#define Man_ID_Reg        0xFE  	//0x5449
#define ID_Reg            0xFF  	//0x2260


void INA226_Init(void);
void INA226_SendData(uint8_t addr,uint8_t reg,uint16_t data);
uint16_t  INA226_Get_ID(uint8_t addr);
uint16_t INA226_GetShuntVoltage(uint8_t addr);
uint16_t INA226_GetShuntCurrent(uint8_t addr);
uint16_t INA226_GetVoltage(uint8_t addr);
uint16_t INA226_Get_Power(uint8_t addr);
#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/577309.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android Dalvik虚拟机JNI方法的注册过程分析

Dalvik虚拟机在调用一个成员函数的时候&#xff0c;如果发现该成员函数是一个JNI方法&#xff0c;那么就会直接跳到它的地址去执行。也就是说&#xff0c;JNI方法是直接在本地操作系统上执行的&#xff0c;而不是由Dalvik虚拟机解释器执行。由此也可看出&#xff0c;JNI方法是A…

欧科云链:为什么减半对比特币生态的影响正在逐步“减弱”?

出品&#xff5c;OKG Research 作者&#xff5c;Jason Jiang 欧科云链OKLink数据显示&#xff0c;比特币于区块高度840000&#xff08;北京时间2024年4月20日8:09&#xff09;成功完成第四次减半&#xff0c;比特币挖矿奖励正式由6.25BTC减少至3.125BTC。此次减半之后&#x…

微信小程序:11.本地生活小程序制作

开发工具&#xff1a; 微信开发者工具apifox进行创先Mock 项目初始化 新建小程序项目输入ID选择不使用云开发&#xff0c;js传统模版在project.private.config中setting配置项中配置checkinalidKey&#xff1a;false 梳理项目结构 因为该项目有三个tabbar所以我们要创建三…

Mysql_数据库事务

文章目录 &#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724 &#x1f389; 主题&#xff1a; MySQL__事务&#xff09; ⏱️ 创作时间&#xff1a;2024年04月26日 ———————————————— 这里写目…

STM32、GD32驱动SHT30温湿度传感器源码分享

一、SHT30介绍 1、简介 SHT30是一种数字湿度和温度传感器&#xff0c;由Sensirion公司生产。它是基于物理蒸发原理的湿度传感器&#xff0c;具有高精度和长期稳定性。SHT30采用I2C数字接口&#xff0c;可以直接与微控制器或其他设备连接。该传感器具有低功耗和快速响应的特点…

Pytorch 的神经网络 学习笔记

参照官方网址 Module — PyTorch 2.2 documentation 一. 介绍 1. torch.nn模块&#xff1a; torch.nn是PyTorch中专门用于构建神经网络的模块。它提供了构建深度学习模型所需的所有构建块&#xff0c;包括各种层类型&#xff08;如全连接层、卷积层、循环层等&#xff09;、…

笔记本硬盘坏了怎么把数据弄出来 笔记本硬盘数据恢复一般需要多少钱

现在办公基本都离不开笔记本电脑&#xff0c;就连学生写作业也大多是都在电脑上完成。硬盘作为电脑存储的重要组成部分&#xff0c;承载着存储文件和各类软件的重任。如果硬盘出现故障&#xff0c;基本上这台电脑就无法正常工作&#xff0c;同时我们可能面临丢失很多重要的数据…

js字符串方法总结_js 字符串方法(1)

var count0 var prosstr.indexOf(a) while(pros!-1) {countprosstr.indexOf(a,pros1) } console.log(count);3. chartAt() 返回指定位置的字符 根据下标获取字符var strabcdef console.log(str.charAt(2));4. lastIndexOf() 返回字符串字串出现的最后一处出现的位置索引 没有匹…

Hadoop之路

hadoop更适合在liunx环境下运行&#xff0c;会节省后期很多麻烦&#xff0c;而用虚拟器就太占主机内存了&#xff0c;因此后面我们将把hadoop安装到wsl后进行学习,后续学习的环境是Ubuntu-16.04 &#xff08;windows上如何安装wsl&#xff09; 千万强调&#xff0c;有的命令一…

架构师系列-Docker(一)-基础及MYSQL安装

轻量容器引擎Docker Docker是什么 Docker 是一个开源项目&#xff0c;诞生于 2013 年初&#xff0c;最初是 dotCloud 公司内部的一个业余项目。 它基于 Google 公司推出的 Go 语言实现&#xff0c;项目后来加入了 Linux 基金会&#xff0c;遵从了 Apache 2.0 协议&#xff0c;…

高级控件5-RecyclerView

与ViewPager类似的一个滑动的高级控件是RecyclerView&#xff0c;使用更加灵活。 第1步&#xff1a;添加依赖 打开mvn官网&#xff0c;检索recyclerview&#xff0c;选择使用人数较多的版本&#xff0c;复制依赖&#xff0c;放入项目中即可 快捷方法&#xff08;复制下面的代…

【Qt】信号与槽

1 &#x1f351;信号和槽概述&#x1f351; 在 Qt 中&#xff0c;用户和控件的每次交互过程称为⼀个事件。⽐如 “⽤⼾点击按钮” 是⼀个事件&#xff0c;“⽤⼾关闭窗⼝” 也是⼀个事件。每个事件都会发出⼀个信号&#xff0c;例如⽤⼾点击按钮会发出 “按钮被点击” 的信号&…

LabVIEW 2024安装教程(附免费安装包资源)

鼠标右击软件压缩包&#xff0c;选择“解压到LabVIEW.2024”。 返回解压后的文件夹&#xff0c;鼠标右击“ni_labview-2024”选择“装载”。 鼠标右击“Install”选择“以管理员身份运行”。 点击“我接受上述2条许可协议”&#xff0c;然后点击“下一步”。 点击“下一步”。 …

用例整体执行及pytest.ini文件

在我们写代码的过程中&#xff0c;一般都是右键或者命令行去执行一个用例 但是当我们写完后&#xff0c;需要整体执行一遍。那应该怎么搞呢&#xff1f; 我们可以在根目录下新建一个main.py或者run.py之类的文件&#xff0c;文件内容如下&#xff1a; if __name__ "__ma…

Stable Diffusion 常用放大算法详解

常用放大算法 图像放大算法大致有两种&#xff1a; 传统图像放大算法&#xff08;Lantent、Lanczos、Nearest&#xff09;AI图像放大算法&#xff08;4x-UltraSharp、BSRGAN、ESRGAN等&#xff09; 传统图像放大算法是基于插值算法&#xff0c;计算出图像放大后新位置的像素…

Redis 源码学习记录:字符串

redisObject Redis 中的数据对象 server/redisObject.h 是 Redis 对内部存储的数据定义的抽象类型其定义如下&#xff1a; typedef struct redisObject {unsigned type:4; // 数据类型&#xff0c;字符串&#xff0c;哈希表&#xff0c;列表等等unsigned encoding:4; …

微信小程序:9.小程序配置

全局配置文件 小程序根目录下的app.json文件是小程序的全局配置文件。 常用的配置文件如下: pages 记录当前小程序所有的页面存放路径信息 window 全局设置小程序窗口外观 tabBar 设置小程序底部的tabBar效果 style 是否启用新版style 小程序窗口的组成部分 了解windo节点常…

keytool,openssl的使用

写在前面 在生成公钥私钥&#xff0c;配置https时经常需要用到keytool&#xff0c;openssl工具&#xff0c;本文就一起看下其是如何使用的。 keytool是jdk自带的工具&#xff0c;不需要额外下载&#xff0c;但openssl需要额外下载 。 1&#xff1a;使用keytool生成jks私钥文件…

ArcGIS专题图制作—3D峡谷地形

6分钟教你在ArcGIS Pro中优雅完成炫酷的美国大峡谷3D地图 6分钟教你在ArcGIS Pro中优雅完成炫酷的美国大峡谷3D地图。 这一期的制图教程将带我们走入美国大峡谷&#xff0c;让我们一起绘制这张美妙的地图吧&#xff01;视频也上传到了B站&#xff0c;小伙伴可以去&#xff01; …

每日一题(力扣45):跳跃游戏2--贪心

由于题目已经告诉了我们一定可以跳到&#xff0c;所以我们只需去考虑前进最快的方法。即 判断当前下一步能跳的各个位置中&#xff0c;哪个能带你去去向最远的地方&#xff08;why&#xff1f; 因为其他位置所能提供的最大范围都没最远那个大&#xff0c;所以最远的那个已经可以…
最新文章