0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MCU芯片AS32A601与INA226芯片精确测量实现与应用

安芯 来源:jf_29981791 作者:jf_29981791 2025-11-23 23:16 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、引言

为满足精准的电源管理需求,国科安芯推出的AS32X601开发板特别搭载了INA226双向电流/功率监测芯片。该芯片不仅支持高达36V的总线电压,更能通过其集成的Δ-Σ ADC对分流电阻器上的压降进行高精度采样,从而实现毫伏级电压与微安级电流的精确测量。这一特性使其非常适用于电池充放电监控、服务器/工控设备能耗分析以及太阳能系统发电效率评估等高级应用场景。

二、INA226简介

2.1****引脚功能
wechat_2025-11-23_231302_056.png

INA226有两个地址引脚,A0和A1。下图描述了16个可能地址中的每一个的引脚逻辑。INA226模块A0 A1****引脚被下拉至 ** GND ** ,故 ** IIC 地址则为 ** Write1000 0000 0x80 Read1000 0001 0x81

2.2****寄存器介绍

2.2.1配置寄存器 0x00

配置寄存器设置控制设备的工作模式。该寄存器控制分流和总线电压测量以及所用的平均模式的转换时间设置。

2.2.2分流电压寄存器**** 0x01

用于存储当前的分流电压读数Vshunt。负数采用二进制补码格式表示。生成一个负数的补码方法是:对其绝对值的二进制数取反,然后加1。如果最高有效位(MSB)为1,则表示这是一个负数。最小分辨率(Vshunt _LSB)为 2.5uV。

注:分流电压最大81.92mV,而该模块的采样电阻是0.1R,故最大电流为 81.92mV / 0.1R = 819.2mA

分流电压计算:Vshunt = 寄存器值 * Vshunt _LSB(2.5uV)

2.2.3.总线电压寄存器 ** 0x02**

用于存储最近一次的总线电压读数 Vbus。如果启用了平均功能,则该寄存器显示的是平均后的数值。满量程范围为 40.96V(对应 7FFF);最小分辨率(Vbus_LSB)为 1.25 mV。

总线电压计算:Vbus = 寄存器值 * Vbus_LSB(1.25 mV )

2.2.4.功率寄存器 ** 0x03**

用于存储功率读数 Power ,如果启用了平均功能,该寄存器将显示平均值。功率寄存器的最低有效位(LSB)在内部被设定为等于 Current_LSB 所设定值的 25 倍。功率寄存器通过将电流寄存器的十进制值与总线电压寄存器的十进制值相乘来记录以瓦特(Watts)为单位的功率。

功率计算: Power = 寄存器值 * Power_ LSB

由手册可知 Power_LSB(功率最小分辨率) = Current_LSB(电流最小分辨率) * 25

Current_LSB 手册给出了计算公式,如下

Current_LSB = 最大电流 / 2^15 = 819.2mA / 2^15 = 0.025mA

2.2.5.电流寄存器 ** 0x04**

用于存储电流读数 Current,如果启用了平均功能,该寄存器将显示平均值。电流寄存器的值是通过将分流电压寄存器中的十进制值与校准寄存器中的十进制值相乘来计算的

电流值 = 寄存器值 * Current_LSB(0.05mA) (Current_LSB 的计算在上文功率寄存器小节已经给出)

2.2.6.基准寄存器 ** 0x05**

该寄存器为器件提供用于产生测量差分电压的分流电阻值。它还设置电流寄存器的分辨率。编程该寄存器可设置 Current_LSB 和 Power_LSB。该寄存器也适用于整体系统校准。

该寄存器主要是设置系统基准的,将 基准值(CAL) 写入寄存器即可

Current_LSB= 0.05mA (上文功率寄存器小节已经给出) ,根据原理图可知 Rshunt = 0.1R

CAL = 0.00512 / (0.00005A * 0.1R) = 1024 = 0x0400

三、I2C时序说明

**3.1 **写时序

FlagStatus I2C_MEEPROMWriteByte(I2C_TypeDef* I2Cx, uint8_t addr, uint16_t reg, uint16_t data, uint32_t timeout)

