ESP8266+BL0937电能计量芯片

1. BL0937计量芯片的介绍

BL0937的应用电路图
BL0937的外围电路图

2. ESP8266与BL0937芯片的引脚连接

ESP引脚 BL0937引脚
GPIO3 SEL
GPIO4 CF
GPIO5 CF1

3. 程序设计思路

  1. 采用系统时间实现单周期测量
    假设GPIO外部中断类型为下降沿触发,设下降沿数量为num=0,则测量逻辑如下所示:
下降沿个数 周期数
1 0
2 1

故在第一个下降沿到来和第二个下降沿到来时获取系统时间,此为单周期时间,然后清零重新计数。多个外部中断时需要注意不同外部中断的下降沿时间间隔,防止持续进入某个外部中断。
2. 采用定时器实现平均测量
定时器测量时需要注意应该采用硬件定时器,时钟源为NMI时钟源,此时钟源优先级高于外部中断,可保证定时的准确性。
4. 需要注意的问题
打开中断之后,下降沿可能不会立即触发中断,一种是加延时,具体时间要根据负载而定;一种方法是执行while循环,判断计时时间是否到达。总的来说,整个过程对于周期的测量并不准确,误差在2以内。
5. 功率电能完整代码

/** Time_PW.c**  Created on: 2019年9月4日*      Author: 49403*/#include "user_main.h"#include "osapi.h"
#include "os_type.h"
#include "driver/uart.h"
#include "user_interface.h"
#include "spi_flash.h"
#include "espconn.h"
#include "user_config.h"
#include "hal_key.h"
#include "tosee_common.h"
#include "tosee_led.h"
#include "config.h"
#include "power.h"
#include "test.h"
#include "ets_sys.h"
#include "ip_addr.h"
#include "mem.h"
#include "user_main.h"
#include "hw_timer.h"int num1;  //功率脉冲
int num2;  //电能脉冲
float Fcf;   //功率
float P;  //W,kWH
float W;//定义电压电流转换系数
int Kp = 15;
int Kw = 10;
int flag=0;
int flag1=0;void ICACHE_FLASH_ATTR bl_interrupt()
{unsigned int gpio_status = 0;gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS); //获取中断状态ETS_GPIO_INTR_DISABLE();  //关中断//GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status); //清中断标志位if(gpio_status & BIT(4)){num1=num1+1;  //PW 脉冲个数num2=num2+1;}GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);if(flag==0){ETS_GPIO_INTR_ENABLE();}else{ETS_GPIO_INTR_DISABLE();}
}
void ICACHE_FLASH_ATTR PW_handler()
{if (Fcf < 6780){P = Fcf * Kp;  //WW = num2 * Kw;  //kWhflag1=1;}else {P = 0;   //P=0标志过流W = num2 * Kw;  //kWhflag1=1;}
}
void hw_test_timer_cb(void)
{flag=1;
}
void ICACHE_FLASH_ATTR hz_handler()
{Fcf=num1/5.0; //Hz
}
void ICACHE_FLASH_ATTR pw_init()
{PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);GPIO_DIS_OUTPUT(4);//GPIO4和GPIO5使能上拉PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO4_U);//GPIO4中断配置ETS_GPIO_INTR_DISABLE();ETS_GPIO_INTR_ATTACH(&bl_interrupt, NULL);gpio_pin_intr_state_set(GPIO_ID_PIN(4), GPIO_PIN_INTR_NEGEDGE);//硬件定时器hw_timer_init(1,0);hw_timer_set_func(hw_test_timer_cb);hw_timer_arm(2000000);  //us,2sETS_GPIO_INTR_ENABLE();  //开中断while(1){if(flag==1){ETS_GPIO_INTR_DISABLE();hz_handler();PW_handler();os_printf("P=%d,W=%d,num1=%d,num2=%d------\n",P,W,num1,num2);if(flag1==1){num1=0;}
}
}
}

7.电压电流测量完整代码

