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

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

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

基于Arduino的PWM與紅外信號(hào)處理

CHANBAEK ? 來(lái)源:編程圈子 ? 作者:編程圈子 ? 2023-03-14 11:35 ? 次閱讀

一、基本概念

1. 脈寬調(diào)制

PWM(Pulse Width Modulation)即脈寬調(diào)制,是一種通過(guò)調(diào)節(jié)信號(hào)的占空比來(lái)控制電路的技術(shù)。 在 PWM 技術(shù)中,信號(hào)的周期保持不變,但是信號(hào)的占空比可以隨時(shí)間變化而改變。 當(dāng)信號(hào)的占空比為 0% 時(shí),表示信號(hào)一直處于低電平狀態(tài); 當(dāng)占空比為 100% 時(shí),表示信號(hào)一直處于高電平狀態(tài); 而在占空比為中間值時(shí),信號(hào)將以一定的頻率在低電平和高電平之間切換。

在電路應(yīng)用中,PWM 技術(shù)常用于控制電機(jī)的轉(zhuǎn)速、控制 LED 的亮度和顏色、實(shí)現(xiàn)音頻數(shù)字化等方面。 例如,在控制 LED 亮度時(shí),可以通過(guò)調(diào)節(jié) PWM 信號(hào)的占空比來(lái)控制 LED 的亮度,占空比越大,LED 燈亮度越高,反之亦然。

微控制器中,通過(guò)定時(shí)器和計(jì)數(shù)器等硬件模塊,可以實(shí)現(xiàn)高精度的 PWM 信號(hào)輸出。 許多單片機(jī)嵌入式系統(tǒng)都提供了 PWM 功能,并且在軟件層面提供了相應(yīng)的 API 和庫(kù)函數(shù),方便開(kāi)發(fā)者使用。 在使用 PWM 技術(shù)時(shí),需要根據(jù)具體的應(yīng)用場(chǎng)景選擇合適的 PWM 頻率和分辨率,以及合適的占空比范圍和切換速率,以達(dá)到最優(yōu)的控制效果。

2. ESP8266 的 PWM功能

ESP8266 是一款高度集成的 Wi-Fi SoC 芯片,內(nèi)部集成了許多硬件模塊,其中包括一個(gè)靈活的 PWM 控制器,即 LEDC(LED 控制器)。 LEDC 可以用于實(shí)現(xiàn)高精度的 PWM 輸出,適用于控制 LED 的亮度、顏色和閃爍等效果。

ESP8266 的 LEDC 控制器可實(shí)現(xiàn)同頻率、不同占空比的PWM波形輸出。 LEDC 模塊的主要特點(diǎn)包括:

  • 高精度:LEDC 支持高達(dá) 20 位的 PWM 分辨率,可實(shí)現(xiàn)非常精細(xì)的 PWM 控制。
  • 多路輸出:LEDC 可以同時(shí)控制多達(dá) 16 個(gè) PWM 通道,滿足多路 PWM 輸出的需求。
  • 靈活配置:LEDC 可以配置不同的 PWM 頻率和分辨率,以適應(yīng)不同的應(yīng)用場(chǎng)景。
  • 低成本:LEDC 是 ESP8266 芯片內(nèi)置的硬件模塊,使用 LEDC 功能無(wú)需外接任何外部元器件,節(jié)省了硬件成本。

在使用 ESP8266 的 PWM 功能時(shí),可以使用 ESP8266 的官方庫(kù)文件 ESP8266WiFi.h 中提供的 LEDC 相關(guān)函數(shù)進(jìn)行配置和控制。 例如,可以使用 ledcSetup() 函數(shù)來(lái)初始化 PWM 通道,并使用 ledcWrite() 函數(shù)來(lái)設(shè)置 PWM 占空比。 此外,ESP8266 的開(kāi)發(fā)環(huán)境也提供了豐富的示例代碼和庫(kù)函數(shù),方便開(kāi)發(fā)者快速上手使用 PWM 功能。

要注意的是,GPIO1和GPIO3作為調(diào)試串口的TX和RX,一般不做PWM使用。

3. node-mcu 引腳圖

4. 模擬寫入

(1)模擬寫入