{

/ 等待总线释放 /

while (!I2C_CheckStatus(I2Cx, I2C_BUS_IDLE))

{

I2C_StartClear(I2Cx);

I2C_GenerateStop(I2Cx);

I2C_ClearITPendingBit(I2Cx);

if ((timeout--) == 0)

{

return RESET;

}

delay_ms(1);

}

I2C_GenerateStart(I2Cx);

/ 等待启动信号完成 /

while (!I2C_CheckStatus(I2Cx, MASTER_START_READY))

{

if ((timeout--) == 0)

{

return RESET;

}

delay_ms(1);

}

I2C_Send7bitAddress(I2Cx, addr, I2C_WRITE);

I2C_StartClear(I2Cx);

I2C_ClearITPendingBit(I2Cx);

/ 等待从机接收完成地址并发送ack /

while (!I2C_CheckStatus(I2Cx, MSEND_WADDR_ACK))

{

if ((timeout--) == RESET)

{

I2C_GenerateStop(I2Cx);

I2C_ClearITPendingBit(I2Cx);

return RESET;

}

delay_ms(1);

}

I2C_SendData(I2Cx, (uint8_t)(reg >> 0));

I2C_ClearITPendingBit(I2Cx);

/ 等待从机接收完成数据并发送ack /

while (!I2C_CheckStatus(I2Cx, MSEND_DATA_ACK))

{

if ((timeout--) == 0)

{

I2C_GenerateStop(I2Cx);

I2C_ClearITPendingBit(I2Cx);

return RESET;

}

delay_ms(1);

}

I2C_SendData(I2Cx, (data&0xff00)>>8);

I2C_ClearITPendingBit(I2Cx);

/ 等待从机接收完成数据并发送ack /

while (!I2C_CheckStatus(I2Cx, MSEND_DATA_ACK))

{

if ((timeout--) == 0)

{

I2C_GenerateStop(I2Cx);

I2C_ClearITPendingBit(I2Cx);

return RESET;

}

delay_ms(1);

}

I2C_SendData(I2Cx, data&0x00ff);

I2C_ClearITPendingBit(I2Cx);

/ 等待从机接收完成数据并发送ack /

while (!I2C_CheckStatus(I2Cx, MSEND_DATA_ACK))

{

if ((timeout--) == 0)

{

I2C_GenerateStop(I2Cx);

I2C_ClearITPendingBit(I2Cx);

return RESET;

}

delay_ms(1);

}

I2C_GenerateStop(I2Cx);

I2C_ClearITPendingBit(I2Cx);

return 1;

}

3.2 读时序

FlagStatus I2C_MEEPROMRead(I2C_TypeDef* I2Cx, uint8_t addr, uint16_t reg, uint8_t* pData, uint32_t Size, uint32_t timeout)

