0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于NodeMCU的采樣電路設(shè)計(jì)

冬至子 ? 來(lái)源:crazstom ? 作者:crazstom ? 2023-11-08 14:47 ? 次閱讀

前言

畢設(shè)需要測(cè)量一個(gè)電路的電壓和電流,從而計(jì)算出來(lái)功率。這個(gè)電路是和移動(dòng)設(shè)備綁在一起的,所以測(cè)量的信號(hào)要通過(guò)WiFi傳遞出來(lái)。而接收信號(hào)的方法,可以是網(wǎng)頁(yè)接收或者app,app太復(fù)雜了,所以寫(xiě)一個(gè)前端小網(wǎng)頁(yè)要簡(jiǎn)單得多。

1. 硬件設(shè)計(jì)

硬件電路主要就是一個(gè)采樣電路和一個(gè)單片機(jī):NodeMCU。

1.1. 采樣電路

圖片

這個(gè)采樣電路的作用就是讓需要采樣的數(shù)據(jù)從它流過(guò),然后采集返回?cái)?shù)據(jù)。

電路圖的上半部分就是對(duì)經(jīng)過(guò)的電壓電流采樣的電路。P1輸入的電壓范圍為010V,所以在紅框1中使用兩個(gè)20kΩ的分壓電阻使得采樣的電壓范圍為05V,為什么分壓到這個(gè)范圍,是因?yàn)橹蟮?a target="_blank">ADS1115只能采樣到0~VCC的電壓,而該芯片的電壓在該電路中設(shè)計(jì)為5V。如果輸入電壓范圍更寬的話(huà),可以適當(dāng)調(diào)整分壓電阻的大小。

紅框1中還有一個(gè)電流采樣點(diǎn)R3,它是0.2Ω的采樣電阻,這樣會(huì)將電流轉(zhuǎn)化為電壓信號(hào),傳遞給ADS1115采樣。在這個(gè)電路中,如果過(guò)3A的電流,采樣電阻上就有0.6V的電壓傳遞給ADS1115。采樣電阻可以更大,這樣采得的電流數(shù)據(jù)就更準(zhǔn)確。但是,電阻太大導(dǎo)致?lián)p耗也會(huì)增大,同時(shí)壓降也會(huì)很大。主電路是要給后續(xù)設(shè)備供電的,采樣壓降太大,后續(xù)設(shè)備也會(huì)受影響。

紅框2中就是采樣信號(hào)的芯片:ADS1115,它有四個(gè)采樣腳,可以差分采樣和單獨(dú)采樣。通過(guò)SCL和SDA兩個(gè)管腳以I2C的方式和單片機(jī)連接,從而將采樣的信號(hào)傳輸出去。在本文中,單片機(jī)用的是NodeMCU。

采樣電路通過(guò)穩(wěn)壓芯片產(chǎn)生一路5V輸出給NodeMCU供電,同時(shí)SCL、SDA兩個(gè)管腳接受NodeMCU的控制,將采樣數(shù)據(jù)傳遞出去。

1.2. NodeMCU

NodeMCU是一個(gè)開(kāi)源的物聯(lián)網(wǎng)平臺(tái)。它使用Lua腳本語(yǔ)言編程。該平臺(tái)基于eLua開(kāi)源項(xiàng)目,底層使用ESP8266 sdk 0.9.5版本。該平臺(tái)使用了很多開(kāi)源項(xiàng)目,例如 lua-cjson,spiffs。NodeMCU包含了可以運(yùn)行在esp8266 WiFi SoC芯片之上的固件,以及基于ESP-12模組的硬件。

本文中使用的是D1 mini版的NodeMCU,該開(kāi)發(fā)板上集成了esp8266芯片,它可以用來(lái)產(chǎn)生熱點(diǎn)或者連接WiFi,從而構(gòu)成一個(gè)服務(wù)器。這個(gè)開(kāi)發(fā)板可以讓開(kāi)發(fā)者arduino的方式進(jìn)行編程設(shè)計(jì),只不過(guò)需要在arduino IDE上導(dǎo)入對(duì)應(yīng)的開(kāi)發(fā)板即可。

圖片

2. 軟件設(shè)計(jì)

2.1. arduino ide添加開(kāi)發(fā)板

進(jìn)入arduino ide的首選項(xiàng)

圖片

回到主面板,進(jìn)入"工具->開(kāi)發(fā)板->開(kāi)發(fā)板管理器",在如下圖中輸入esp:

圖片

安裝即可實(shí)現(xiàn)新開(kāi)發(fā)板的添加。