要實(shí)現(xiàn)輸出PWM信號(hào),可以使用analogWrite()函數(shù):

analogWrite(pin,value)
1
  • pin:GPIO引腳
  • value:默認(rèn)0-1023
    當(dāng)值為0時(shí),該引腳禁用PWM。 值為1023時(shí) 占空比100%。

(2)修改頻率 analogWriteFreq

analogWriteFreq(new_frequency);

(3)調(diào)節(jié)分辨率

可以用于調(diào)節(jié)模擬輸出的 PWM 范圍。
在 ESP8266 中,analogWriteRange() 函數(shù)用于設(shè)置 PWM 的分辨率。 默認(rèn)情況下,ESP8266 的 PWM 分辨率為 10 位,即占空比范圍為 0~1023。 通過(guò)調(diào)用 analogWriteRange() 函數(shù),可以將 PWM 分辨率調(diào)節(jié)為 8 位或 9 位,以擴(kuò)大或縮小 PWM 占空比范圍。

二、使用analogWrite實(shí)現(xiàn)PWM

const int ledPin = 2; 

void setup() {
  
}

void loop() {
  // 增加LED亮度
  for(int dutyCycle = 0; dutyCycle < 1023; dutyCycle++){   
    // 通過(guò)PWM改變LED亮度
    analogWrite(ledPin, dutyCycle);
    delay(10);
  }

  // 降低LED亮度
  for(int dutyCycle = 1023; dutyCycle > 0; dutyCycle--){
    // 通過(guò)PWM改變LED亮度
    analogWrite(ledPin, dutyCycle);
    delay(10);
  }
}

三、發(fā)送紅外信號(hào)

1. 紅外通信原理

紅外通信是一種無(wú)線通信方式,它通過(guò)發(fā)射紅外線來(lái)傳輸數(shù)據(jù)或控制信號(hào),通常用于紅外遙控器、紅外傳感器等場(chǎng)景。

紅外信號(hào)是一種電磁輻射,其頻率在可見(jiàn)光波和微波之間,一般波長(zhǎng)為0.75至1000微米,其中,可見(jiàn)光波長(zhǎng)為0.38至0.78微米。 紅外線被稱為"熱線",因?yàn)槲矬w溫度越高,發(fā)射的紅外線輻射就越多。

在紅外通信中,通過(guò)對(duì)載波信號(hào)進(jìn)行調(diào)制,將數(shù)字信號(hào)轉(zhuǎn)換為紅外信號(hào),從而實(shí)現(xiàn)數(shù)據(jù)或控制信號(hào)的傳輸。 調(diào)制方式主要有兩種:幅度調(diào)制和頻率調(diào)制。

  • 幅度調(diào)制:通過(guò)改變載波信號(hào)的幅度,將數(shù)字信號(hào)轉(zhuǎn)換為紅外信號(hào)。 在幅度調(diào)制中,通常用一個(gè)二進(jìn)制信號(hào)來(lái)控制紅外發(fā)射器的開(kāi)關(guān)狀態(tài),從而實(shí)現(xiàn)傳輸數(shù)據(jù)。
  • 頻率調(diào)制:通過(guò)改變載波信號(hào)的頻率,將數(shù)字信號(hào)轉(zhuǎn)換為紅外信號(hào)。 在頻率調(diào)制中,常用的方式是將數(shù)字信號(hào)和一個(gè)固定的載波信號(hào)進(jìn)行異或運(yùn)算,從而得到一個(gè)頻率變化的信號(hào),用來(lái)控制紅外發(fā)射器的開(kāi)關(guān)狀態(tài),實(shí)現(xiàn)傳輸數(shù)據(jù)。

接收端通過(guò)紅外接收器接收到紅外信號(hào),然后通過(guò)解調(diào)的方式提取出攜帶的數(shù)據(jù)或控制信號(hào)。 解調(diào)的過(guò)程就是將紅外信號(hào)轉(zhuǎn)化為電信號(hào),然后提取出載波信號(hào),再將其與一個(gè)固定的頻率進(jìn)行比較,從而恢復(fù)出原始的數(shù)字信號(hào)。

2. 載波頻率