{

uint32_t num = 0x00;

/ 等待总线释放 /

while (!I2C_CheckStatus(I2Cx, I2C_BUS_IDLE))

{

I2C_StartClear(I2Cx);

I2C_GenerateStop(I2Cx);

I2C_ClearITPendingBit(I2Cx);

if ((timeout--) == 0)

{

return RESET;

}

delay_ms(1);

}

I2C_AcknowledgeConfig(I2Cx, I2C_IICAA_ACK);

I2C_GenerateStart(I2Cx);

/ 等待启动信号完成 /

while (!I2C_CheckStatus(I2Cx, MASTER_START_READY))

{

if ((timeout--) == 0)

{

I2C_StartClear(I2Cx);

I2C_GenerateStop(I2Cx);

I2C_ClearITPendingBit(I2Cx);

return RESET;

}

delay_ms(1);

}

I2C_Send7bitAddress(I2Cx, addr, I2C_WRITE);

I2C_StartClear(I2Cx);

I2C_ClearITPendingBit(I2Cx);

/ 等待从机接收完成地址并发送ack /

while (!I2C_CheckStatus(I2Cx, MSEND_WADDR_ACK))

{

if ((timeout--) == 0)

{

I2C_GenerateStop(I2Cx);

I2C_ClearITPendingBit(I2Cx);

return RESET;

}

delay_ms(1);

}

// I2C_SendData(I2Cx, (uint8_t)(reg >> 8));

// I2C_ClearITPendingBit(I2Cx);

// / 等待从机接收完成数据并发送ack /

// while (!I2C_CheckStatus(I2Cx, MSEND_DATA_ACK))

// {

// if ((timeout--) == 0)

// {

// I2C_GenerateStop(I2Cx);

// I2C_ClearITPendingBit(I2Cx);

// return 0;

// }

// delay_ms(1);

// }

I2C_SendData(I2Cx, (uint8_t)(reg >> 0));

I2C_ClearITPendingBit(I2Cx);

/ 等待从机接收完成数据并发送ack /

while (!I2C_CheckStatus(I2Cx, MSEND_DATA_ACK))

{

if ((timeout--) == 0)

{

I2C_GenerateStop(I2Cx);

I2C_ClearITPendingBit(I2Cx);

return RESET;

}

delay_ms(1);

}

I2C_GenerateStart(I2Cx);

I2C_ClearITPendingBit(I2Cx);

/ 等待从机接收完成数据并发送ack /

while (!I2C_CheckStatus(I2Cx, MASTER_START_REPEAT))

{

if ((timeout--) == 0)

{

I2C_GenerateStop(I2Cx);

I2C_ClearITPendingBit(I2Cx);

return RESET;

}

delay_ms(1);

}

I2C_Send7bitAddress(I2Cx, addr, I2C_READ);

I2C_ClearITPendingBit(I2Cx);

/ 等待从机接收完成地址并发送ack /

while (!I2C_CheckStatus(I2Cx, MSEND_RADDR_ACK))

{

if ((timeout--) == 0)

{

I2C_StartClear(I2Cx);

I2C_GenerateStop(I2Cx);

I2C_ClearITPendingBit(I2Cx);

return RESET;

}

delay_ms(1);

}

for (num = 0; num < Size; num++)

{

if (num == (Size - 1))

{

/* IIC sends NACK */

I2C_AcknowledgeConfig(I2Cx, I2C_IICAA_NACK);

}

else

{

I2C_AcknowledgeConfig(I2Cx, I2C_IICAA_ACK);

}

I2C_StartClear(I2Cx);

I2C_ClearITPendingBit(I2Cx);

/* Wait for the slave to send the completed data, and the host will send an ack */

while (!(I2C_CheckStatus(I2Cx, MREAD_DATA_ACK) || I2C_CheckStatus(I2Cx, MREAD_DATA_NACK)))

{

if ((Timeout--) == 0)

{

I2C_StartClear(I2Cx);

I2C_GenerateStop(I2Cx);

I2C_ClearITPendingBit(I2Cx);

return RESET;

}

delay_ms(1);

}

*pData++ = I2C_ReceiveData(I2Cx);

}

I2C_StartClear(I2Cx);

I2C_GenerateStop(I2Cx);

I2C_ClearITPendingBit(I2Cx);

return SET;

}

四、程序

指令

#define I2C I2C0

// INA226 I2C地址(根据A0和A1引脚配置决定)

#define INA226_ADDRESS 0x40

// INA226寄存器定义

#define INA226_REG_CONFIG 0x00

#define INA226_REG_SHUNT_VOLT 0x01

#define INA226_REG_BUS_VOLT 0x02

#define INA226_REG_POWER 0x03

#define INA226_REG_CURRENT 0x04

#define INA226_REG_CALIB 0x05

#define INA226_REG_MASK_ENABLE 0x06

#define INA226_REG_ALERT_LIMIT 0x07

#define INA226_REG_MANUFACTURER 0xFE

#define INA226_REG_DIE_ID 0xFF

#define Byte_NUMBER 2

main.c

void main()

