基于STM32的INA226電壓電流檢測儀

?

?

系統總體框圖

功率檢測裝置原理圖功能及模塊連接說明

一、系統功能概述

該裝置以STM32F103C8T6微控制器為核心,集成功率檢測、數據交互、狀態顯示和用戶提示功能,通過模塊化設計實現穩定運行。

二、各模塊功能及連接方式

  1. 按鍵模塊

功能:用戶交互控制(啟動/停止設備)。

連接方式:

按鍵SW1一端接地(GND),另一端通過電阻R5連接至微控制器GPIO引腳PA0。

按鍵按下時觸發PA0電平變化,觸發中斷或狀態讀取。

  1. LED指示燈模塊

功能:顯示設備狀態(如運行、告警)。

連接方式:

LED1(R6)和LED2(R7)分別連接至微控制器GPIO引腳PB0和PB1。

GPIO輸出高電平時LED點亮,低電平時熄滅。

  1. 微控制器(STM32F103C8T6)

功能:系統控制核心,處理數據、控制外設、驅動顯示。

連接方式:

通信接口:

USART1_TX/RX引腳連接調試接口(J4),支持程序燒錄和調試。

I2C接口(SCL/SDA)連接OLED屏幕。

控制引腳:

GPIO引腳控制LED、蜂鳴器、按鍵等外設。

  1. OLED屏幕模塊

功能:顯示功率檢測結果及系統信息。

連接方式:

I2C接口(SCL/SDA)與微控制器相連。

電源由3.3V降壓電路供電,接地至GND。

  1. INA226電壓電流檢測模塊

功能:檢測電壓電流以及功率。

連接方式:

I2C接口(SCL/SDA)與微控制器相連。

電源由3.3V降壓電路供電,接地至GND。

  1. 復位電路模塊

功能:強制復位微控制器。

連接方式:

復位按鈕SW5通過電阻R11連接至NRST引腳,電容C1用于濾波。

  1. 晶振電路模塊

功能:提供穩定時鐘信號(8MHz主頻)。

連接方式:

晶振X1連接至OSC_IN/OSC_OUT引腳,電容C5/C6接地。

  1. 蜂鳴器驅動模塊

功能:聲音提示(如異常報警)。

連接方式:

蜂鳴器BUZZER2通過三極管Q3和電阻R79/R80連接至微控制器GPIO(BUZZER_PIN)。

GPIO高電平時三極管導通,蜂鳴器發聲。

  1. 輸入輸出接口模塊

功能:輸入接口用于采集電壓電流參數,輸出接口接后級用電設備。

連接方式:

通過J2/J3連接器提供VIN+/VIN-/GND等接口。

調試接口模塊

功能:程序燒錄與調試(SWD或UART)。

連接方式:

J4接口提供USART1_TX/RX/GND信號。

  1. 3.3V降壓電路模塊

功能:將5V轉換為3.3V,為系統供電。

連接方式:

LDO穩壓器MEB211輸入5V,輸出3.3V,電容C3/C4濾波。

三、系統運行邏輯

微控制器通過按鍵檢測用戶輸入,啟動功率檢測。

檢測數據通過輸入接口采集,處理后通過OLED顯示。

異常情況觸發蜂鳴器報警,LED狀態指示同步反饋。

3.3V降壓電路為所有模塊提供穩定電源,晶振電路確保時序精度。
?


