树莓派PICO使用INA226测量电流和总线电压(1)

news2024/11/15 20:47:09

        TI的INA226是一款不错的16位电流测量芯片,拥有非常高的性价比,而且测量精度能够覆盖我们大多数的应用场景,INA226的接线也比较简单,通过I2C读取数据会稍微麻烦一点。

        INA226可以在淘宝上直接买开发板,非常的便宜,我买的是100mΩ的版本,因为测试中测量的电压和电流并不是很高(3.3V总线电压和500mA最大测量电流),如果电流大,可以选择10mΩ的版本。

        测量的线路也非常简单,用PICO的3.3V输出电压作为INA226的Vcc输入并接到Vbus,将PICO的GND接到INA226的GND,同时接到IN-;Vbus接线到一个电位器中位,并将一端接到IN+;这样,3.3V输入电压通过电位器和采样电阻到地。剩下的就需要接I2C连线了,考虑到板子的距离(越短越好),我选择了PICO的pin 16和17作为I2C的接口。

        给测试板接上输入电源,简单的测量了一下各个位置的电压,没问题后,接上电脑开始写代码。

        在进行编程之前,我们有必要简单的了解一下如何从INA226获取数据,通过手册,我们得知,我们是通过I2C访问INA226的寄存器来获取测量数据,寄存器的编号和作用如下:

        在测量之前,必须先设置好两个寄存器,即0x01和0x05,第一个是配置寄存器,需要设置INA226的工作状态,第二个是校准寄存器,在校准寄存器设置之前,INA226是不会进行测量的。

        第一个配置寄存器需要设置4个参数,分别是采样平均次数,总线电压转换时间,分流器电压转换时间,还有操作模式。

        采样平均次数决定了采样的次数,并将这些值做平均处理,两个转换时间一个是针对Vbus,一个是针对Shunt Resistor,时间从140us到8244us不等,总的来讲,采样时间越长,得到的噪音越小,再加上平均次数,完成一次采样的时间是:平均次数 * ( 总线采样时间 + 分流器采样时间)。所以,需要用户自己针对自己的应用场景设置好这三个参数。

         第四个参数是工作模式:

        这个根据自己的需要选取,我选择的就是最后一个,连续测量Vbus和分流器。参数决定好之后,就可以设置0x01号寄存器了,寄存器参数组装的代码如下:


enum INA226_AVERAGE_TIMES
{
  IAT_1 = 0,
  IAT_4,
  IAT_16,
  IAT_64,
  IAT_128,
  IAT_256,
  IAT_512,
  IAT_1024,
  IAT_AMOUNT
};

enum INA226_CONVERSION_TIME
{
  ICT_140US,
  ICT_204US,
  ICT_332US,
  ICT_588US,
  ICT_1100US,
  ICT_2116US,
  ICT_4156US,
  ICT_8244US,
  ICT_AMOUNT
};

enum INA226_OPERATION_MODE
{
  IOM_POWER_DOWN_0,
  IOM_TRIGGERED_SHUNT_VOLTAGE,
  IOM_TRIGGERED_BUS_VOLTAGE,
  IOM_TRIGGERED_SHUNT_AND_BUS_VOLTAGE,
  IOM_POWER_DOWN_1,
  IOM_CONTINUOUS_SHUNT_VOLTAGE,
  IOM_CONTINUOUS_BUS_VOLTAGE,
  IOM_CONTINUOUS_SHUNT_AND_BUS_VOLTAGE,
  IOM_AMOUNT
};


uint16_t INA226Reset()
{
  return 0xC000;
}

uint16_t INA226Config(uint16_t average_times, uint16_t vbus_voltage_conversion_time, uint16_t shunt_voltage_conversion_time, uint16_t operation_mode)
{
    uint16_t result = 0x0400;
    average_times                 = min( average_times, IAT_1024 );
    vbus_voltage_conversion_time  = min( vbus_voltage_conversion_time,  ICT_8244US );
    shunt_voltage_conversion_time = min( shunt_voltage_conversion_time, ICT_8244US );
    operation_mode                = min( operation_mode, IOM_CONTINUOUS_SHUNT_AND_BUS_VOLTAGE );

    result = result | average_times << 9 | vbus_voltage_conversion_time << 6 | shunt_voltage_conversion_time << 3 | operation_mode;
    return result;
}

设置寄存器的代码如下:

#include "hardware/i2c.h"
#include "pico/binary_info.h"
#define I2C_SDA 16
#define I2C_SCL 17