{

Systemclock_Init();

uint8_t rdata[2] = {0};

delay_init(SMU_ClocksStruct.AXIBus0_Frequency/1000000);

#ifdef DEBUG

IIC0_RESET();

delay_ms(100);

IIC0_SET();

#endif

/* Initialize print usart */

User_Print_Init(115200);

Printf( "INNA226 test begin! n");

User_I2C_Init();

/* Configuration Register */

I2C_MEEPROMWriteByte(I2C, INA226_ADDRESS, INA226_REG_CONFIG, 0x4527, 1000);

delay_ms(1);

/* Calibration Register */

I2C_MEEPROMWriteByte(I2C, INA226_ADDRESS, INA226_REG_CALIB, 0x0A00, 1000);

delay_ms(1);

/* Printf INNA226 ID */

I2C_MEEPROMRead(I2C, INA226_ADDRESS, INA226_REG_MANUFACTURER, rdata, Byte_NUMBER, 2000);

Printf("INNA226 ID:%x%x rn",rdata[0], rdata[1]);

for (int i = 0; i<10; i++)

{

/* Printf INA226_REG_SHUNT_VOLT */

uint16_t shuntVolt=0;

I2C_MEEPROMRead(I2C, INA226_ADDRESS, INA226_REG_SHUNT_VOLT, rdata, Byte_NUMBER, 2000);

shuntVolt = rdata[0]<<8&0xff00 | rdata[1];

Printf("SHUNT VOLT: %f mVrn", shuntVolt2.50.001);

delay_ms(10);

uint16_t busVolt=0;

I2C_MEEPROMRead(I2C, INA226_ADDRESS, INA226_REG_BUS_VOLT, rdata, Byte_NUMBER, 2000);

busVolt = rdata[0]<<8&0xff00 | rdata[1];

Printf("busVolt: %f mVrn", shuntVolt*1.25);

delay_ms(10);

/* Printf INA226_REG_POWER */

uint16_t Power=0;

I2C_MEEPROMRead(I2C, INA226_ADDRESS, INA226_REG_POWER, rdata, Byte_NUMBER, 2000);

Power = rdata[0]<<8&0xff00 | rdata[1];

Printf("Power: %f mWrn", Power*1.25);

/* Printf INA226_REG_SHUNT_VOLT */

uint16_t current=0;

I2C_MEEPROMRead(I2C, INA226_ADDRESS, INA226_REG_CURRENT, rdata, Byte_NUMBER, 2000);

current = rdata[0]<<8&0xff00 | rdata[1];

Printf("CUURET :%f mArn", current*0.02);

delay_ms(100);

Printf("--------------------------rn");

}

while (1);

}