/*** @file INA226.c* @brief INA226電流/功率監測芯片的驅動程序* 使用硬件I2C2接口與INA226通信*/#include "ina226.h"
#include "i2c.h"/*** @brief INA226 I2C初始化* @note 使用Core/Src/i2c.c中已初始化的hi2c1,無需重復初始化*/
void INA226_IIC_Init(void)
{// 使用項目中已初始化的hi2c1
}/*** @brief 初始化INA226芯片* 配置芯片工作模式和校準值*/
void INA226_Init(void)
{INA226_IIC_Init();HAL_Delay(10); // 等待芯片上電穩定// 配置寄存器: 64次平均值,全功能,連續模式INA226_SendData(WRITE_ADDR, Config_Reg, 0x4727);// 校準寄存器: 當單位為mA時,0.002R=0xA00;0.01R=0x200 (最大8A)INA226_SendData(WRITE_ADDR, Calib_Reg, 0x200);
}/*** @brief 向INA226寫入數據* @param addr 器件地址(7位)* @param reg 寄存器地址* @param data 要寫入的16位數據*/
void INA226_SendData(uint8_t addr, uint8_t reg, uint16_t data)
{uint8_t buf[2] = {(uint8_t)(data >> 8), (uint8_t)(data & 0xFF)};HAL_I2C_Mem_Write(&hi2c1, addr, reg, I2C_MEMADD_SIZE_8BIT, buf, 2, HAL_MAX_DELAY);
}/*** @brief 設置INA226的寄存器指針* @param addr 器件地址(7位)* @param reg 要設置的寄存器地址*/
void INA226_SetRegPointer(uint8_t addr, uint8_t reg)
{HAL_I2C_Master_Transmit(&hi2c1, addr, &reg, 1, HAL_MAX_DELAY);
}/*** @brief 從INA226讀取數據* @param addr 器件地址(7位)* @return 讀取到的16位數據*/
uint16_t INA226_ReadData(uint8_t addr)
{uint8_t buf[2];HAL_I2C_Master_Receive(&hi2c1, addr | 0x01, buf, 2, HAL_MAX_DELAY);return (buf[0] << 8) | buf[1];
}/*** @brief 獲取分流電流值* @param addr 器件地址(7位)* @return 分流電流值(原始數據)*/
uint16_t INA226_GetShuntCurrent(uint8_t addr)
{uint16_t temp = 0;INA226_SetRegPointer(addr, Current_Reg);temp = INA226_ReadData(addr);return temp;
}/*** @brief 獲取器件ID* @param addr 器件地址(7位)* @return 器件ID(應為0x2260)*/
uint16_t INA226_Get_ID(uint8_t addr)
{uint16_t temp = 0;INA226_SetRegPointer(addr, ID_Reg);temp = INA226_ReadData(addr);return temp;
}/*** @brief 獲取校準寄存器值* @param addr 器件地址(7位)* @return 校準寄存器當前值*/
uint16_t INA226_GET_CAL_REG(uint8_t addr)
{uint16_t temp = 0;INA226_SetRegPointer(addr, Calib_Reg);temp = INA226_ReadData(addr);return temp;
}/*** @brief 獲取總線電壓值* @param addr 器件地址(7位)* @return 總線電壓值(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;
}/*** @brief 獲取分流電壓值* @param addr 器件地址(7位)* @return 分流電壓值(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;
}/*** @brief 獲取功率值* @param addr 器件地址(7位)* @return 功率值(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;
}
#include "ocv.h"
#include "ina226.h"INA226 CC, OCV; // 定義CC(充電電流)和OCV(開路電壓)監測結構體/*** @brief INA226應用示例* 使用步驟:* 1. 調用INA226_Init()初始化INA226芯片* 2. 定期調用Get_Vol()、Get_Cur()、Get_Pow()獲取測量值* 3. 從CC結構體讀取測量結果*/extern INA226 CC, OCV;
uint8_t CC_MODE[] = "CC MODE";
uint8_t Vol[] = "Voltage:";
uint8_t Cur[] = "Current:";
uint8_t Power[] = "Power:";/*** @brief 測試USB CC模式函數** 在OLED屏幕上顯示電壓、電流和功率值。** @return 無返回值*/
void USB_CC_TESTER(void)
{OLED_Printf(0, 0, OLED_8X16, "電壓電流功率儀");OLED_ShowString(0, 16, (char *)Vol, OLED_8X16);OLED_ShowString(0, 32, (char *)Cur, OLED_8X16);OLED_ShowString(0, 48, (char *)Power, OLED_8X16);OLED_Update();
}/*** @brief 顯示電壓電流功率儀信息** 在OLED顯示屏上顯示電壓、電流和功率信息,并通過串口輸出相同的信息。** @return 無*/
void Show_CC(void)
{OLED_Clear();OLED_Printf(0, 0, OLED_8X16, "電壓電流功率儀");OLED_Printf(0, 16, OLED_8X16, "Voltage:%.2f", ((float)CC.voltage_V + ((float)CC.voltage_mV / 100)) * 500);OLED_Printf(0, 32, OLED_8X16, "Current:%.2f", (float)CC.current_A + ((float)CC.current_mA / 1000));OLED_Printf(0, 48, OLED_8X16, "Power:%.2f", ((float)CC.power_W + ((float)CC.power_mW / 100)) * 500);OLED_Update();Serial_Printf_huart2("Voltage:%.2f,Current:%.2f,Power:%.2f\r\n", ((float)CC.voltage_V + ((float)CC.voltage_mV / 100)) * 500, (float)CC.current_A + ((float)CC.current_mA / 1000), ((float)CC.power_W + ((float)CC.power_mW / 100)) * 500);
}/* 示例1: 完整測量流程 */
void Example_MeasureAll(void)
{// 1. 初始化INA226INA226_Init();// 2. 進行測量Get_Vol(); // 獲取電壓Get_Cur(); // 獲取電流Get_Pow(); // 獲取功率// 3. 使用測量結果// CC.voltage_V  - 電壓整數部分(V)// CC.voltage_mV - 電壓小數部分(mV)// CC.current_A  - 電流整數部分(A)// CC.current_mA - 電流小數部分(mA)// CC.power_W    - 功率整數部分(W)// CC.power_mW   - 功率小數部分(mW)
}/* 示例2: 僅電壓測量 */
float Example_GetVoltage(void)
{Get_Vol();return CC.voltage_V + (CC.voltage_mV / 1000.0f);
}/* 示例3: 電流方向檢測 */
uint8_t Example_IsCharging(void)
{Get_Cur();return (CC.current_signed == 1); // 1表示充電,0表示放電
}/*** @brief 獲取電壓測量值* 將原始數據轉換為實際電壓值(V)*/
void Get_Vol(void)
{uint16_t Vol;Vol = INA226_GetVoltage(WRITE_ADDR) / 8; // 1.25mV/bit -> VCC.voltage_V = Vol / 100;				 // 整數部分(V)CC.voltage_mV = Vol % 100;				 // 小數部分(mV)
}/*** @brief 獲取電流測量值* 自動檢測電流方向(充電/放電)*/
void Get_Cur(void)
{uint16_t Cur;Cur = INA226_GetShuntCurrent(WRITE_ADDR);CC.current_signed = 1; // 默認充電狀態if (Cur & 0x8000)	   // 檢測電流方向{Cur = ~(Cur - 1);	   // 處理負電流值CC.current_signed = 0; // 設置為放電狀態}CC.current_A = Cur / 1000;	// 整數部分(A)CC.current_mA = Cur % 1000; // 小數部分(mA)
}/*** @brief 獲取功率測量值* 將原始數據轉換為實際功率值(W)*/
void Get_Pow(void)
{uint16_t Pow;Pow = (INA226_Get_Power(WRITE_ADDR) * 5) / 2; // 2.5mW/bit -> WCC.power_W = Pow / 100;						  // 整數部分(W)CC.power_mW = Pow % 100;					  // 小數部分(mW)
}

