0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于NodeMCU的采样电路设计

冬至子 来源:crazstom 作者:crazstom 2023-11-08 14:47 次阅读

前言

毕设需要测量一个电路的电压和电流,从而计算出来功率。这个电路是和移动设备绑在一起的,所以测量的信号要通过WiFi传递出来。而接收信号的方法,可以是网页接收或者app,app太复杂了,所以写一个前端小网页要简单得多。

1. 硬件设计

硬件电路主要就是一个采样电路和一个单片机:NodeMCU

1.1. 采样电路

图片

这个采样电路的作用就是让需要采样的数据从它流过,然后采集返回数据。

电路图的上半部分就是对经过的电压电流采样的电路。P1输入的电压范围为010V,所以在红框1中使用两个20kΩ的分压电阻使得采样的电压范围为05V,为什么分压到这个范围,是因为之后的ADS1115只能采样到0~VCC的电压,而该芯片的电压在该电路中设计为5V。如果输入电压范围更宽的话,可以适当调整分压电阻的大小。

红框1中还有一个电流采样点R3,它是0.2Ω的采样电阻,这样会将电流转化为电压信号,传递给ADS1115采样。在这个电路中,如果过3A的电流,采样电阻上就有0.6V的电压传递给ADS1115。采样电阻可以更大,这样采得的电流数据就更准确。但是,电阻太大导致损耗也会增大,同时压降也会很大。主电路是要给后续设备供电的,采样压降太大,后续设备也会受影响。

红框2中就是采样信号的芯片:ADS1115,它有四个采样脚,可以差分采样和单独采样。通过SCL和SDA两个管脚以I2C的方式和单片机连接,从而将采样的信号传输出去。在本文中,单片机用的是NodeMCU。

采样电路通过稳压芯片产生一路5V输出给NodeMCU供电,同时SCL、SDA两个管脚接受NodeMCU的控制,将采样数据传递出去。

1.2. NodeMCU

NodeMCU是一个开源的物联网平台。它使用Lua脚本语言编程。该平台基于eLua开源项目,底层使用ESP8266 sdk 0.9.5版本。该平台使用了很多开源项目,例如 lua-cjson,spiffs。NodeMCU包含了可以运行在esp8266 WiFi SoC芯片之上的固件,以及基于ESP-12模组的硬件。

本文中使用的是D1 mini版的NodeMCU,该开发板上集成了esp8266芯片,它可以用来产生热点或者连接WiFi,从而构成一个服务器。这个开发板可以让开发者arduino的方式进行编程设计,只不过需要在arduino IDE上导入对应的开发板即可。

图片

2. 软件设计

2.1. arduino ide添加开发板

进入arduino ide的首选项

图片

回到主面板,进入"工具->开发板->开发板管理器",在如下图中输入esp:

图片

安装即可实现新开发板的添加。

在开发板中就可以看到NodeMCU的选择。

图片

2.2. 建立网络

arduino有相关的ESP8266WIFI库来操作WiFi,建立网络。

首先,这个开发板既可以连接WiFi,也可以创建热点让其他设备连接。两种方式都可以为之后的服务器做准备。

2.2.1. 连接WiFi

首先导入ESP8266WiFi.h头文件,该文件可以在库管理中添加WiFi库获得。

setup函数中通过WiFi.begin(ssid, password);发起连接WiFi的调用,然后通过while不断轮询WiFi.status()检测是否连接成功。

如果连接成功,在串口上打印出它获得的IP。

// Import required libraries
#include < ESP8266WiFi.h >


// WiFi parameters
const char* ssid = "MI8pro";
const char* password = "12345600";


void setup(void)
{
  // Start Serial
  Serial.begin(115200);

  // Connect to WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {
}

2.2.2. 开启热点

使用NodeMCU产生一个热点,因为NodeMCU没有和外部网络连接,所以这个热点是局域网式的。

很简单,就是在setup中通过WiFi.softAP函数来开启热点。

在此基础上可以进一步实现网络的连接。可以在2.2.1节代码中添加重试次数,如果重试多次还无法连接到对应WiFi,就自己建立热点。

不过后期,为了便捷开发,只是使用WiFi连接来建立网络。

#include < ESP8266WiFi.h >


IPAddress local_IP(192,168,0,100);
IPAddress gateway(192,168,0,100);
IPAddress subnet(255,255,255,0);


void setup()
{
  Serial.begin(115200);
  Serial.println();


  Serial.print("Setting soft-AP configuration ... ");
  Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Ready" : "Failed!");


  Serial.print("Setting soft-AP ... ");
  Serial.println(WiFi.softAP("ESPsoftAP", "12345600", 1, false, 10) ? "Ready" : "Failed!");


  Serial.print("Soft-AP IP address = ");
  Serial.println(WiFi.softAPIP());
}


void loop() {}

2.3. 服务器

arduino也有相应的库来建立HTTP服务器。

这个服务器主要处理两个路径的请求://get。其中,根目录就是返回给浏览器一个网页,而网页中会通过js不停向/get发送请求,获取采集的电压电流等数据。