五、实验结果

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    463

    文章

    54389

    浏览量

    469047
  • mcu
    mcu
    +关注

    关注

    147

    文章

    19111

    浏览量

    403366
  • INA226
    +关注

    关注

    0

    文章

    8

    浏览量

    8403
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    零知派——STM32驱动INA226 高精度功率监测仪(可视化数据记录仪+一键导出Excel)

    接收到数据?A: 确保PLX-DAQ选择的COM口正确,波特率与代码一致(115200),且没有其他程序占用串口Q3: 能否测量负电流(如电池放电/充电双向)?A: 可以。INA226
    发表于 04-11 13:39

    AS32A601MCU芯片如何进行IAP升级?

    一、什么是IAP? IAP(In Application Programming,在应用编程)是一种技术,旨在实现用户应用程序的动态更新,而无需使用专门的编程工具或硬件。IAP升级对于物联网设备
    的头像 发表于 12-19 11:39 2151次阅读
    <b class='flag-5'>AS32A601</b>型<b class='flag-5'>MCU</b><b class='flag-5'>芯片</b>如何进行IAP升级?

    AS32A601车规级微控制器的应用探索

    AS32A601将180 MHz RISC-V内核、2 MB 嵌入式 Flash、4 路 CAN-FD以及完整的 ASIL-B 安全机制集成于单颗芯片,为国产车规MCU提供了可批量上车的工程样本。本文结合AEC-Q100、IS
    的头像 发表于 11-18 14:42 1271次阅读

    同是电流检测芯片FP137 与 INA139,实际性能差距有多大?

    不可或缺的部分? ” 电流检测IC在该模块中,主要实现四个核心功能: ①扭矩控制:通过实时反馈电流信号,使MCU能够精确调节输出至电机的电压,从而将扭矩稳定在目标值。 ②安全保护:持续监测电流状态,当
    发表于 11-17 10:45

    基于AS32A601MCU芯片的屏幕驱动IC方案的技术研究

    摘要 :在电子技术快速迭代的当下,屏幕驱动IC作为人机交互的关键环节,其技术演进受到广泛关注。本文聚焦于基于国科安芯推出的AS32A601MCU芯片的屏幕驱动IC方案,通过深入剖析AS32A
    的头像 发表于 10-31 15:04 542次阅读

    AS32S601MCU芯片在商业卫星电源系统伺服控制器中的性能分析与应用解析

    摘要: 随着商业航天的蓬勃发展,对高可靠、高性能且具备成本效益的MCU(微控制单元)需求日益增长。本文聚焦于国科安芯推出的AS32S601MCU芯片,深入分析其性能指标,并探讨其在商
    的头像 发表于 10-28 21:58 1032次阅读

    STM32 驱动 INA226 测量电流电压功率

    一、INA226简介 INA226 是一款分流/功率监视器,具有 I2C或SMBUS 兼容接口。 该器件 监视分流压降和总线电源电压。 可编程校准值、转换时间和取平均值功能与内部乘法器相结合,可实现
    发表于 10-28 10:10

    车规级MCU在特种车辆车身控制中的应用研究

    本文聚焦于车规级MCU(微控制单元)在特种车辆车身控制系统中的应用,以国科安芯的车规级MCU芯片AS32A601为例,深入分析其技术特点、功能安全设计及在车身控制中的实际表现。
    的头像 发表于 09-19 17:12 998次阅读

    MCU芯片AS32S601在卫星光纤放大器(EDFA)中的应用探索

    摘要: 本文聚焦于国科安芯推出的AS32S601MCU芯片在卫星光纤放大器(EDFA)中的潜在应用,探讨其技术特性、抗辐射性能及适用性。通过分析其在单粒子效应脉冲激光试验中的表现,结合EDFA系统
    的头像 发表于 07-23 17:52 1334次阅读

    AS32A601在毫米波雷达AEB方案中的技术创新与应用拓展

    摘要: 随着汽车电子技术的不断发展,自动紧急制动(AEB)系统作为提升行车安全的关键技术,其性能和可靠性备受关注。本文深入探讨了国科安芯推出的MCU芯片AS32A601在毫米波雷达AEB方案中
    的头像 发表于 07-04 11:09 840次阅读

    基于AS32A601的高可靠MCU在电动汽车VCU系统中的应用策略

    摘要: 随着电动汽车产业的蓬勃发展,对VCU系统的性能、可靠性和功能安全提出了更高要求。国科安芯推出的AS32A601以其卓越的性能、丰富的功能模块以及出色的安全特性,为电动汽车VCU系统
    的头像 发表于 06-27 16:13 829次阅读

    AS32A601与ASM1042芯片在电力系统自动化监控中的应用效能分析

    摘要: 随着电力系统的持续发展与日益复杂化,自动化监控技术在保障电力系统稳定、高效运行中扮演着关键角色。本文深入剖析了厦门国科安芯科技有限公司的AS32A601芯片与ASM1042芯片组合在电力系统
    的头像 发表于 06-20 17:47 968次阅读

    INA226 具有警报功能的、36V、16 位、超精密I2C输出电流/电压/功率监控器技术手册

    INA226 是具有 I2C™ 或 SMBUS 兼容接口的电流分流器和功率监测器。该器件同时监控分流压降和总线电源电压。可编程校准值、转换时间、和均值计算,与一个内部乘法器相组合,实现电流值(安培)和功率值(瓦)的直接读取。
    的头像 发表于 05-09 10:49 2950次阅读
    <b class='flag-5'>INA226</b> 具有警报功能的、36V、16 位、超精密I2C输出电流/电压/功率监控器技术手册

    RISC-V JTAG:开启MCU 芯片调试之旅

    在当今电子科技飞速发展的时代, MCU 芯片成为众多企业追求技术突破与创新的关键领域。而芯片的调试过程则是确保其性能与可靠性的重要环节。本文以国科安芯自研 AS32A601为例,旨在详
    的头像 发表于 05-07 17:57 2968次阅读
    RISC-V JTAG:开启<b class='flag-5'>MCU</b> <b class='flag-5'>芯片</b>调试之旅

    基于先进MCU的机器人运动控制系统设计:理论、实践与前沿技术

    AS32A601为例,全面阐述其在机器人运动控制领域的卓越性能与广泛应用前景,旨在为机器人技术在多领域的深化发展提供有力支撑。 关键词 :MCU;机器人;运动控制;AS32A601;前沿技术 一、引言 机器人运动控制系统作为机器
    的头像 发表于 04-27 10:58 1073次阅读