/** Time_UI.c**  Created on: 2019年9月4日*      Author: 49403*/#include "ets_sys.h"
#include "osapi.h"
#include "ip_addr.h"
#include "espconn.h"
#include "mem.h"
#include "user_interface.h"
#include "smartconfig.h"
#include "airkiss.h"
#include "driver/uart.h"
#include "hw_timer.h"int num0 = 0;  //电流电压脉冲
float Fcf1 = 0;  //电流电压Hz
int U=0;
int I=0;   //V,mA//定义电压电流转换系数
int Ku = 220;
float Ki = 0.18;
int flag=0;
int flag1=0;/** 脉冲中断计数函数*/
void ICACHE_FLASH_ATTR bl_interrupt()
{unsigned int gpio_status = 0;gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS); //获取中断状态ETS_GPIO_INTR_DISABLE();  //关中断//GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status); //清中断标志位if(gpio_status & BIT(5)){num0 = num0 + 1;}GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);if(flag==0){ETS_GPIO_INTR_ENABLE();}else{ETS_GPIO_INTR_DISABLE();}
}
void ICACHE_FLASH_ATTR bl_select()
{if(GPIO_ID_PIN(3)==0){I = Fcf1 * Ki;  //mAGPIO_OUTPUT_SET(GPIO_ID_PIN(3), 1);}else{GPIO_OUTPUT_SET(GPIO_ID_PIN(3), 0);U = Fcf1 * Ku;  //mA}flag1=1;
}
void hw_test_timer_cb(void)
{flag=1;
}
void ICACHE_FLASH_ATTR hz_handler()
{Fcf1=num0/1.0; //Hz
}
void ICACHE_FLASH_ATTR Time_UI_init()
{PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_GPIO3);PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, FUNC_GPIO5);GPIO_DIS_OUTPUT(5);GPIO_OUTPUT_SET(GPIO_ID_PIN(3), 0);  //GPIO3=0//GPIO4和GPIO5使能上拉PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO5_U);//GPIO5中断配置ETS_GPIO_INTR_DISABLE();ETS_GPIO_INTR_ATTACH(&bl_interrupt, NULL);gpio_pin_intr_state_set(GPIO_ID_PIN(5), GPIO_PIN_INTR_NEGEDGE);//硬件定时器hw_timer_init(1,0);hw_timer_set_func(hw_test_timer_cb);hw_timer_arm(2000000);  //us,2sETS_GPIO_INTR_ENABLE();  //开中断while(1){if(flag==1){ETS_GPIO_INTR_DISABLE();hz_handler();bl_select();if(flag1==1){num0=0;}}
}
}

8. 需要解决的问题

  1. 计算问题
    ESP8266的基础计算没有了解过,但是在整个程序中发现计算有误。(1)中断执行函数中{num1=num1+1; num2=num2+1;},这两句程序只会执行第一个,不明白什么原因;(2)主程序中最后判断是否对num1清零。这条程序会先于hz_handler()和PW_handler()函数执行。虽然执行条件未达到。这个也不明白;(3)貌似ESP8266会优先执行赋值语句;同一个函数下两条计算语句会只执行第一条。
  2. 参数类型问题
    默认P=x.x(W),W=x.xx(kWh)。那么设置计算函数的时候要注意各个参数的类型。
float P,W;
int num1,num2;
float Fcf,Kp,Kw;
Fcf=num1/2.0;
P=Kp*Fcf;
W=num2*Kw;