void setup() 
{
    // put your setup code here, to run once:
    Serial.begin( 115200 );
    i2c_init( i2c_default, 100*1000 );
    gpio_set_function(I2C_SDA, GPIO_FUNC_I2C);
    gpio_set_function(I2C_SCL, GPIO_FUNC_I2C);
    gpio_pull_up(I2C_SDA);
    gpio_pull_up(I2C_SCL);
    bi_decl(bi_2pins_with_func(I2C_SDA, I2C_SCL,GPIO_FUNC_I2C));

    
    uint16_t config = INA226Config( IAT_4, ICT_588US, ICT_8244US, IOM_CONTINUOUS_SHUNT_AND_BUS_VOLTAGE );

    uint8_t data_1[3];
    data_1[0] = config_register;
    data_1[1] = config >> 8;
    data_1[2] = config & 0x00ff;    

    i2c_write_blocking(i2c_default, 0x40, data_1, sizeof(data_1), false );
}

        我使用的是PICO的SDK,代码稍微复杂点,首先是初始化 I2C,我们这儿使用I2C0,所以直接用i2c_default,并设置通讯速率是100K,如果是用I2C1,则只需要替换成 i2c1 就行了。PICO 已经定义了两个I2C通道:

extern i2c_inst_t i2c0_inst;
extern i2c_inst_t i2c1_inst;

#define i2c0 (&i2c0_inst) ///< Identifier for I2C HW Block 0
#define i2c1 (&i2c1_inst) ///< Identifier for I2C HW Block 1

#if !defined(PICO_DEFAULT_I2C_INSTANCE) && defined(PICO_DEFAULT_I2C)
#define PICO_DEFAULT_I2C_INSTANCE (__CONCAT(i2c,PICO_DEFAULT_I2C))
#endif

#ifdef PICO_DEFAULT_I2C_INSTANCE
#define i2c_default PICO_DEFAULT_I2C_INSTANCE
#endif

        然后就是分别设定16,17号脚的功能是I2C,拉高16, 17的电平,最后绑定16, 17号脚到I2C这个功能上。

        接下来就是选择参数,配置好平均次数,采样时间,模式等,得到一个uint16_t的值,这个值不能直接传递给INA226,因为I2C通讯传递的是大端数据,即高位在前(字节为单位),而PICO使用的是小端数据,所以,需要对数据进行一次位变换。传输的帧格式是:寄存器编号 + 大端数据,组装好数据帧就可以发送给INA226了。

        到此,第一步设置配置寄存器的工作就做好了,接下来还需要配置校准寄存器(参见 树莓派PICO使用INA226测量电流和总线电压(2))。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

本地部署,去除动漫图像背景Anime Remove Background

目录 摘要 引言 深度学习在动漫角色中的应用 1.​U-Net 2.Mask R-CNN 3.ISNet 模型 4.MODNet 模型 5.InSPyReNet 模型 本地部署 运行效果 测验结果​ Tip&#xff1a; 摘要 动漫图像背景去除是一项在图像处理和计算机视觉领域具有重要应用的技术&#xff0c;广泛应用于…

「Pytorch」roLabelImg 图像异常旋转 bug

在进行Yolo-obb 模型训练的时候需要标注旋转框&#xff0c;roLabelImg 是比较推荐的一款旋转框标注工具&#xff0c;既可以标注正常的矩形框&#xff0c;还可以标注旋转框 roLabelImg Github 地址&#xff1a;https://github.com/HumanSignal/labelImg 但是在使用过程中遇到了…

Word中使用LaTeX编辑公式

在日常学术写作过程中&#xff0c;公式输入必不可少。然而使用Word传统的公式编辑器往往无法满足高标准的排版要求&#xff0c;如排版不专业、编辑效率低、兼容性差等问题。LaTeX相比Word&#xff0c;在公式输入及排版方面更为强大&#xff0c;但是对于轻量级的任务&#xff0c…

Vivado 2020.1 HLS IP在BD模式无法生成问题

折腾了一周整整&#xff0c;记录一下&#xff0c;希望对大家有用。 各种找、各种操作&#xff0c;也问了FAE&#xff0c;都没搞定。 最后看到如下博文的方法3&#xff0c;管用。 vivado综合hls类ip核报错问题解决方案_vivado ip synth checkpoint mode-CSDN博客 报错描述 m…

Chatto企业AI助手产品技术拆解(上)

往期文章&#xff1a; AI智能客服项目拆解(1) 产品大纲 在上一篇文章中&#xff0c;我们详细介绍了AI智能客服的基本概念、需求分析、产品形态及分类&#xff0c;以及AI在线客服的用户体验流程和系统架构。为了更深入地理解AI智能客服的内在工作机制和技术实现&#xff0c;本…

【读论文】Instant Neural Graphics Primitives with a Multiresolution Hash Encoding

文章目录 1. What2. Why2.1 Introduction2.2 Related work and background 3. How: Multiresolution hash encoding3.1 Structure3.2 Input coordinate3.3 Hash mapping3.4 Interpolation3.5 Performance vs. quality3.6 Hash collision 4. Experiment on Nerf 1. What To red…

Pygame开发五子棋之人机对战游戏

引言 Pygame是一个基于Python的开源游戏开发库&#xff0c;它包含了丰富的多媒体功能&#xff0c;尤其是针对游戏开发所需的各种组件。如果你对游戏开发感兴趣&#xff0c;但又不想从底层开始编写所有东西&#xff0c;Pygame可以成为一个理想的起点。本文将介绍Pygame的基本概…

