亚洲春色中文字幕久久久-三上亚,91精品国产亚一区二区三区,久久久九色综合亚洲成色777,涩涩视频下载,国产午夜亚洲精品午夜鲁丝片,国产精品A一区二区三区腾讯导航,影音先锋色情AV在线看片,蜜臀国产在线视频,极品少妇高潮啪啪无码吴梦梦 ,精品人妻无码一区二区三区手机版

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1251|回復: 5
打印 上一主題 下一主題
收起左側

求助 如何使用STC8G1K08單片機讀取 INA226

[復制鏈接]
跳轉到指定樓層
樓主
ID:1146155 發表于 2025-10-2 21:59 來自觸屏版 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
求助獲取INA226的程序
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:879809 發表于 2025-10-3 01:38 | 只看該作者
隨便找個IIC通訊程序改々就有了。
回復

使用道具 舉報

板凳
ID:1146155 發表于 2025-10-3 09:56 來自觸屏版 | 只看該作者
rundstedt 發表于 2025-10-3 01:38
隨便找個IIC通訊程序改々就有了。

好的 我試試謝謝
回復

使用道具 舉報

地板
ID:584814 發表于 2025-10-6 10:03 | 只看該作者
DEEPSEEK問一下就有答案,或參手冊自己寫。
回復

使用道具 舉報

5#
ID:1160531 發表于 2025-10-9 21:41 | 只看該作者
供參考,希望早日成功
回復

使用道具 舉報