單片機定制:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81272.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81272.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81272.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

YOLOv2目標檢測算法:速度與精度的平衡之道

一、YOLOv2的核心改進&#xff1a;從V1到V2的蛻變 YOLOv2作為YOLO系列的第二代算法&#xff0c;在繼承V1端到端、單階段檢測的基礎上&#xff0c;針對V1存在的小目標檢測弱、定位精度低等問題進行了全方位升級&#xff0c;成為目標檢測領域的重要里程碑。 &#xff08;一&am…

將嵌入映射到 Elasticsearch 字段類型:semantic_text、dense_vector、sparse_vector

作者&#xff1a; Andre Luiz 討論如何以及何時使用 semantic_text、dense_vector 或 sparse_vector&#xff0c;以及它們與嵌入生成的關系。 通過這個自定進度的 Search AI 實踐學習親自體驗向量搜索。你可以開始免費云試用&#xff0c;或者在本地機器上嘗試 Elastic。 多年來…

uniapp取消瀏覽自動填充

為了防止瀏覽器自動將記住的密碼回填進type"password"輸入框&#xff0c;所以在type"password"輸入框上面加了兩行代碼&#xff0c;使瀏覽器將密碼填充到新加的輸入框里&#xff0c;并將這兩個input隱藏掉 <input type"password" autocomple…