紅外信號(hào)的載波頻率(Carrier Frequency)指的是紅外信號(hào)中用于攜帶信息的載波波形的頻率。 在紅外通信中,常用的載波頻率一般在 20 kHz 到 50 kHz 之間。

將信息信號(hào)和載波信號(hào)進(jìn)行調(diào)制后,就可以通過(guò)紅外發(fā)射器將帶有載波信號(hào)的紅外信號(hào)發(fā)送出去。 接收器可以通過(guò)解調(diào)過(guò)程,將攜帶的信息信號(hào)提取出來(lái)。

在紅外遙控器中,一般使用一定的載波頻率進(jìn)行通信。 這樣可以提高通信的可靠性,同時(shí)也可以避免干擾,因?yàn)楹苌儆衅渌脑O(shè)備會(huì)使用相同的載波頻率進(jìn)行通信。

3. 發(fā)送周期

紅外信號(hào)的發(fā)送周期是指一個(gè)完整的紅外信號(hào)周期所需的時(shí)間。 在紅外通信中,為了確保通信的可靠性,每一個(gè)紅外信號(hào)周期中一般包含多個(gè)載波周期。 具體來(lái)說(shuō),發(fā)送周期包括兩部分時(shí)間:載波周期和調(diào)制周期。

  1. 載波周期:指載波信號(hào)一個(gè)完整的波形所需的時(shí)間,它是紅外信號(hào)的基本單位。 在紅外通信中,載波周期通常為一個(gè)固定的時(shí)間,一般在38kHz左右。
  2. 調(diào)制周期:指一個(gè)完整的紅外信號(hào)周期所需的時(shí)間,它包括了載波周期和數(shù)字信號(hào)的調(diào)制。 在紅外通信中,調(diào)制周期的長(zhǎng)度取決于傳輸?shù)臄?shù)據(jù)長(zhǎng)度和傳輸速率。 一般來(lái)說(shuō),調(diào)制周期越長(zhǎng),傳輸速率就越慢,但是數(shù)據(jù)傳輸?shù)目煽啃詴?huì)更高。

在紅外遙控器中,每一個(gè)按鍵通常對(duì)應(yīng)一個(gè)特定的紅外信號(hào),這個(gè)紅外信號(hào)的發(fā)送周期一般是固定的,以確保遙控器能夠正確地發(fā)送信號(hào),并且接收器能夠正確地解碼信號(hào)。

4. 使用

(1)安裝庫(kù)

庫(kù)開(kāi)源地址:

https://github.com/crankyoldgit/IRremoteESP8266

(2)代碼實(shí)現(xiàn)

#include 
#include 

IRsend irsend(4); // 初始化IRsend對(duì)象并設(shè)置輸出引腳,GPIO4=D2

void setup()
{
  Serial.begin(115200);
  delay(1000);
}

void loop()
{
  Serial.println("Sending IR signal...");
  irsend.sendSony(0xA90, 12); // 發(fā)送SONY紅外信號(hào),傳輸數(shù)據(jù)為0xA90,數(shù)據(jù)長(zhǎng)度為12位
  delay(1000); // 等待1秒鐘
}

5. 紅外接收示例

#include 
#include 
#include 
#include 

// An IR detector/demodulator is connected to GPIO pin 14(D5 on a NodeMCU
// board).
// Note: GPIO 16 won't work on the ESP8266 as it does not have interrupts.
// Note: GPIO 14 won't work on the ESP32-C3 as it causes the board to reboot.
#ifdef ARDUINO_ESP32C3_DEV
const uint16_t kRecvPin = 10;  // 14 on a ESP32-C3 causes a boot loop.
#else  // ARDUINO_ESP32C3_DEV
const uint16_t kRecvPin = 14;
#endif  // ARDUINO_ESP32C3_DEV

IRrecv irrecv(kRecvPin);

decode_results results;

void setup() {
  Serial.begin(115200);
  irrecv.enableIRIn();  // Start the receiver
  while (!Serial)  // Wait for the serial connection to be establised.
    delay(50);
  Serial.println();
  Serial.print("IRrecvDemo is now running and waiting for IR message on Pin ");
  Serial.println(kRecvPin);
}