网页如下。

< !DOCTYPE html >
< script src='https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js' >< /script >
< h1 >current and voltage sample< /h1 >
< br/ >
< body >
< script type='text/javascript' >
    $(function () {
        setInterval(reflush, 1000)
    })
    function reflush() {
        $.getJSON('./get', function(json) {
            //解决原生js更新数据产生页面闪烁的问题
            $('#tmp')[0].innerHTML = json.voltage
            $('#voltage').html($('#tmp').html())


            $('#tmp')[0].innerHTML = json.current
            $('#current').html($('#tmp').html())


            $('#tmp')[0].innerHTML = json.power
            $('#power').html($('#tmp').html())


            $('#tmp')[0].innerHTML = json.serial
            $('#serial').html($('#tmp').html())
        })
    }
< /script >
    < label id='tmp' hidden >< /label >
    < label >voltage: < /label >
    < b >
        < i >
            < label id='voltage' >0.00< /label >
        < /i >
    < /b >
    V< br/ >
    < label >current: < /label >
    < b >
        < i >
            < label id='current' >0.00< /label >
        < /i >
    < /b >
    A< br/ >
    < label >power: < /label >
    < b >
        < i >
            < label id='power' >0.00< /label >
        < /i >
    < /b >
    W< br/ >
    < label >serial-number: < /label >
    < b >
        < i >
            < label id='serial' >0.00< /label >
        < /i >
    < /b >
< /body >

首先导入头文件,并定义全局变量server并定义对应的handler。在handleRoot中会直接将上述网页返回,而在handleGet中会将电压、电流、功率等数据通过json的形式返回给客户端。为了表示数据的实时性,还附带了一个序列号,序列号在网页上的变化,表示了数据是实时接收的。

#include < ESP8266WebServer.h >
#include < ArduinoJson.h >


//Web Server
ESP8266WebServer server(8080);


void handleRoot() {
  server.send(200, "text/html", rootpage);  
}
void handleGet() {
  StaticJsonDocument< 100 > json;
  json["voltage"] = voltage;
  json["current"] = current;
  json["power"] = power;
  char serial[100];
  sprintf(serial, "0x%x", millis());
  json["serial"] = serial;
  char msg[measureJson(json) + 1];
  serializeJson(json, msg, measureJson(json) + 1);
  server.send(200, "text/plain", msg);
  Serial.printf("handleGet: %sn", msg);
}

然后在setup()函数中配置对应的handler。

server.on("/", HTTP_GET, handleRoot);
  server.on("/get", HTTP_GET, handleGet);
  server.begin();

loop()函数中处理客户端的请求,其实也就是调用一个函数,在loop这个死循环中不停处理请求。

//server处理客户端的请求
  server.handleClient();

2.4. 采样

采样是通过arduino的一个ADS1115库来实现的,也是很简单。

首先导入需要的库,并实例化一些对象。

#include < Adafruit_ADS1015.h >


// 电压电流测量
Adafruit_ADS1115 ads(0x48);
float voltage = 5.00;
float current = 1.11;
float power = voltage * current;

setup()函数中开启ADS芯片,这个是很重要的。

ads.begin();

然后在loop()函数中,获取硬件电路中的ADS1115芯片四个采样脚的电压,进一步获得电压和电流值,0.1875是电压因数。

因为ADS采样脚的输入阻抗问题,测得的电压值和实际的电压值是有偏移的,不过是线性偏移。只要求两组采样值x和实际值y,然后通过y=ax+b来求得其系数。

//ADC电压电流采集,功率计算
  int16_t adc0, adc1, adc2, adc3;
  adc0 = ads.readADC_SingleEnded(0);
  adc1 = ads.readADC_SingleEnded(1);
  adc2 = ads.readADC_SingleEnded(2);
  adc3 = ads.readADC_SingleEnded(3);
  // AD测得的值
  voltage = ((adc0 - adc1) * 0.1875) / 1000;
  current = (adc3 - adc2)*0.1875 / 1000;


  //矫正,通过取两个点求斜率y=ax+b,a=2.028,b=1.1568,x是测量值,y是实际输入电压值
  voltage = 2.028 * voltage + 1.1568;
  //current就是测得的电压除以采样电阻0.2
  current = current * 5;

  power = voltage * current;
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 采样电路
    +关注

    关注

    10

    文章

    63

    浏览量

    28160
  • SDA
    SDA
    +关注

    关注

    0

    文章

    122

    浏览量

    27555
  • 分压电阻
    +关注

    关注

    0

    文章

    18

    浏览量

    11478
  • ESP8266
    +关注

    关注

    50

    文章

    947

    浏览量

    43939
  • NODEMCU
    +关注

    关注

    13

    文章

    289

    浏览量

    21000
