一、基本概念
1. 脈寬調(diào)制
PWM(Pulse Width Modulation)即脈寬調(diào)制,是一種通過調(diào)節(jié)信號(hào)的占空比來控制電路的技術(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í),可以通過調(diào)節(jié) PWM 信號(hào)的占空比來控制 LED 的亮度,占空比越大,LED 燈亮度越高,反之亦然。
在微控制器中,通過定時(shí)器和計(jì)數(shù)器等硬件模塊,可以實(shí)現(xiàn)高精度的 PWM 信號(hào)輸出。 許多單片機(jī)和嵌入式系統(tǒng)都提供了 PWM 功能,并且在軟件層面提供了相應(yīng)的 API 和庫函數(shù),方便開發(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 功能無需外接任何外部元器件,節(jié)省了硬件成本。
在使用 ESP8266 的 PWM 功能時(shí),可以使用 ESP8266 的官方庫文件 ESP8266WiFi.h 中提供的 LEDC 相關(guān)函數(shù)進(jìn)行配置和控制。 例如,可以使用 ledcSetup() 函數(shù)來初始化 PWM 通道,并使用 ledcWrite() 函數(shù)來設(shè)置 PWM 占空比。 此外,ESP8266 的開發(fā)環(huán)境也提供了豐富的示例代碼和庫函數(shù),方便開發(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。 通過調(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++){
// 通過PWM改變LED亮度
analogWrite(ledPin, dutyCycle);
delay(10);
}
// 降低LED亮度
for(int dutyCycle = 1023; dutyCycle > 0; dutyCycle--){
// 通過PWM改變LED亮度
analogWrite(ledPin, dutyCycle);
delay(10);
}
}
三、發(fā)送紅外信號(hào)
1. 紅外通信原理
紅外通信是一種無線通信方式,它通過發(fā)射紅外線來傳輸數(shù)據(jù)或控制信號(hào),通常用于紅外遙控器、紅外傳感器等場(chǎng)景。
紅外信號(hào)是一種電磁輻射,其頻率在可見光波和微波之間,一般波長為0.75至1000微米,其中,可見光波長為0.38至0.78微米。 紅外線被稱為"熱線",因?yàn)槲矬w溫度越高,發(fā)射的紅外線輻射就越多。
在紅外通信中,通過對(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)制:通過改變載波信號(hào)的幅度,將數(shù)字信號(hào)轉(zhuǎn)換為紅外信號(hào)。 在幅度調(diào)制中,通常用一個(gè)二進(jìn)制信號(hào)來控制紅外發(fā)射器的開關(guān)狀態(tài),從而實(shí)現(xiàn)傳輸數(shù)據(jù)。
- 頻率調(diào)制:通過改變載波信號(hào)的頻率,將數(shù)字信號(hào)轉(zhuǎn)換為紅外信號(hào)。 在頻率調(diào)制中,常用的方式是將數(shù)字信號(hào)和一個(gè)固定的載波信號(hào)進(jìn)行異或運(yùn)算,從而得到一個(gè)頻率變化的信號(hào),用來控制紅外發(fā)射器的開關(guān)狀態(tài),實(shí)現(xiàn)傳輸數(shù)據(jù)。
接收端通過紅外接收器接收到紅外信號(hào),然后通過解調(diào)的方式提取出攜帶的數(shù)據(jù)或控制信號(hào)。 解調(diào)的過程就是將紅外信號(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)制后,就可以通過紅外發(fā)射器將帶有載波信號(hào)的紅外信號(hào)發(fā)送出去。 接收器可以通過解調(diào)過程,將攜帶的信息信號(hào)提取出來。
在紅外遙控器中,一般使用一定的載波頻率進(jìn)行通信。 這樣可以提高通信的可靠性,同時(shí)也可以避免干擾,因?yàn)楹苌儆衅渌脑O(shè)備會(huì)使用相同的載波頻率進(jìn)行通信。
3. 發(fā)送周期
紅外信號(hào)的發(fā)送周期是指一個(gè)完整的紅外信號(hào)周期所需的時(shí)間。 在紅外通信中,為了確保通信的可靠性,每一個(gè)紅外信號(hào)周期中一般包含多個(gè)載波周期。 具體來說,發(fā)送周期包括兩部分時(shí)間:載波周期和調(diào)制周期。
- 載波周期:指載波信號(hào)一個(gè)完整的波形所需的時(shí)間,它是紅外信號(hào)的基本單位。 在紅外通信中,載波周期通常為一個(gè)固定的時(shí)間,一般在38kHz左右。
- 調(diào)制周期:指一個(gè)完整的紅外信號(hào)周期所需的時(shí)間,它包括了載波周期和數(shù)字信號(hào)的調(diào)制。 在紅外通信中,調(diào)制周期的長度取決于傳輸?shù)臄?shù)據(jù)長度和傳輸速率。 一般來說,調(diào)制周期越長,傳輸速率就越慢,但是數(shù)據(jù)傳輸?shù)目煽啃詴?huì)更高。
在紅外遙控器中,每一個(gè)按鍵通常對(duì)應(yīng)一個(gè)特定的紅外信號(hào),這個(gè)紅外信號(hào)的發(fā)送周期一般是固定的,以確保遙控器能夠正確地發(fā)送信號(hào),并且接收器能夠正確地解碼信號(hào)。
4. 使用
(1)安裝庫
庫開源地址:
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ù)長度為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);
}
-
led
+關(guān)注
關(guān)注
242文章
23321瀏覽量
661880 -
PWM
+關(guān)注
關(guān)注
114文章
5195瀏覽量
214350 -
脈寬調(diào)制
+關(guān)注
關(guān)注
3文章
219瀏覽量
38358 -
Arduino
+關(guān)注
關(guān)注
188文章
6474瀏覽量
187425 -
ESP8266
+關(guān)注
關(guān)注
50文章
962瀏覽量
45170
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論