從數據包到可靠性:UDP/TCP協議的工作原理分析

之前我們已經使用udp/tcp的相關接口寫了一些簡單的客戶端與服務端代碼。也了解了協議是什么&#xff0c;包括自定義協議和知名協議比如http/https和ssh等。現在我們再回到傳輸層&#xff0c;對udp和tcp這兩傳輸層巨頭協議做更深一步的分析。 一.UDP UDP相關內容很簡單&#xf…

顯卡、Cuda和pytorch兼容問題

這里寫目錄標題 驅動與CUDA版本兼容性問題1. **驅動與CUDA版本兼容性問題**2. **任務特性與硬件適配差異**3. **優化策略與框架配置差異**4. **散熱與功耗限制**5. **數據傳輸與CPU瓶頸**排查建議總結 查詢PyTorch中實際使用的CUDA版本**1. 查詢PyTorch中實際使用的CUDA版本***…

DeepSeek 大模型部署全指南:常見問題、優化策略與實戰解決方案

DeepSeek 作為當前最熱門的開源大模型之一&#xff0c;其強大的語義理解和生成能力吸引了大量開發者和企業關注。然而在實際部署過程中&#xff0c;無論是本地運行還是云端服務&#xff0c;用戶往往會遇到各種技術挑戰。本文將全面剖析 DeepSeek 部署中的常見問題&#xff0c;提…

Hadoop的目錄結構和組成

Hadoop 目錄結構 bin 目錄&#xff1a;包含了 Hadoop 的各種命令行工具&#xff0c;如hadoop、hdfs等&#xff0c;用于啟動和管理 Hadoop 集群&#xff0c;以及執行各種數據處理任務。etc 目錄&#xff1a;存放 Hadoop 的配置文件&#xff0c;包括core-site.xml、hdfs-site.xm…

Python Matplotlib 庫【繪圖基礎庫】全面解析

讓AI成為我們的得力助手&#xff1a;《用Cursor玩轉AI輔助編程——不寫代碼也能做軟件開發》 一、發展歷程 Matplotlib 由 John D. Hunter 于 2003 年創建&#xff0c;靈感來源于 MATLAB 的繪圖系統。作為 Python 生態中最早的可視化工具之一&#xff0c;它逐漸成為科學計算領…

車載以太網驅動智能化:域控架構設計與開發實踐

title: 車載以太網驅動專用車智能化&#xff1a;域控架構設計與開發實踐 date: 2023-12-01 categories: 新能源汽車 tags: [車載以太網, 電子電氣架構, 域控架構, 專用車智能化, SOME/IP, AUTOSAR] 引言&#xff1a;專用車智能化轉型的挑戰與機遇 專用車作為城市建設與工業運輸…

圖論模板(部分)

圖論模板&#xff08;部分&#xff09; maincpp #include <iostream> #include <climits> #include <limits>typedef unsigned long long ull; typedef long long ll; typedef long double ld; typedef std::pair<int, int> PII;#define rep(i, n) f…

2025年【道路運輸企業安全生產管理人員】考試題庫及道路運輸企業安全生產管理人員考試內容