在開(kāi)發(fā)板中就可以看到NodeMCU的選擇。

圖片

2.2. 建立網(wǎng)絡(luò)

arduino有相關(guān)的ESP8266WIFI庫(kù)來(lái)操作WiFi,建立網(wǎng)絡(luò)。

首先,這個(gè)開(kāi)發(fā)板既可以連接WiFi,也可以創(chuàng)建熱點(diǎn)讓其他設(shè)備連接。兩種方式都可以為之后的服務(wù)器做準(zhǔn)備。

2.2.1. 連接WiFi

首先導(dǎo)入ESP8266WiFi.h頭文件,該文件可以在庫(kù)管理中添加WiFi庫(kù)獲得。

setup函數(shù)中通過(guò)WiFi.begin(ssid, password);發(fā)起連接WiFi的調(diào)用,然后通過(guò)while不斷輪詢(xún)WiFi.status()檢測(cè)是否連接成功。

如果連接成功,在串口上打印出它獲得的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. 開(kāi)啟熱點(diǎn)

使用NodeMCU產(chǎn)生一個(gè)熱點(diǎn),因?yàn)镹odeMCU沒(méi)有和外部網(wǎng)絡(luò)連接,所以這個(gè)熱點(diǎn)是局域網(wǎng)式的。

很簡(jiǎn)單,就是在setup中通過(guò)WiFi.softAP函數(shù)來(lái)開(kāi)啟熱點(diǎn)。

在此基礎(chǔ)上可以進(jìn)一步實(shí)現(xiàn)網(wǎng)絡(luò)的連接。可以在2.2.1節(jié)代碼中添加重試次數(shù),如果重試多次還無(wú)法連接到對(duì)應(yīng)WiFi,就自己建立熱點(diǎn)。

不過(guò)后期,為了便捷開(kāi)發(fā),只是使用WiFi連接來(lái)建立網(wǎng)絡(luò)。

#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. 服務(wù)器

arduino也有相應(yīng)的庫(kù)來(lái)建立HTTP服務(wù)器。

這個(gè)服務(wù)器主要處理兩個(gè)路徑的請(qǐng)求://get。其中,根目錄就是返回給瀏覽器一個(gè)網(wǎng)頁(yè),而網(wǎng)頁(yè)中會(huì)通過(guò)js不停向/get發(fā)送請(qǐng)求,獲取采集的電壓電流等數(shù)據(jù)。

網(wǎng)頁(yè)如下。

< !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更新數(shù)據(jù)產(chǎn)生頁(yè)面閃爍的問(wèn)題
            $('#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 >

首先導(dǎo)入頭文件,并定義全局變量server并定義對(duì)應(yīng)的handler。在handleRoot中會(huì)直接將上述網(wǎng)頁(yè)返回,而在handleGet中會(huì)將電壓、電流、功率等數(shù)據(jù)通過(guò)json的形式返回給客戶(hù)端。為了表示數(shù)據(jù)的實(shí)時(shí)性,還附帶了一個(gè)序列號(hào),序列號(hào)在網(wǎng)頁(yè)上的變化,表示了數(shù)據(jù)是實(shí)時(shí)接收的。

#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()函數(shù)中配置對(duì)應(yīng)的handler。

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

loop()函數(shù)中處理客戶(hù)端的請(qǐng)求,其實(shí)也就是調(diào)用一個(gè)函數(shù),在loop這個(gè)死循環(huán)中不停處理請(qǐng)求。

//server處理客戶(hù)端的請(qǐng)求
  server.handleClient();

2.4. 采樣

采樣是通過(guò)arduino的一個(gè)ADS1115庫(kù)來(lái)實(shí)現(xiàn)的,也是很簡(jiǎn)單。

首先導(dǎo)入需要的庫(kù),并實(shí)例化一些對(duì)象。

#include < Adafruit_ADS1015.h >


// 電壓電流測(cè)量
Adafruit_ADS1115 ads(0x48);
float voltage = 5.00;
float current = 1.11;
float power = voltage * current;

setup()函數(shù)中開(kāi)啟ADS芯片,這個(gè)是很重要的。

ads.begin();

然后在loop()函數(shù)中,獲取硬件電路中的ADS1115芯片四個(gè)采樣腳的電壓,進(jìn)一步獲得電壓和電流值,0.1875是電壓因數(shù)。

因?yàn)锳DS采樣腳的輸入阻抗問(wèn)題,測(cè)得的電壓值和實(shí)際的電壓值是有偏移的,不過(guò)是線(xiàn)性偏移。只要求兩組采樣值x和實(shí)際值y,然后通過(guò)y=ax+b來(lái)求得其系數(shù)。