C++:类和对象 I(访问限定符、this指针)

目录 类的定义 类的大小 访问限定符 实例化 this指针 类的定义 class就是类&#xff0c;class是C中的一个关键字 当然类也可以是C语言中的struct&#xff0c;C兼容struct&#xff0c;甚至还有一些升级 定义类的方式 class Date {}; 和C语言的struct一样&#xff0c;c…

【信息收集】域名信息收集

域名介绍 域名&#xff08;Domain Name&#xff09;&#xff0c;简称域名、网域&#xff0c;是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称&#xff0c;用于在数据传输时标识计算机的电子方位&#xff08;有时也指地理位置&#xff09;。 DNS&#xf…

【Python】jupyter notebook平台的使用·

目录 一、安装Anaconda 二、 将BreadCancer.zip上传到jupyter notebook平台中 三、了解BreadCancerClassifier.ipynb文件在jupyter notebook的单元格中的python代码&#xff0c;并运行。 3.1 导入mainFun文件 3.2 读入数据 3.3 开始训练 3.4 读入测试数据 3.5 开始测试…

[笔记] SEW的振动分析工具DUV40A

1.便携式振动分析仪 DUV40A 文档编号&#xff1a;26871998/EN SEW是一家国际化的大型的机械设备供应商。产品线涵盖电机&#xff0c;减速机&#xff0c;变频器等全系列动力设备。DUV40A是他自己设计的一款振动分析工具。 我们先看一下它的软硬件参数&#xff1a; 内置两路传…

i7-13700K负载过高时出现无故自动重启(蓝屏问题)

现象&#xff1a;电脑无故自动重启&#xff0c;关闭故障自动重启后&#xff0c;发现系统蓝屏&#xff0c;然后需要手动重启。经测试&#xff0c;当CPU负载高时&#xff0c;就会有一定概率出现蓝屏。 配置&#xff1a;CPU为i7-13700K&#xff0c;系统为Win11 解决方法 现象刚…

Python那些优质可视化工具!

作者&#xff1a;Lty美丽人生 https://blog.csdn.net/weixin_44208569 本次分享10个适用于多个学科的Python数据可视化库&#xff0c;其中有名气很大的也有鲜为人知的&#xff01; 1、matplotlib 两个直方图 matplotlib 是Python可视化程序库的泰斗。经过十几年它任然是Pytho…

mitmproxy介绍及使用

mitmproxy介绍 mitmproxy又名中间人攻击代理&#xff0c;是一个抓包工具&#xff0c;类似于WireShark、Filddler&#xff0c;并且它支持抓取HTTP和HTTPS协议的数据包&#xff0c;只不过它是一个控制台的形式操作。另外&#xff0c;它还有两个非常有用的组件&#xff0c;一个mi…

漏扫处理:SSH弱算法问题解决

目录 漏洞说明解决方法1. 查看可用的算法2. 禁用弱算法3.检查ssh配置4.重启ssh服务5.ssh测试连接是否正常6.漏扫测试参考链接漏洞说明 通过漏扫得出,服务器SSH支持密钥交换算法,而此算法被认为是弱算法,存在高风险问题。 启用了以下弱算法: diffie-hellman-group-exchage…

前端JS特效第33波:jQuery旋转木马焦点图轮播插件PicCarousel

jQuery旋转木马焦点图轮播插件PicCarousel&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!doctype html> <html> <head> <meta charset"utf-8"> <meta http-equiv"X-UA-Compatible" content"IE…

Go 初始化一个字典

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Python量化交易学习——Part12:回归模型的典型应用

回归模型在很多的时候被应用于对股票的基本面数据进行分析&#xff0c;例如经典的CAPM模型、Fama-French三因子模型以及最新的PB_ROE模型等。这些都是已经应用于现实中的金融市场并获得较好收益的经典模型。本章将通过介绍PB_ROE模型&#xff0c;进一步讲解回归分析在实战过程中…

深入探讨【C++容器适配器】:现代编程中的【Stack与Queue】的实现

目录 一、Stack&#xff08;栈&#xff09; 1.1 Stack的介绍 1.2 Stack的使用 1.3 Stack的模拟实现 二、Queue&#xff08;队列&#xff09; 2.1 Queue的介绍 2.2 Queue的使用 2.3 Queue的模拟实现 三、容器适配器 3.1 什么是适配器 3.2 为什么选择deque作为stack和…

【web】-sql注入-login

根据网址提示打开如图&#xff1a; 查看源代码前台并没有过滤限制、扫描后台也没有发现特殊文件。看到标题显示flag is in database&#xff0c;尝试sql注入。 由于post,bp抓包如下&#xff1a; 运行python sqlmap.py -r 1.txt --dump 获取flag 42f4ebc342b6ed4af4aadc1ea75f…