一、考試概述 2025年道路運輸企業安全生產管理人員考試題庫由【安全生產模擬考試一點通】平臺發布&#xff0c;涵蓋安全生產法律法規、車輛技術管理、從業人員管理、應急預案編制等核心領域。考試重點考察考生對安全生產主體責任、風險管控、隱患排查等實務操作的掌握程度&…

分貝計在噪音污染源識別中的用途

分貝計在噪音污染源識別中的作用 噪音污染是現代社會面臨的一個普遍問題&#xff0c;尤其在城市化進程加快的背景下&#xff0c;交通、工業、建筑和娛樂活動等產生的噪音對人們的生活質量和健康造成了嚴重影響。為了有效管理和控制噪音污染&#xff0c;首先需要準確識別噪音的…

deepin v23.1 搜狗輸入法next配置中文輸入法下默認用英文標點

deepin23.1下, fcitx5的 deepin next搜狗輸入法的屬性頁無法配置中文狀態下默認用英文標點, 但是可以改以下配置來實現這一點. 搜狗輸入法運行期間&#xff0c;用戶修改的配置被存儲在以下位置&#xff1a; ~/.config/cpis/module/im/fcitx5/com.sogou.ime.ng.fcitx5.deepin/k…

C語言:在 Win 10 上,g++ 如何編譯 gtk 應用程序

在 Windows 10 上使用 g&#xff08;或 gcc&#xff09;編譯基于 GTK 的 C 語言程序是完全可行的&#xff0c;且相比 Tcc 更為推薦&#xff0c;因為 g&#xff08;GNU 編譯器套件&#xff09;對 GTK 的支持更加完善&#xff0c;配置也更簡單。以下是詳細步驟和注意事項&#xf…

84.評論日記

原鏈接 這個視頻我發了四五條評論。評論內容甚至和下面這個視頻內的其他評論一樣。 找了另外的賬號也發了。 發現&#xff0c;無論是我這個賬號&#xff0c;還是其他的賬號&#xff0c;評論都無法看到。 我大膽猜測有一種機制&#xff0c;某些官號會被設置成一種高檢測的等…

【RabbitMQ】整合 SpringBoot,實現工作隊列、發布/訂閱、路由和通配符模式

文章目錄 工作隊列模式引入依賴配置聲明生產者代碼消費者代碼 發布/訂閱模式引入依賴聲明生產者代碼發送消息 消費者代碼運行程序 路由模式聲明生產者代碼消費者代碼運行程序 通配符模式聲明生產者代碼消費者代碼運行程序 工作隊列模式 引入依賴 我們在創建 SpringBoot 項目的…

Python-92:最大乘積區間問題

問題描述 小R手上有一個長度為 n 的數組 (n > 0)&#xff0c;數組中的元素分別來自集合 [0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]。小R想從這個數組中選取一段連續的區間&#xff0c;得到可能的最大乘積。 你需要幫助小R找到最大乘積的區間&#xff0c;并輸出這…

windows觸摸板快捷指南

以下是結構化整理后的觸控手勢說明&#xff0c;采用清晰的層級劃分和標準化表述&#xff1a; **觸控手勢操作規范****1. 單指操作****2. 雙指操作****3. 三指操作****4. 四指操作** **優化說明&#xff1a;** 觸控手勢操作規范 1. 單指操作 手勢功能描述等效操作單擊滑動選擇…

VSCode launch.json 配置參數詳解

使用 launch.json 配置調試環境時&#xff0c;會涉及到多個參數&#xff0c;用于定義調試器的行為和目標執行環境。以下是一些常用的配置參數&#xff1a; 1、"type" &#xff1a;指定調試器的類型&#xff0c;例如 "node" 表示 Node.js 調試器&#xff0…

mAP、AP50、AR50:目標檢測中的核心評價指標解析

在目標檢測任務中&#xff0c;評價指標是衡量模型性能的核心工具。其中&#xff0c;mAP&#xff08;mean Average Precision&#xff09;、AP50&#xff08;Average Precision at IoU0.5&#xff09;和AR50&#xff08;Average Recall at IoU0.5&#xff09;是最常用的指標。本…