国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

    文章

    54016

    瀏覽量

    466289
  • mcu
    mcu
    +關注

    關注

    147

    文章

    18932

    瀏覽量

    398460
  • INA226
    +關注

    關注

    0

    文章

    7

    瀏覽量

    8386
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    AS32A601MCU芯片如何進行IAP升級?

    一、什么是IAP? IAP(In Application Programming,在應用編程)是一種技術,旨在實現用戶應用程序的動態更新,而無需使用專門的編程工具或硬件。IAP升級對于物聯網設備
    的頭像 發表于 12-19 11:39 ?2019次閱讀
    <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 ?1153次閱讀

    同是電流檢測芯片FP137 與 INA139,實際性能差距有多大?

    不可或缺的部分? ” 電流檢測IC在該模塊中,主要實現四個核心功能: ①扭矩控制:通過實時反饋電流信號,使MCU能夠精確調節輸出至電機的電壓,從而將扭矩穩定在目標值。 ②安全保護:持續監測電流狀態,當
    發表于 11-17 10:45

    基于AS32A601MCU芯片的屏幕驅動IC方案的技術研究

    摘要 :在電子技術快速迭代的當下,屏幕驅動IC作為人機交互的關鍵環節,其技術演進受到廣泛關注。本文聚焦于基于國科安芯推出的AS32A601MCU芯片的屏幕驅動IC方案,通過深入剖析AS32A
    的頭像 發表于 10-31 15:04 ?437次閱讀

    AS32S601MCU芯片在商業衛星電源系統伺服控制器中的性能分析與應用解析

    摘要: 隨著商業航天的蓬勃發展,對高可靠、高性能且具備成本效益的MCU(微控制單元)需求日益增長。本文聚焦于國科安芯推出的AS32S601MCU芯片,深入分析其性能指標,并探討其在商
    的頭像 發表于 10-28 21:58 ?836次閱讀

    STM32 驅動 INA226 測量電流電壓功率

    一、INA226簡介 INA226 是一款分流/功率監視器,具有 I2C或SMBUS 兼容接口。 該器件 監視分流壓降和總線電源電壓。 可編程校準值、轉換時間和取平均值功能與內部乘法器相結合,可實現
    發表于 10-28 10:10

    車規級MCU在特種車輛車身控制中的應用研究

    本文聚焦于車規級MCU(微控制單元)在特種車輛車身控制系統中的應用,以國科安芯的車規級MCU芯片AS32A601為例,深入分析其技術特點、功能安全設計及在車身控制中的實際表現。
    的頭像 發表于 09-19 17:12 ?869次閱讀

    MCU芯片AS32S601在衛星光纖放大器(EDFA)中的應用探索

    摘要: 本文聚焦于國科安芯推出的AS32S601MCU芯片在衛星光纖放大器(EDFA)中的潛在應用,探討其技術特性、抗輻射性能及適用性。通過分析其在單粒子效應脈沖激光試驗中的表現,結合EDFA系統
    的頭像 發表于 07-23 17:52 ?1153次閱讀

    AS32A601在毫米波雷達AEB方案中的技術創新與應用拓展

    摘要: 隨著汽車電子技術的不斷發展,自動緊急制動(AEB)系統作為提升行車安全的關鍵技術,其性能和可靠性備受關注。本文深入探討了國科安芯推出的MCU芯片AS32A601在毫米波雷達AEB方案中
    的頭像 發表于 07-04 11:09 ?727次閱讀

    基于AS32A601的高可靠MCU在電動汽車VCU系統中的應用策略

    摘要: 隨著電動汽車產業的蓬勃發展,對VCU系統的性能、可靠性和功能安全提出了更高要求。國科安芯推出的AS32A601以其卓越的性能、豐富的功能模塊以及出色的安全特性,為電動汽車VCU系統
    的頭像 發表于 06-27 16:13 ?702次閱讀

    AS32A601與ASM1042芯片在電力系統自動化監控中的應用效能分析

    摘要: 隨著電力系統的持續發展與日益復雜化,自動化監控技術在保障電力系統穩定、高效運行中扮演著關鍵角色。本文深入剖析了廈門國科安芯科技有限公司的AS32A601芯片與ASM1042芯片組合在電力系統
    的頭像 發表于 06-20 17:47 ?838次閱讀

    INA226 具有警報功能的、36V、16 位、超精密I2C輸出電流/電壓/功率監控器技術手冊

    INA226 是具有 I2C? 或 SMBUS 兼容接口的電流分流器和功率監測器。該器件同時監控分流壓降和總線電源電壓??删幊绦手?、轉換時間、和均值計算,與一個內部乘法器相組合,實現電流值(安培)和功率值(瓦)的直接讀取。
    的頭像 發表于 05-09 10:49 ?2570次閱讀
    <b class='flag-5'>INA226</b> 具有警報功能的、36V、16 位、超精密I2C輸出電流/電壓/功率監控器技術手冊

    RISC-V JTAG:開啟MCU 芯片調試之旅

    在當今電子科技飛速發展的時代, MCU 芯片成為眾多企業追求技術突破與創新的關鍵領域。而芯片的調試過程則是確保其性能與可靠性的重要環節。本文以國科安芯自研 AS32A601為例,旨在詳
    的頭像 發表于 05-07 17:57 ?2734次閱讀
    RISC-V JTAG:開啟<b class='flag-5'>MCU</b> <b class='flag-5'>芯片</b>調試之旅

    基于先進MCU的機器人運動控制系統設計:理論、實踐與前沿技術

    AS32A601為例,全面闡述其在機器人運動控制領域的卓越性能與廣泛應用前景,旨在為機器人技術在多領域的深化發展提供有力支撐。 關鍵詞 :MCU;機器人;運動控制;AS32A601;前沿技術 一、引言 機器人運動控制系統作為機器
    的頭像 發表于 04-27 10:58 ?938次閱讀

    面向工業與汽車領域的高安全可靠MCU——AS32X601系列芯片解析

    (D-Flash)及512KB SRAM,均支持ECC校驗。 安全認證 :汽車級型號AS32A601通過AEC-Q100 Grade1認證,支
    的頭像 發表于 03-14 16:40 ?1132次閱讀