void loop() {
  if (irrecv.decode(&results)) {
    // print() & println() can't handle printing long longs. (uint64_t)
    serialPrintUint64(results.value, HEX);
    Serial.println("");
    irrecv.resume();  // Receive the next value
  }
  delay(100);
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)投訴
  • led
    led
    +關(guān)注

    關(guān)注

    240

    文章

    22905

    瀏覽量

    650084
  • PWM
    PWM
    +關(guān)注

    關(guān)注

    114

    文章

    5057

    瀏覽量

    212175
  • 脈寬調(diào)制
    +關(guān)注

    關(guān)注

    3

    文章

    212

    瀏覽量

    38198
  • Arduino
    +關(guān)注

    關(guān)注

    187

    文章

    6453

    瀏覽量

    185916
  • ESP8266
    +關(guān)注

    關(guān)注

    50

    文章

    959

    瀏覽量

    44539
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    arduino學(xué)習(xí)筆記7 - PWM控制LED實(shí)驗(yàn) PWM講解

    ~當(dāng)然。。。這和真實(shí)的連續(xù)輸出還是有差別的,單位時(shí)間內(nèi)輸出的0,1信號(hào)越多,控制的就越精確。在下圖中,綠線之間代表一個(gè)周期,其值也是PWM頻率的倒數(shù)。換句話說(shuō),如果arduino PWM
    發(fā)表于 10-23 17:34

    詳解基于ArduinoPWM輸出

    理解Arduino的模擬輸入A0~A5。本篇深入討論Arduino的模擬信號(hào)輸出(PWM)引子Arduino Uno是單片機(jī),其內(nèi)部
    發(fā)表于 08-03 21:57

    Arduino如何利用紅外感應(yīng)控制舵機(jī)

    實(shí)現(xiàn)功能:當(dāng)紅外感應(yīng)到人時(shí),控制舵機(jī)轉(zhuǎn)動(dòng)180度參考:基于Arduino的多種方式控制舵機(jī)(舵機(jī)、電位器、藍(lán)牙).硬件連接:舵機(jī)連接:ArduinoMicro Servo 9g5V紅線GND棕色
    發(fā)表于 06-28 11:17

    ArduinoPWM控制代碼

    如果你需要一個(gè)具體的代碼示例,我可以為你提供一個(gè)ArduinoPWM控制代碼。Arduino是一款常用的開(kāi)源電子原型平臺(tái),它提供了PWM功能。以下是一個(gè)簡(jiǎn)單的
    發(fā)表于 09-21 08:57

    BISS0001 紅外傳感信號(hào)處理

    BISS0001是我公司自主設(shè)計(jì)地紅外傳感信號(hào)處理器專用集成電路,它配以熱釋電紅外傳感器和少量外元器件可以構(gòu)成被動(dòng)式紅外開(kāi)關(guān)。它能自動(dòng)快速開(kāi)
    發(fā)表于 03-14 10:26 ?38次下載

    如何使用Arduino紅外控制進(jìn)行智能機(jī)械手的設(shè)計(jì)資料和程序免費(fèi)下載

    等。通過(guò) Arduino紅外控制功能,借助紅外遙控器向 Arduino 發(fā)送信號(hào),再利用 Ardui
    發(fā)表于 05-13 08:00 ?5次下載
    如何使用<b class='flag-5'>Arduino</b><b class='flag-5'>紅外</b>控制進(jìn)行智能機(jī)械手的設(shè)計(jì)資料和程序免費(fèi)下載

    dfrobot數(shù)字紅外信號(hào)發(fā)射模塊介紹

    IR Transmitter Module是一款Arduino兼容的38KHz紅外線發(fā)射傳感器,可發(fā)射標(biāo)準(zhǔn)38KHz的調(diào)制信號(hào),通過(guò)對(duì)Arduino進(jìn)行編程,即可實(shí)現(xiàn)對(duì)38KHzIR
    的頭像 發(fā)表于 12-13 15:38 ?2250次閱讀
    dfrobot數(shù)字<b class='flag-5'>紅外</b><b class='flag-5'>信號(hào)</b>發(fā)射模塊介紹

    Arduino的實(shí)驗(yàn)例程之紅外遙控實(shí)驗(yàn)

    本文檔的主要內(nèi)容詳細(xì)介紹的是Arduino的實(shí)驗(yàn)例程之紅外遙控實(shí)驗(yàn)。
    發(fā)表于 02-25 16:36 ?49次下載
    <b class='flag-5'>Arduino</b>的實(shí)驗(yàn)例程之<b class='flag-5'>紅外</b>遙控實(shí)驗(yàn)

    如何在Arduino中簡(jiǎn)單實(shí)現(xiàn)PWM?

    Q A 在Arduino中輕松實(shí)現(xiàn)脈寬調(diào)制(PWM) 脈寬調(diào)制( PWM信號(hào)基本上是一個(gè)方波,可在導(dǎo)通(高)和關(guān)斷(低)狀態(tài)之間切換。PWM
    的頭像 發(fā)表于 05-21 10:37 ?1.7w次閱讀
    如何在<b class='flag-5'>Arduino</b>中簡(jiǎn)單實(shí)現(xiàn)<b class='flag-5'>PWM</b>?

    使用紅外傳感器構(gòu)建一個(gè)Arduino計(jì)數(shù)機(jī)

    在這個(gè)項(xiàng)目中,我們正在使用紅外傳感器構(gòu)建一個(gè)Arduino 計(jì)數(shù)機(jī)。這臺(tái)機(jī)器在紅外傳感器的幫助下對(duì)不同部分的硬幣進(jìn)行計(jì)數(shù)和分類。在這里,布置了紅外傳感器以感應(yīng)不同的硬幣,
    的頭像 發(fā)表于 08-17 15:59 ?4102次閱讀
    使用<b class='flag-5'>紅外</b>傳感器構(gòu)建一個(gè)<b class='flag-5'>Arduino</b>計(jì)數(shù)機(jī)

    如何使用Arduino生成的PWM來(lái)控制交流風(fēng)扇的速度

    在這個(gè)項(xiàng)目中,我們將演示使用 TRIAC 的 Arduino 交流風(fēng)扇速度控制。這里使用交流信號(hào)的相位控制方法來(lái)控制交流風(fēng)扇的速度,使用 Arduino 生成的 PWM
    的頭像 發(fā)表于 08-18 16:26 ?1.1w次閱讀
    如何使用<b class='flag-5'>Arduino</b>生成的<b class='flag-5'>PWM</b>來(lái)控制交流風(fēng)扇的速度

    使用Arduino解碼任何遙控器的紅外遙控信號(hào)

    電子發(fā)燒友網(wǎng)站提供《使用Arduino解碼任何遙控器的紅外遙控信號(hào).zip》資料免費(fèi)下載
    發(fā)表于 10-27 11:51 ?4次下載
    使用<b class='flag-5'>Arduino</b>解碼任何遙控器的<b class='flag-5'>紅外</b>遙控<b class='flag-5'>信號(hào)</b>

    Arduino PWM控制的對(duì)稱電源

    電子發(fā)燒友網(wǎng)站提供《Arduino PWM控制的對(duì)稱電源.zip》資料免費(fèi)下載
    發(fā)表于 11-01 14:22 ?0次下載
    <b class='flag-5'>Arduino</b> <b class='flag-5'>PWM</b>控制的對(duì)稱電源

    使用Arduino進(jìn)行脈沖寬度調(diào)制(PWM)并觀察示波器信號(hào)

    電子發(fā)燒友網(wǎng)站提供《使用Arduino進(jìn)行脈沖寬度調(diào)制(PWM)并觀察示波器信號(hào).zip》資料免費(fèi)下載
    發(fā)表于 06-27 09:15 ?0次下載
    使用<b class='flag-5'>Arduino</b>進(jìn)行脈沖寬度調(diào)制(<b class='flag-5'>PWM</b>)并觀察示波器<b class='flag-5'>信號(hào)</b>

    Arduino紅外遙控器

    電子發(fā)燒友網(wǎng)站提供《帶Arduino紅外遙控器.zip》資料免費(fèi)下載
    發(fā)表于 07-06 10:51 ?0次下載
    帶<b class='flag-5'>Arduino</b>的<b class='flag-5'>紅外</b>遙控器