//ADC電壓電流采集,功率計(jì)算
  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測(cè)得的值
  voltage = ((adc0 - adc1) * 0.1875) / 1000;
  current = (adc3 - adc2)*0.1875 / 1000;


  //矯正,通過(guò)取兩個(gè)點(diǎn)求斜率y=ax+b,a=2.028,b=1.1568,x是測(cè)量值,y是實(shí)際輸入電壓值
  voltage = 2.028 * voltage + 1.1568;
  //current就是測(cè)得的電壓除以采樣電阻0.2
  current = current * 5;

  power = voltage * current;
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 采樣電路
    +關(guān)注

    關(guān)注

    10

    文章

    63

    瀏覽量

    28277
  • SDA
    SDA
    +關(guān)注

    關(guān)注

    0

    文章

    124

    瀏覽量

    28084
  • 分壓電阻
    +關(guān)注

    關(guān)注

    0

    文章

    18

    瀏覽量

    11562
  • ESP8266
    +關(guān)注

    關(guān)注

    50

    文章

    962

    瀏覽量

    44757
  • NODEMCU
    +關(guān)注

    關(guān)注

    13

    文章

    289

    瀏覽量

    21265
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    采樣保持電路圖(五款采樣保持電路設(shè)計(jì)原理圖詳解)

    本文主要介紹了采樣保持電路圖大全(五款采樣保持電路設(shè)計(jì)原理圖詳解),采樣保持電路(
    發(fā)表于 02-23 09:59 ?10.1w次閱讀
    <b class='flag-5'>采樣</b>保持<b class='flag-5'>電路</b>圖(五款<b class='flag-5'>采樣</b>保持<b class='flag-5'>電路設(shè)計(jì)</b>原理圖詳解)

    采樣保持電路設(shè)計(jì)及其工作原理

    主要是關(guān)于:采樣保持名詞解釋、采樣保持電路工作原理、采樣保持電路功能、采樣保持
    發(fā)表于 10-20 09:37 ?6675次閱讀

    高壓采樣電路設(shè)計(jì)與考慮

    采樣框圖 主要包括分壓電路,濾波電路,ADC(這里只是做了一個(gè)簡(jiǎn)單的示意) 實(shí)際應(yīng)用考慮點(diǎn) 1.輸入電壓范圍與電阻電壓: 因?yàn)榻涣骰蛑绷鞲邏合到y(tǒng)中電壓平臺(tái)相對(duì)而言都比較高,所以在電阻選型時(shí)必須要 考慮到電阻的耐壓等級(jí),常規(guī)的
    的頭像 發(fā)表于 12-28 09:56 ?8394次閱讀
    高壓<b class='flag-5'>采樣</b><b class='flag-5'>電路設(shè)計(jì)</b>與考慮

    單片采樣保持電路

    單片采樣保持電路 現(xiàn)在已有多種單片采樣保持電路的產(chǎn)品。圖5.4-72是單片采樣保持電路LF39
    發(fā)表于 05-23 18:19 ?3207次閱讀
    單片<b class='flag-5'>采樣</b>保持<b class='flag-5'>電路</b>

    交流電壓采樣電路設(shè)計(jì)

    本文為大家?guī)?lái)交流電壓采樣電路設(shè)計(jì)。
    發(fā)表于 12-23 10:38 ?10w次閱讀
    交流電壓<b class='flag-5'>采樣</b><b class='flag-5'>電路設(shè)計(jì)</b>

    高頻交流信號(hào)采樣電路設(shè)計(jì)

    電路適合電壓采樣也適合電流采樣,圖中的變壓器,用于電壓采樣,則是變壓器,用于電流采樣,則是電流互感器,變壓器與互感器可以認(rèn)為是相反使用的,
    的頭像 發(fā)表于 03-11 15:56 ?1.1w次閱讀

    高精度電流采樣電路設(shè)計(jì)要點(diǎn)的詳細(xì)說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是高精度電流采樣電路設(shè)計(jì)要點(diǎn)的詳細(xì)說(shuō)明。
    發(fā)表于 12-15 08:00 ?86次下載
    高精度電流<b class='flag-5'>采樣</b><b class='flag-5'>電路設(shè)計(jì)</b>要點(diǎn)的詳細(xì)說(shuō)明

    使用Arduino開(kāi)發(fā)NodeMcu

    NodeMcu的基本介紹,使用Aduino進(jìn)行開(kāi)發(fā),使用NodeMcu運(yùn)行亮燈、打印窗口消息等例子。
    發(fā)表于 10-25 12:51 ?21次下載
    使用Arduino開(kāi)發(fā)<b class='flag-5'>NodeMcu</b>

    電壓采集采樣電路設(shè)計(jì)

    電壓的采集是我們進(jìn)行電路設(shè)計(jì)常常用到的,具體的采集類(lèi)型上又分為直流采集和交流采集,將源電壓通過(guò)一系列的電路設(shè)計(jì),最終通過(guò)AD(數(shù)模轉(zhuǎn)換芯片或單片機(jī)內(nèi)部AD)讀入MCU,并執(zhí)行相應(yīng)的決策,是我們大多
    發(fā)表于 11-05 16:05 ?159次下載
    電壓采集<b class='flag-5'>采樣</b><b class='flag-5'>電路設(shè)計(jì)</b>

    AN4076_三相逆變器中基于兩個(gè)或三個(gè)采樣電阻的電流檢測(cè)電路設(shè)計(jì)

    AN4076_三相逆變器中基于兩個(gè)或三個(gè)采樣電阻的電流檢測(cè)電路設(shè)計(jì)
    發(fā)表于 11-21 17:07 ?3次下載
    AN4076_三相逆變器中基于兩個(gè)或三個(gè)<b class='flag-5'>采樣</b>電阻的電流檢測(cè)<b class='flag-5'>電路設(shè)計(jì)</b>

    高壓采樣電路設(shè)計(jì)注意事項(xiàng)

    不管在交流系統(tǒng)還是在直流系統(tǒng)的應(yīng)用中,高壓采樣一直是一個(gè)繞不開(kāi)的話(huà)題,新能源汽車(chē)中高壓采樣有電池包內(nèi)部的總電池高壓采樣,高壓繼電器前后端高壓采樣,電驅(qū)母線(xiàn)高壓
    的頭像 發(fā)表于 03-29 12:03 ?1986次閱讀
    高壓<b class='flag-5'>采樣</b><b class='flag-5'>電路設(shè)計(jì)</b>注意事項(xiàng)

    如何設(shè)計(jì)邊沿采樣的觸發(fā)器呢?

    在設(shè)計(jì)雙邊沿采樣電路(Dual-edge triggered flip-flop)之前,先從單邊沿采樣電路設(shè)計(jì)(Edge capture register)開(kāi)始。
    的頭像 發(fā)表于 06-05 16:27 ?1331次閱讀
    如何設(shè)計(jì)邊沿<b class='flag-5'>采樣</b>的觸發(fā)器呢?

    什么是GBW?GBW對(duì)電源采樣電路有哪些影響?

    什么是GBW?GBW對(duì)電源采樣電路有哪些影響? GBW,或稱(chēng)為增益帶寬積,是指放大器的增益乘以其截止頻率。在電路設(shè)計(jì)中,GBW是一個(gè)非常重要的參數(shù),因?yàn)樗鼘?duì)放大器性能有很大的影響。本文將詳細(xì)探討
    的頭像 發(fā)表于 10-29 11:40 ?4376次閱讀

    硬件篇---電路設(shè)計(jì)之ADC采樣

    硬件篇---電路設(shè)計(jì)之ADC采樣 在現(xiàn)代電子領(lǐng)域中,模擬數(shù)字轉(zhuǎn)換器(ADC)扮演著關(guān)鍵的角色,作為將模擬信號(hào)轉(zhuǎn)換為數(shù)字形式的核心技術(shù)。ADC的出色性能和廣泛應(yīng)用使其成為數(shù)字系統(tǒng)、通信設(shè)備和各種傳感器
    的頭像 發(fā)表于 05-10 15:42 ?5753次閱讀
    硬件篇---<b class='flag-5'>電路設(shè)計(jì)</b>之ADC<b class='flag-5'>采樣</b>

    電流采樣電阻一般選多大 電流采樣與運(yùn)放電路

    電流采樣電阻在電子電路設(shè)計(jì)中扮演著至關(guān)重要的角色,其選擇不僅影響電路的性能,還直接關(guān)系到測(cè)量的準(zhǔn)確性和系統(tǒng)的穩(wěn)定性。 一、電流采樣電阻的基本原理 電流
    的頭像 發(fā)表于 10-07 15:13 ?805次閱讀
    電流<b class='flag-5'>采樣</b>電阻一般選多大 電流<b class='flag-5'>采樣</b>與運(yùn)放<b class='flag-5'>電路</b>圖