收藏 人收藏

    评论

    相关推荐

    智能电表中的电流与电压采样电路设计

    其中R57、R56为采样电阻,C21、C22为采样电容,他们为采样通道提供了采样电压信号,采样电压信号的大小由分流器的阻值和流过其上的电流决
    发表于 09-25 11:18 3.2w次阅读
    智能电表中的电流与电压<b class='flag-5'>采样</b><b class='flag-5'>电路设计</b>

    采样保持电路图(五款采样保持电路设计原理图详解)

    本文主要介绍了采样保持电路图大全(五款采样保持电路设计原理图详解),采样保持电路(
    发表于 02-23 09:59 9.7w次阅读
    <b class='flag-5'>采样</b>保持<b class='flag-5'>电路</b>图(五款<b class='flag-5'>采样</b>保持<b class='flag-5'>电路设计</b>原理图详解)

    采样保持电路设计及其工作原理

    主要是关于:采样保持名词解释、采样保持电路工作原理、采样保持电路功能、采样保持
    发表于 10-20 09:37 5364次阅读

    高压采样电路设计与考虑

    采样框图 主要包括分压电路,滤波电路,ADC(这里只是做了一个简单的示意) 实际应用考虑点 1.输入电压范围与电阻电压: 因为交流或直流高压系统中电压平台相对而言都比较高,所以在电阻选型时必须要 考虑到电阻的耐压等级,常规的
    的头像 发表于 12-28 09:56 6750次阅读
    高压<b class='flag-5'>采样</b><b class='flag-5'>电路设计</b>与考虑

    求分享NODEMcu ADC参考电压的相关资料

    信息。 我发现它是一种 SAR ADC 类型,它的测量范围从 0V 到 1V(忽略 NODEMcu 分压器),它具有 10 位分辨率,并且在使用 wi-fi 时可以达到 1kps 的采样率。我没有找到有关电压参考源、精度和使用外部电路
    发表于 05-29 08:36

    多通道采样电路结构

    多通道采样电路结构 由于输入信号的数目,输入信号的电平和采样速度快慢的不同,多通道采样电路的结构不
    发表于 05-23 18:54 982次阅读
    多通道<b class='flag-5'>采样</b><b class='flag-5'>电路</b>结构

    多通道采样电路

    多通道采样电路 图5.4-75是一个多通道采样电路的实例。它由16通道模拟开关AD7506型芯片,采样
    发表于 05-24 10:33 2987次阅读
    多通道<b class='flag-5'>采样</b><b class='flag-5'>电路</b>

    交流电压采样电路设计

    本文为大家带来交流电压采样电路设计
    发表于 12-23 10:38 9.5w次阅读
    交流电压<b class='flag-5'>采样</b><b class='flag-5'>电路设计</b>

    高频交流信号采样电路设计

    电路适合电压采样也适合电流采样,图中的变压器,用于电压采样,则是变压器,用于电流采样,则是电流互感器,变压器与互感器可以认为是相反使用的,
    的头像 发表于 03-11 15:56 9966次阅读

    高精度电流采样电路设计要点的详细说明

    本文档的主要内容详细介绍的是高精度电流采样电路设计要点的详细说明。
    发表于 12-15 08:00 82次下载
    高精度电流<b class='flag-5'>采样</b><b class='flag-5'>电路设计</b>要点的详细说明

    使用Arduino开发NodeMcu

    NodeMcu的基本介绍,使用Aduino进行开发,使用NodeMcu运行亮灯、打印窗口消息等例子。
    发表于 10-25 12:51 20次下载
    使用Arduino开发<b class='flag-5'>NodeMcu</b>

    电压采集采样电路设计

    电压的采集是我们进行电路设计常常用到的,具体的采集类型上又分为直流采集和交流采集,将源电压通过一系列的电路设计,最终通过AD(数模转换芯片或单片机内部AD)读入MCU,并执行相应的决策,是我们大多
    发表于 11-05 16:05 150次下载
    电压采集<b class='flag-5'>采样</b><b class='flag-5'>电路设计</b>

    AN4076_三相逆变器中基于两个或三个采样电阻的电流检测电路设计

    AN4076_三相逆变器中基于两个或三个采样电阻的电流检测电路设计
    发表于 11-21 17:07 1次下载
    AN4076_三相逆变器中基于两个或三个<b class='flag-5'>采样</b>电阻的电流检测<b class='flag-5'>电路设计</b>

    高压采样电路设计注意事项

    不管在交流系统还是在直流系统的应用中,高压采样一直是一个绕不开的话题,新能源汽车中高压采样有电池包内部的总电池高压采样,高压继电器前后端高压采样,电驱母线高压
    的头像 发表于 03-29 12:03 1127次阅读
    高压<b class='flag-5'>采样</b><b class='flag-5'>电路设计</b>注意事项

    如何设计边沿采样的触发器呢?

    在设计双边沿采样电路(Dual-edge triggered flip-flop)之前,先从单边沿采样电路设计(Edge capture register)开始。
    的头像 发表于 06-05 16:27 912次阅读
    如何设计边沿<b class='flag-5'>采样</b>的触发器呢?