6#
ID:1160531 發表于 2025-10-9 21:42 | 只看該作者
#include "STC8G.h" #include "intrins.h"  // 定義I2C引腳 sbit SDA = P3^2;  // 數據引腳 sbit SCL = P3^3;  // 時鐘引腳  // INA226地址 (A0和A1接地時為0x40) #define INA226_ADDR 0x40  // INA226寄存器地址 #define INA226_REG_CONFIG       0x00 #define INA226_REG_SHUNTVOLTAGE 0x01 #define INA226_REG_BUSVOLTAGE   0x02 #define INA226_REG_POWER        0x03 #define INA226_REG_CURRENT      0x04 #define INA226_REG_CALIBRATION  0x05  // 延時函數 void Delay5us() {     _nop_();_nop_();_nop_();_nop_();     _nop_();_nop_();_nop_();_nop_();     _nop_();_nop_();_nop_();_nop_(); }  void Delay10us() {     Delay5us();     Delay5us(); }  // I2C起始信號 void I2C_Start() {     SDA = 1;     SCL = 1;     Delay10us();     SDA = 0;  // 在SCL高電平時,SDA由高變低     Delay10us();     SCL = 0;  // 鉗住SCL線,準備發送或接收數據 }  // I2C停止信號 void I2C_Stop() {     SDA = 0;     SCL = 1;     Delay10us();     SDA = 1;  // 在SCL高電平時,SDA由低變高     Delay10us(); }  // 發送應答信號 void I2C_Ack() {     SDA = 0;     SCL = 1;     Delay10us();     SCL = 0;     SDA = 1;     Delay10us(); }  // 發送非應答信號 void I2C_NAck() {     SDA = 1;     SCL = 1;     Delay10us();     SCL = 0;     Delay10us(); }  // 等待應答 bit I2C_WaitAck() {     bit ackbit;     SDA = 1;  // 釋放SDA線     Delay10us();     SCL = 1;     Delay10us();     ackbit = SDA;  // 讀取應答信號     SCL = 0;     Delay10us();     return ackbit; }  // 發送一個字節 void I2C_SendByte(unsigned char dat) {     unsigned char i;     for(i=0; i<8; i++)     {         SDA = (dat & 0x80) >> 7;  // 發送高位         dat <<= 1;         SCL = 1;         Delay10us();         SCL = 0;         Delay10us();     }     I2C_WaitAck();  // 等待應答 }  // 接收一個字節 unsigned char I2C_ReceiveByte() {     unsigned char i, dat = 0;     SDA = 1;  // 釋放SDA線     for(i=0; i<8; i++)     {         SCL = 1;         dat <<= 1;         dat |= SDA;  // 讀取數據位         Delay10us();         SCL = 0;         Delay10us();     }     return dat; }  // 向INA226寫入數據 void INA226_WriteReg(unsigned char reg, unsigned int data) {     I2C_Start();     I2C_SendByte(INA226_ADDR << 1);  // 發送地址和寫位     I2C_SendByte(reg);               // 發送寄存器地址     I2C_SendByte(data >> 8);         // 發送高8位數據     I2C_SendByte(data & 0xFF);       // 發送低8位數據     I2C_Stop(); }  // 從INA226讀取數據 unsigned int INA226_ReadReg(unsigned char reg) {     unsigned int data;     unsigned char high, low;          I2C_Start();     I2C_SendByte(INA226_ADDR << 1);  // 發送地址和寫位     I2C_SendByte(reg);               // 發送寄存器地址     I2C_Start();     I2C_SendByte((INA226_ADDR << 1) | 0x01);  // 發送地址和讀位          high = I2C_ReceiveByte();  // 讀取高8位     I2C_Ack();     low = I2C_ReceiveByte();   // 讀取低8位     I2C_NAck();     I2C_Stop();          data = (high << 8) | low;     return data; }  // 初始化INA226 void INA226_Init() {     // 配置寄存器: 16次平均, 1.1ms轉換時間(總線), 1.1ms轉換時間(分流), 連續測量模式     INA226_WriteReg(INA226_REG_CONFIG, 0x4527);          // 校準寄存器 (根據實際分流電阻調整,這里假設0.1歐)     // 校準值 = 0.00512 / (分流電阻 * 電流LSB)     // 電流LSB = 期望最大電流 / 2^15     // 這里設置電流LSB為1mA (最大電流32.768A)     INA226_WriteReg(INA226_REG_CALIBRATION, 0x0A00); }  // 讀取總線電壓 (mV) float INA226_ReadBusVoltage() {     unsigned int data;     data = INA226_ReadReg(INA226_REG_BUSVOLTAGE);     // 總線電壓分辨率為1.25mV,左移3位     return (data >> 3) * 1.25; }  // 讀取分流電壓 (uV) float INA226_ReadShuntVoltage() {     signed int data;     data = (signed int)INA226_ReadReg(INA226_REG_SHUNTVOLTAGE);     // 分流電壓分辨率為2.5uV     return data * 2.5; }  // 讀取電流 (mA) float INA226_ReadCurrent() {     signed int data;     data = (signed int)INA226_ReadReg(INA226_REG_CURRENT);     // 電流LSB為1mA (由校準寄存器設置)     return data * 1.0; }  // 讀取功率 (mW) float INA226_ReadPower() {     unsigned int data;     data = INA226_ReadReg(INA226_REG_POWER);     // 功率LSB為25mW (由校準寄存器設置,是電流LSB的25倍)     return data * 25.0; }  // 初始化UART用于輸出數據 void UART_Init() {     SCON = 0x50;  // 8位數據, 可變波特率     TMOD &= 0x0F;     TMOD |= 0x20;  // 定時器1工作在模式2     TL1 = 0xFD;    // 波特率9600 (11.0592MHz)     TH1 = 0xFD;     ET1 = 0;       // 禁止定時器1中斷     TR1 = 1;       // 啟動定時器1     ES = 0;        // 禁止UART中斷 }  // 發送一個字符 void UART_SendChar(unsigned char c) {     SBUF = c;     while(!TI);     TI = 0; }  // 發送字符串 void UART_SendString(unsigned char *str) {     while(*str)     {         UART_SendChar(*str++);     } }  // 發送浮點數 void UART_SendFloat(float num, unsigned char decimal_places) {     unsigned long integer_part;     unsigned long fractional_part;     unsigned char i;          // 處理負數     if(num < 0)     {         UART_SendChar('-');         num = -num;     }          // 提取整數部分     integer_part = (unsigned long)num;          // 提取小數部分     fractional_part = 0;     for(i = 0; i < decimal_places; i++)     {         num = (num - integer_part) * 10;         fractional_part = fractional_part * 10 + (unsigned long)num;         integer_part = (unsigned long)num;     }          // 發送整數部分     if(integer_part == 0)     {         UART_SendChar('0');     }     else     {         // 用于反轉數字的緩沖區         unsigned char buf[10];         unsigned char len = 0;                  while(integer_part > 0)         {             buf[len++] = '0' + (integer_part % 10);             integer_part /= 10;         }                  // 反轉并發送         for(i = len; i > 0; i--)         {             UART_SendChar(buf[i-1]);         }     }          // 發送小數點和小數部分     if(decimal_places > 0)     {         UART_SendChar('.');                  // 處理小數部分前導零         unsigned long temp = fractional_part;         unsigned char frac_len = 0;                  if(temp == 0)         {             frac_len = decimal_places;         }         else         {             while(temp > 0)             {                 frac_len++;                 temp /= 10;             }                          // 補零             for(i = 0; i < decimal_places - frac_len; i++)             {                 UART_SendChar('0');             }         }                  // 發送小數部分         UART_SendString("000000");  // 最多支持6位小數         // 注意:這里簡化處理,實際應用中應正確轉換fractional_part     } }  void main() {     float voltage, current, power;          // 初始化外設     UART_Init();     INA226_Init();          UART_SendString("INA226 Test Program\r\n");          while(1)     {         // 讀取數據         voltage = INA226_ReadBusVoltage();         current = INA226_ReadCurrent();         power = INA226_ReadPower();                  // 發送數據到UART         UART_SendString("Voltage: ");         UART_SendFloat(voltage / 1000, 2);  // 轉換為V         UART_SendString("V, Current: ");         UART_SendFloat(current, 2);         // mA         UART_SendString("mA, Power: ");         UART_SendFloat(power / 1000, 2);    // 轉換為W         UART_SendString("W\r\n");                  // 延時約1秒         {             unsigned int i, j;             for(i = 0; i < 1000; i++)                 for(j = 0; j < 1000; j++)                     _nop_();         }     } }
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表