找回密码
 立即注册
查看: 286|回复: 5

开源:INA226+STC8H1K08做的一个电压电流功率计

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:114
  • 最近打卡:2026-03-07 09:00:07
已绑定手机

1

主题

1

回帖

246

积分

中级会员

积分
246
发表于 2025-12-30 11:18:22 | 显示全部楼层 |阅读模式
基于INA226+STC8H1K08的电压电流功率表,
可检测实时电压电流功率和最大最小电压电流功率,
还实现了某个时间内总功率(wh)。
看视频(本视频是无大小功率版本,有大小功率的没录):



原理图:
截图202512301327054643.jpg

pcb:
截图202512301329463624.jpg
截图202512301327216585.jpg
截图202512301331289550.jpg
截图202512301331449553.jpg
截图202512301330198137.jpg
截图202512301330324268.jpg

实物图:
截图202512301116546471.jpg
截图202512301117293230.jpg

亚克力做了个外壳

微信图片_20260209163908_15_14.jpg 微信图片_20260209163909_17_14.jpg 微信图片_20260209163911_18_14.jpg 微信图片_20260209163912_19_14.jpg




代码片段

volatile uint16_t tick_1ms;

static uint16_t ms = 0;
static uint8_t ms10_acc = 0;  // 10ms 计数
static uint8_t ms200_acc = 0; // 200ms 计数

static uint32_t run_seconds = 0;

// 测量值
static uint16_t V_inst = 0, I_inst = 0;
static uint16_t V_max = 0, V_min = 0xFFFF;
static uint16_t I_max = 0, I_min = 0xFFFF;
static uint32_t P_inst = 0;
static uint16_t P_max = 0, P_min = 0xFFFF;

// 功率平均用
static uint32_t P_sum = 0;
static uint16_t P_cnt = 0;

// 能量累计:单位 mW·秒(mWs)
static uint32_t energy_mWs = 0;

// 标记是否已采到第一个有效值
static uint8_t first_valid_sample = 1;

void Timer0_Isr(void) interrupt 1
{
    tick_1ms++;
}

void Timer0_Init(void) // 1毫秒@24.000MHz
{
    AUXR |= 0x80; // 1T mode
    TMOD &= 0xF0;
    TL0 = 0x40;
    TH0 = 0xA2;
    TF0 = 0;
    TR0 = 1;
    ET0 = 1;
}

void task_10ms(void)
{
    V_inst = INA226_ReadVoltage_mV();
    I_inst = INA226_ReadCurrent_mA();

    // 无电流时,功率为0,并跳过极值和累积
    if (I_inst == 0)
    {
        P_inst = 0;
        return;
    }

    P_inst = INA226_ReadPower_mW();

    // 第一次有效采样:初始化 min/max
    if (first_valid_sample)
    {
        V_max = V_min = V_inst;
        I_max = I_min = I_inst;
        P_max = P_min = P_inst;
        first_valid_sample = 0;
    }
    else
    {
        if (V_inst > V_max)
            V_max = V_inst;
        if (V_inst < V_min)
            V_min = V_inst;
        if (I_inst > I_max)
            I_max = I_inst;
        if (I_inst < I_min)
            I_min = I_inst;
        if (P_inst > P_max)
            P_max = P_inst;
        if (P_inst < P_min)
            P_min = P_inst;
    }

    // 累积功率(用于平均)
    P_sum += P_inst;
    P_cnt++;
}

void task_1s(void)
{
    if (P_cnt > 0)
    {
        uint32_t P_avg = P_sum / P_cnt; // 单位:mW
        energy_mWs += P_avg;
        run_seconds++;
        P_sum = 0;
        P_cnt = 0;
    }
}

void task_200ms(void)
{
    uint32_t energy_mWh = energy_mWs / 3600; // 显示时再转 mWh
    displayOled(V_inst,
                I_inst,
                (uint16_t)P_inst,
                V_max,
                V_min == 0XFFFF ? 0 : V_min,
                I_max,
                I_min == 0XFFFF ? 0 : I_min,
                P_max,
                P_min == 0XFFFF ? 0 : P_min,
                run_seconds,
                energy_mWh);
}

void main(void)
{
    uint16_t local;

    P1M0 = 0x00;
    P1M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;

    OledInit();
    INA226_Init();
    Timer0_Init();
    EA = 1;

    while (1)
    {
        EA = 0;
        local = tick_1ms;
        tick_1ms = 0;
        EA = 1;

        while (local--)
        {
            ms++;
            ms10_acc++;
            ms200_acc++;

            if (ms10_acc >= 50)
            {
                ms10_acc = 0;
                task_10ms();
            }

            if (ms200_acc >= 200)
            {
                ms200_acc = 0;
                task_200ms();
            }

            if (ms >= 1000)
            {
                ms = 0;
                task_1s();
            }
        }
    }
}



完整代码传下面了:

嘉立创开源地址:https://oshwhub.com/huyiwei/ina226






1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:334
  • 最近打卡:2026-03-06 15:37:09
已绑定手机

47

主题

259

回帖

2119

积分

金牌会员

积分
2119
发表于 2025-12-31 15:18:21 | 显示全部楼层
楼主有没有成品,或者散件。买一套学习一下
8位程序---换个STC32G.h头文件,换个C251编译器就直接到STC32的高度了;
          想回到8位机,则换个STC8H.h头文件,换个C51编译器就回到8位机了.
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:114
  • 最近打卡:2026-03-07 09:00:07
已绑定手机

1

主题

1

回帖

246

积分

中级会员

积分
246
发表于 2026-1-1 23:51:51 来自手机 | 显示全部楼层
East Wind 41 发表于 2025-12-31 15:18
楼主有没有成品,或者散件。买一套学习一下

成品有快递太贵了,建议自己做啊
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:723
  • 最近打卡:2026-03-05 18:57:26

3

主题

123

回帖

1972

积分

金牌会员

积分
1972
发表于 2026-1-30 09:20:44 | 显示全部楼层
这个漂亮!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:665
  • 最近打卡:2026-03-07 13:10:17

6

主题

320

回帖

2949

积分

金牌会员

积分
2949
发表于 2026-1-30 11:08:45 | 显示全部楼层
楼主好厉害
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-03-07 10:15:44
已绑定手机

3

主题

32

回帖

92

积分

注册会员

积分
92
发表于 昨天 14:57 | 显示全部楼层
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-3-7 16:49 , Processed in 0.712221 second(s), 77 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表