ESP8266+电能计量芯片相关推荐

  1. 电能计量芯片应用心得之选型篇

    电能计量芯片应用心得之选型篇 什么是计量芯片 计量芯片是测量交流电信号的一类芯片,因最早是使用于电表产品,所以在行业内也俗称电表芯片,它可以统计用电负载的用电量.测量用电负载的功率大小和电流大小,以及 ...

  2. 免校准的电量计量芯片_【应用】基于高精度免校准电能计量芯片CSE7761的漏电保护设计,可支持单芯片两路计量...

    随着家电产业开始步入物联网时代,终端企业也开始借助更为智能的手段来保障电器的使用安全,如电器电能监测.过载检测.故障预警等等,使得电能计量芯片开始崭露头角.本文将介绍 漏电是由于电器外壳和市电火线间因 ...

  3. 免校准的电量计量芯片_技术 | 免校准电能计量芯片,让家电智能化更简单

    物联网时代,随着人们对节能环保,以及电器安全使用意识的提高,"能源智慧管理"."设备故障预判"."智能诊断"成为了智能电器产品的热门口号. ...

  4. 免校准的电量计量芯片_免校准电能计量芯片,让家电智能化更简单

    原标题:免校准电能计量芯片,让家电智能化更简单 物联网时代,随着人们对节能环保,以及电器安全使用意识的提高,"能源智慧管理"."设备故障预判"."智能 ...

  5. cse7761电能计量芯片驱动程序

    stm32+CSE7761电能芯片驱动 这篇文章介绍CSE7761电能计量芯片的驱动和应用的部分程序,如需要完整解决方案(电压.电流.功率.电量.过载.过零.漏电),请私信. spi引脚配置 GPIO ...

  6. 电能计量芯片HLW8110/HLW8112

    电能计量芯片HLW8110/HLW8112 芯片特性 ²  工作电压:3.3V/5.0V ²  免校准 ²  UART/SPI通讯方式 ²  内置晶振 ²  漏电检测 ²  内置温度传感器 ²  一路 ...

  7. 基于专用电能计量芯片的纯电动汽车充电桩设计

    目录 摘要 1 关键词 1 Abstract 2 Keywords:electric vehicle,AC charging spot,battery management system,Lab VI ...

  8. Ht7038 三相电能计量芯片 测量6路电流。

    芯片上电之后默认使能校表数据写操作和计量数据读操作,也就是芯片配置写操作和数据读操作. 也就是0xC9和0xC6的功能码. SPI写0xC9(1字节),数据 = 0x00005A(3字节)是开启写校表 ...

  9. 免校准的电量计量芯片_单相电能表如何校准(单相电能计量芯片+MCU)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 单相电能表的校准方法: 1 接线 1.1 将电压线接到被校电能表的电压进线端,如果电压线不好接,也可以接在插座.保险盒.闸刀等处,直接取出电压,所配电压线 ...

最新文章

  1. JAVA写出来的塔防能有多好玩?......真香!
  2. linux 启动两个摄像头,Linux:(多摄像头)如何运行指定的摄像头
  3. sql if 和insert_拼多多面试:Mybatis是如何实现SQL语句复用功能的?
  4. 正则表达式中原子的5种类型
  5. 在Ubuntu 14.04上安装 Webmin
  6. matlab 基于小波变换的图像压缩,基于Matlab的小波变换在图像压缩中的应用
  7. Linux下使用SSH连接远端服务器技术总结
  8. python画简便的图-python的pyecharts绘制各种图表详细(附代码)
  9. 拓端tecdat|R语言BUGS/JAGS贝叶斯分析: 马尔科夫链蒙特卡洛方法(MCMC)采样
  10. 网站联系表单,honeypot蜜罐理论及操作技术,诱饵机器人
  11. c语言负数左移右移_C语言负数的移位运算
  12. Lighttools中模拟白光LED
  13. 国产手机 不只是老罗一张嘴
  14. 《亲自动手写一个深度学习框架》-专题视频课程-广州市老刘
  15. cesium教程-3(显示高度,海拔,经度,纬度)
  16. hdu2907 凸包+简单搜索
  17. 50个Java多线程面试题
  18. P1258 小车问题(二分法)
  19. python读取xlsx文件pandas_pandas dataframe 读取 xlsx 文件
  20. java虚拟机线程调优与底层原理分析_啃碎并发(七):深入分析Synchronized原理...

热门文章

  1. 计算机专业知识教学,2016计算机专业知识:计算机的分类(一)
  2. 高校wifi认证登录
  3. 3d17340期计算机开机号,便民工作室提供--中国福彩中-心开机号114开机号
  4. 赛迪顾问《中国云计算市场研究年度报告》发布:“技术+服务”两手抓 华云数据成为云计算领域的重要核心厂商
  5. xp升级到win7傻瓜教程_最简单xp一键升级win7重装
  6. 项目 编码规则(编写代码规则)
  7. uniapp 获取到当前位置信息显示在地图上
  8. ht城市介绍人口数量Html,城市人口热力图 城市热力图查询
  9. quickbuild php,通过与Quickbuild和Mist.io的持续集成实现云管理和使用监控
  10. FCC 中级算法题 罗马数字转换器