【外设移植】Ai-WB2+INA266
Part.01 外设介绍
INA226是一款由德州仪器 (TI) 生产的高精度电流、功率和电压监控器。它用于监测电源系统中的电流、电压和功率,广泛应用于电源管理、电池管理系统、服务器、电动汽车等领域。以下是INA226的一些主要特点:
●功能概述
电流检测:INA226通过外部分流电阻来测量电流。分流电阻两端的电压差与流经它的电流成比例。
电压监测:可以直接监测电源侧的电压,最大输入电压范围可达36V。
功率计算:INA226内部集成了功率计算功能,通过测量电流和电压,实时计算功率。
I2C通信接口:通过I2C接口与微控制器通信,读取电压、电流和功率数据。
● 主要特点
高精度:电流检测的精度可达到±0.1%,电压测量的精度为±0.01%。
宽输入电压范围:INA226的输入电压可支持0V到36V,适合多种电源监测应用。
分辨率高:能够检测非常小的电压差(微伏级),使其能够通过低阻值分流电阻测量较大电流。
可编程警报:可以设置电压、电流或功率的报警阈值,当监测值超出设定范围时触发报警。
低功耗:静态电流非常低(通常为 420μA),适用于低功耗应用。
●工作原理
INA226使用外部的分流电阻,将流过负载的电流转化为分流电阻上的电压降。然后通过内部的放大器放大电压降,最终通过ADC(模数转换器)将其转化为数字信号,并通过I2C总线发送给微控制器。
同时,INA226可以直接测量电源电压。利用这些信息,它可以计算系统的功耗,帮助优化系统性能。
上述的INA226模块一共有8个接口,分别是IN+(电流+输入) IN-(电流-输出) VBS(测量电压) ALE(闹钟,警报,一般不用) SCL和SDA(I2C通讯)以及GND和VCC。
如果想使用这个模块需要正确的接线, 比如现在想测量通过三个LED灯的电流,需要将这三个LED灯串联在上述的电路中。LED灯的-极接 INA226的IN+,然后把IN-接到GND上。即可完成电流测量的接线。
如果想测量电压,只需要将VBS接入待测电压的+极即可。
Part.02 接线图如下
Part.03 移植过程
根据INA226数据手册得知,如果想读取INA226的数据的话,需要用IIC访问以下的寄存器。
而这里需要注意一点的是,如果要想读取电流的数据的话,一定要先校准INA226, 也就是往INA226的0x05寄存器中写入数据。
比如说现在期望读取的最大的电流为5A, 用5/2^15 可以得到电流的lowest significant bit (LSB) 然后使用上面的公式 0.00512 /(LSB * 分流电阻的阻值), 计算的结果大概等于335。换算到代码中则为以下:
// 初始化INA266传感器并设置校准值
static void ina266_init(hosal_i2c_dev_t *i2c)
{
uint16_t calibration_value = 335;
ina266_set_calibration(i2c, calibration_value);
}
完整的读取代码如下:
#include <stdio.h>
#include <FreeRTOS.h>
#include <task.h>
#include <hosal_i2c.h>
#include <bl_gpio.h>
#include <blog.h>
#define INA266_DEFAULT_ADDR 0x40 // INA266 I2C地址
#define INA266_REG_CURRENT 0x04 // INA266电流寄存器地址
#define INA266_REG_CALIBRATION 0x05 // INA266校准寄存器地址
#define INA266_REG_BUS_VOLTAGE 0x02 // INA266总线电压寄存器地址
// 设置INA266校准寄存器
static void ina266_set_calibration(hosal_i2c_dev_t *i2c, uint16_t calibration_value)
{
uint8_t data[3];
// 将校准值写入校准寄存器
data[0] = INA266_REG_CALIBRATION; // 校准寄存器地址
data[1] = (calibration_value >> 8) & 0xFF; // 高字节
data[2] = calibration_value & 0xFF; // 低字节
hosal_i2c_master_send(i2c, INA266_DEFAULT_ADDR, data, sizeof(data), 100);
}
// 初始化INA266传感器并设置校准值
static void ina266_init(hosal_i2c_dev_t *i2c)
{
uint16_t calibration_value = 335;
ina266_set_calibration(i2c, calibration_value);
}
// 读取INA266电流
static float ina266_read_current(hosal_i2c_dev_t *i2c)
{
uint8_t reg_addr = INA266_REG_CURRENT;
uint8_t data[2];
int16_t raw_current;
// 读取电流寄存器的数据
hosal_i2c_master_send(i2c, INA266_DEFAULT_ADDR, ®_addr, sizeof(reg_addr), 100);
hosal_i2c_master_recv(i2c, INA266_DEFAULT_ADDR, data, sizeof(data), 100);
// 将读取到的数据转换为电流值
raw_current = (data[0] << 8) | data[1];
// 使用新的LSB值 0.0001A 来计算电流
float current = raw_current * 0.000152; // 每个LSB 0.0001A
return current;
}
// 读取INA266电压
static float ina266_read_voltage(hosal_i2c_dev_t *i2c)
{
uint8_t reg_addr = INA266_REG_BUS_VOLTAGE;
uint8_t data[2];
int16_t raw_voltage;
// 读取电压寄存器的数据
hosal_i2c_master_send(i2c, INA266_DEFAULT_ADDR, ®_addr, sizeof(reg_addr), 100);
hosal_i2c_master_recv(i2c, INA266_DEFAULT_ADDR, data, sizeof(data), 100);
// 将读取到的数据转换为电压值
raw_voltage = (data[0] << 8) | data[1];
// INA266的电压值计算公式,假设每个Lsb对应1.25mV,具体数值参考数据手册
float voltage = raw_voltage * 0.00125; // 1.25mV per LSB
return voltage;
}
// 主函数
int main(void)
{
// I2C 设备配置
static hosal_i2c_dev_t i2c0 = {
.config = {
.address_width = HOSAL_I2C_ADDRESS_WIDTH_7BIT, // 7位I2C地址模式
.freq = 50000, // 50kHz I2C速率
.mode = HOSAL_I2C_MODE_MASTER, // 主模式
.scl = 12, // SCL连接到GPIO 12
.sda = 3, // SDA连接到GPIO 3
},
.port = 0, // I2C端口号
};
hosal_i2c_init(&i2c0); // 初始化I2C
ina266_init(&i2c0); // 初始化INA266传感器并设置校准值
for (;;)
{
// 读取电流数据
float current = ina266_read_current(&i2c0);
blog_info("Current: %.3f A\r\n", current);
// 读取电压数据
float voltage = ina266_read_voltage(&i2c0);
blog_info("Voltage: %.3f V\r\n", voltage);
vTaskDelay(portTICK_RATE_MS * 500); // 延时1秒,进入下一次测量
}
return 0;
}
实验现象:
那么根据实际情况,加上对UT89XD的测量,电压的误差大概在0.1v电流的误差大概在0.06MA。
库文件
main.c
#include <stdio.h>
#include <FreeRTOS.h>
#include <task.h>
#include <hosal_i2c.h>
#include <bl_gpio.h>
#include <blog.h>
#include "ina226.h"
// 主函数
int main(void)
{
// I2C 设备配置
static hosal_i2c_dev_t i2c0 = {
.config = {
.address_width = HOSAL_I2C_ADDRESS_WIDTH_7BIT, // 7位I2C地址模式
.freq = 50000, // 50kHz I2C速率
.mode = HOSAL_I2C_MODE_MASTER, // 主模式
.scl = 12, // SCL连接到GPIO 12
.sda = 3, // SDA连接到GPIO 3
},
.port = 0, // I2C端口号
};
hosal_i2c_init(&i2c0); // 初始化I2C
ina266_init(&i2c0); // 初始化INA266传感器并设置校准值
for (;;)
{
// 读取电流数据
float current = ina266_read_current(&i2c0);
blog_info("Current: %.3f A\r\n", current);
// 读取电压数据
float voltage = ina266_read_voltage(&i2c0);
blog_info("Voltage: %.3f V\r\n", voltage);
vTaskDelay(portTICK_RATE_MS * 500); // 延时1秒,进入下一次测量
}
return 0;
}
ina226.c
#include "ina226.h"
// 设置INA266校准寄存器
void ina266_set_calibration(hosal_i2c_dev_t *i2c, uint16_t calibration_value)
{
uint8_t data[3];
// 将校准值写入校准寄存器
data[0] = INA266_REG_CALIBRATION; // 校准寄存器地址
data[1] = (calibration_value >> 8) & 0xFF; // 高字节
data[2] = calibration_value & 0xFF; // 低字节
hosal_i2c_master_send(i2c, INA266_DEFAULT_ADDR, data, sizeof(data), 100);
}
// 初始化INA266传感器并设置校准值
void ina266_init(hosal_i2c_dev_t *i2c)
{
uint16_t calibration_value = 335;
ina266_set_calibration(i2c, calibration_value);
}
// 读取INA266电流
float ina266_read_current(hosal_i2c_dev_t *i2c)
{
uint8_t reg_addr = INA266_REG_CURRENT;
uint8_t data[2];
int16_t raw_current;
// 读取电流寄存器的数据
hosal_i2c_master_send(i2c, INA266_DEFAULT_ADDR, ®_addr, sizeof(reg_addr), 100);
hosal_i2c_master_recv(i2c, INA266_DEFAULT_ADDR, data, sizeof(data), 100);
// 将读取到的数据转换为电流值
raw_current = (data[0] << 8) | data[1];
// 使用新的LSB值 0.0001A 来计算电流
float current = raw_current * 0.000152; // 每个LSB 0.0001A
return current;
}
// 读取INA266电压
float ina266_read_voltage(hosal_i2c_dev_t *i2c)
{
uint8_t reg_addr = INA266_REG_BUS_VOLTAGE;
uint8_t data[2];
int16_t raw_voltage;
// 读取电压寄存器的数据
hosal_i2c_master_send(i2c, INA266_DEFAULT_ADDR, ®_addr, sizeof(reg_addr), 100);
hosal_i2c_master_recv(i2c, INA266_DEFAULT_ADDR, data, sizeof(data), 100);
// 将读取到的数据转换为电压值
raw_voltage = (data[0] << 8) | data[1];
// INA266的电压值计算公式,假设每个Lsb对应1.25mV,具体数值参考数据手册
float voltage = raw_voltage * 0.00125; // 1.25mV per LSB
return voltage;
}
ina226.h
#include <hosal_i2c.h>
#include <bl_gpio.h>
#define INA266_DEFAULT_ADDR 0x40 // INA266 I2C地址
#define INA266_REG_CURRENT 0x04 // INA266电流寄存器地址
#define INA266_REG_CALIBRATION 0x05 // INA266校准寄存器地址
#define INA266_REG_BUS_VOLTAGE 0x02 // INA266总线电压寄存器地址
// 初始化INA266传感器并设置校准值
void ina266_init(hosal_i2c_dev_t *i2c);
// 初始化INA266传感器并设置校准值
void ina266_set_calibration(hosal_i2c_dev_t *i2c, uint16_t calibration_value);
// 读取INA266电流
float ina266_read_current(hosal_i2c_dev_t *i2c);
// 读取INA266电压
float ina266_read_voltage(hosal_i2c_dev_t *i2c);
- |
- +1 赞 0
- 收藏
- 评论 0
本文由雪飘梦飞转载自安信可科技公众号,原文标题为:【外设移植】Ai-WB2+INA266,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
相关研发服务和供应服务
相关推荐
【经验】安信可双频Wi-Fi+蓝牙SoC模组BW16如何搭建Arduino开发环境?
安信可BW16模组是基于 RTL8720DN开发的双频Wi-Fi+蓝牙SoC模组,具备超强性能。本文着重介绍BW16及开发板如何搭建Arduino开发环境。
设计经验 发布时间 : 2023-06-10
M61/M62系列单模组烧录指导(未引出BOOT脚位的情况下)
为了解决M61和M62模组在未引出BOOT引脚下的二次烧录问题,本文提供了详细教程。需要使用支持波特率至2M的USB转TTL工具和上位机软件1.9.0版本。接线时可省略BOOT线,只需连接四条线。操作步骤包括打开软件、选择固件、插上模组、刷新串口并点击烧录。若无法烧录,需检查串口芯片支持情况及接线是否正确。此方法仅适用于安信可AT固件更新,自行开发需引出BOOT引脚。
设计经验 发布时间 : 2024-10-28
打卡智能家居之旅(2):设备接入HomeAssistant的方法
上次我们在安装HomeAssistant的时候(打卡智能家居学习之旅(1):了解HomeAssistant),顺便把MQTT 集成安装好了。为什么要装MQTT 集成呢?Wi-Fi 设备(Ai-WB2 或者Ai-M6x等模组)接入服务器必定要使用网络协议,而MQTT 是这些网络协议中最常用的。本文介绍了如何将设备接入HomeAssistant的方法。
设计经验 发布时间 : 2024-07-06
【经验】Ai-WB2系列模组AT固件使用教程
Ai-WB2系列模组AT固件使用教程:1.准备工作需要准备的软硬件:Ai-WB2系列模组或者开发板,Type-C数据线,安信可透传云服务器,连接为http://tt.ai-thinker.com/ttcloud2.连接路由器等。
设计经验 发布时间 : 2023-02-03
【IC】安信可科技发布2款UWB模组BU03和BU04,实现室内厘米级高精度测距定位
BU03和BU04这两款定位模组使用的芯片都是一样的,不同的是BU03是没有带主控MCU的,并且体积小巧,可以集成到自己的主板上,用主芯片直接驱动。
产品 发布时间 : 2024-10-11
Ai-BS21系列烧录指导——开发板or模组
本篇以Ai-BS21-32S_Kit为例指导烧录固件,这是由深圳市安信可科技有限公司开发的蓝牙星闪开发板。该模块核心处理器芯片Hi2821是一款高集成2.4GHzSoCBLE&SLE芯片,支持BLE5.4/SLE1.0,集成RF电路,RF包含功率放大器PA、低噪声放大器、TX/RXSwitch、集成电源管理等模块,支持1M/2M/4M3种带宽,最大支持12Mbit/s速率。
设计经验 发布时间 : 2024-06-24
安信可WiFi+BLE蓝牙双模模组Ai-WB2系列:高性价比物联网解决方案
安信可Ai-WB2系列模组支持Wi-Fi 802.11b/g/n协议和BLE 5.0协议,集成Wi-Fi、传统蓝牙和低功耗蓝牙功能。且经过行业“双85”测试,产品可靠性稳定性很强,可广泛应用于物联网(IoT)、移动设备、可穿戴电子设备、智能家居等领域。
器件选型 发布时间 : 2024-09-06
安信可BW20双频Wi-Fi+BLESoC模组,自带BLE5.0蓝牙,可支持Wi-Fi Mesh组网
BW20系列模组是安信可科技基于RTL8711系列芯片开发的双频Wi-Fi+BLESoC模组,支持双频(2.4 GHz 或 5.8 GHz)802.11a/b/g/n WLAN协议和Bluetooth 5.0协议。
产品 发布时间 : 2024-10-10
【产品】安信可ESP32系列低功耗UART-WiFi芯片模组,可支持RTOS操作系统二次开发
ESP32系列模组是深圳市安信可科技有限公司开发的一系列基于乐鑫ESP32的低功耗UART-WiFi芯片模组,可以方便地进行二次开发,接入云端服务,实现手机3/4G全球随时随地的控制,加速产品原型设计。
产品 发布时间 : 2023-05-04
安信可WIFI+蓝牙模组Ai-WB2系列重新定义无线通信模组,简化用户端操作,配网成功率高达95%以上
安信可推出的Ai-WB2系列模组集成Wi-Fi&BT(蓝牙)于一体,搭载BL602芯片作为核心处理器,支持Wi-Fi 802.11b/g/n协议和BLE 5.0协议。智能家居、大小家电、工业自动化、监控设备、无线遥控、智能穿戴....各类终端都可通过Ai-WB2系列模组实现互联互通。
原厂动态 发布时间 : 2023-03-31
请问,BW16模组是否可以直接替换ESP-12F模组?
BW16以及ESP-12F模组的供电以及AT串口是pin to pin的;
技术问答 发布时间 : 2024-09-30
【元件】安信可科技24G人体存在感应雷达模组Rd-01搭载博流BL602芯片+矽典微的S3KM111L芯片,适用于高精准度场景
安信可自主研发的24GHz雷达模组搭载博流BL602芯片+矽典微的S3KM111L芯片,不仅能够正常检测人体存在、移动及微动,还可以检测出人体完全静止状态,解决了传统PIR人体红外感应在人体处于静止状态时就无法检测的痛点。
产品 发布时间 : 2024-05-08
【IC】安信可最新发布Ai-M61和Ai-M62两款WiFi 6+BLE5.3+X模组,最高主频可达320M
通过长期细致深入的研发设计及反复打磨,安信可重磅新品WiFi 6+BLE5.3+X模组——Ai-M61和Ai-M62两款系列模组惊艳亮相,力求为用户带来性能和体验的全面提升!Ai-M61&Ai-M62系列分别搭载BL618、BL616芯片作为处理器,支持Wi-Fi 802.11b/g/n/ax协议和BLE 5.3协议以及丰富的外围接口。
新产品 发布时间 : 2023-04-04
请问BW16模组需要手机与模组进行配对实现配网功能么?还是说一上电即可实现配网功能?
需要用户手动配置模组进入配网模式。
技术问答 发布时间 : 2024-09-30
电子商城
现货市场
服务
可定制显示屏的尺寸0.96”~15.6”,分辨率80*160~3840*2160,TN/IPS视角,支持RGB、MCU、SPI、MIPI、LVDS、HDMI接口,配套定制玻璃、背光、FPCA/PCBA。
最小起订量: 1000 提交需求>
可定制LED组件/LED传感/UV模组的电压、电流、波长等性能参数,电压:3-24V,,电流:30-3500mA,波长:270-940nm;材质:食品级POM,阻燃PC;防水等级:IP20-IP68。
最小起订量: 1000 提交需求>
登录 | 立即注册
提交评论