在本教程中,我們將討論ESP32 開(kāi)發(fā)板的 PWM(脈沖寬度調(diào)制)引腳。ESP32 開(kāi)發(fā)板的所有 GPIO 引腳(Power、GND、Tx、Rx 和 EN 除外)均可用于獲取 PWM 信號(hào)。作為ESP32 PWM 示例,我們將構(gòu)建一個(gè)簡(jiǎn)單的電路,根據(jù) PWM 信號(hào)改變 LED 亮度。
所需組件
ESP32
引領(lǐng)
330Ω電阻
10k 鍋
面包板
PWM 生成
在解釋 ESP32 上的 PWM 生成之前,讓我們討論一些與 PWM 相關(guān)的術(shù)語(yǔ)。
TON(開(kāi)啟時(shí)間):信號(hào)為高電平的持續(xù)時(shí)間。
TOFF(關(guān)閉時(shí)間):信號(hào)為低電平的持續(xù)時(shí)間。
周期:它是 PWM 信號(hào)的開(kāi)啟時(shí)間和關(guān)閉時(shí)間的總和。
TotalPeriod = T ON + T OFF
占空比:在 PWM 信號(hào)周期內(nèi)信號(hào)為高電平的時(shí)間百分比。
占空比 = T ON /T總計(jì)* 100
例如,如果一個(gè)總周期為 10ms 的脈沖保持 ON(高)5ms。然后,占空比將是:
占空比 = 5/10 * 100 = 50% 占空比
PWM的頻率:PWM 信號(hào)的頻率決定了 PWM 完成一個(gè)周期的速度。一個(gè)周期是完成一個(gè) PWM 信號(hào)的 ON 和 OFF,如上圖所示。
ESP32 上的 PWM 生成
在Arduino和 NodeMCU 中,我們使用模擬寫(xiě)入()函數(shù)將 0 到 254 之間的值“寫(xiě)入”到 LED 引腳。但是ESP32開(kāi)發(fā)板不支持analogWrite()函數(shù)。所以我們將使用另一個(gè)函數(shù)而不是analogWrite(),即ledcWrite()函數(shù)。ledcWrite ()與analogWrite()非常相似。它還需要兩個(gè)參數(shù):我們想要“寫(xiě)入”P(pán)WM 值的 PWM 通道和我們想要寫(xiě)入所選通道的 PWM 值。ESP32 有 16 個(gè) PWM 通道,您可以使用任何 GPIO 來(lái)生成 PWM 輸出。ESP32 提供了三個(gè)函數(shù)來(lái)分配一個(gè) PWM 通道到一個(gè)引腳,以及配置 PWM 信號(hào)的分辨率、頻率和占空比。這些功能是:
ledcSetup(channel, frequency, resolution)
ledcWrite(channel, dutycycle)
電路原理圖
ESP32 PWM的電路圖如下所示。
該電路包含一個(gè) LED、一個(gè)電阻器和一個(gè) 10K 電位器。LED 的負(fù)極通過(guò)一個(gè) 330 Ω 的電阻連接到 ESP32 的 GND。您可以使用 230 Ω 和 500 Ω 之間的任何電阻值。將 LED 正極引腳連接到 GPIO 16,將 Pot 的信號(hào)引腳連接到 ESP32 的 ADC1 (VP) 引腳。
ESP32 PWM 代碼說(shuō)明
完整的代碼在頁(yè)面末尾給出。
此代碼不需要任何庫(kù),因此通過(guò)定義引腳開(kāi)始您的代碼,LED 連接到。就我而言,我使用 GPIO 16 連接 LED。
常量 int ledPin = 16; // 16對(duì)應(yīng)GPIO16
之后,在下一行設(shè)置 PWM 信號(hào)屬性。我將 PWM 頻率設(shè)置為 9000,分辨率設(shè)置為 10,您可以更改它以生成不同的 PWM 信號(hào)。ESP32 板支持從 1 位到 16 位的 PWM 分辨率。您還需要選擇一個(gè) PWM 通道。ESP32 共有 16 個(gè)(0 到 15)個(gè) PWM 通道。
常量 int 頻率 = 9000; 常量 int ledChannel = 0; 常量 int 分辨率 = 10;
現(xiàn)在在void setup()函數(shù)中,使用ledcSetup()函數(shù)使用您之前設(shè)置的屬性配置 LED PWM。在下一行中,定義連接 LED 的 GPIO 引腳。ledcAttachPin()函數(shù)用于定義 GPIO 引腳和生成信號(hào)的通道。在我的例子中,我使用了 GPIO 16 的 ledPin 和對(duì)應(yīng)于通道 0 的 ledChannel。
無(wú)效設(shè)置(){ 序列號(hào).開(kāi)始(9600); ledcSetup(ledChannel, 頻率, 分辨率); ledcAttachPin(ledPin, ledChannel); }
在void 循環(huán)中,讀取連接 Pot 的模擬引腳并將讀數(shù)存儲(chǔ)在名為'dutyCycle'的變量中。LED 亮度會(huì)隨著電位器的旋轉(zhuǎn)而增加或減少。ledcWrite()與analogWrite()非常相似。
無(wú)效循環(huán)(){ dutyCycle = 模擬讀取(A0); ledcWrite(ledChannel, dutyCycle); 延遲(15); }
測(cè)試 ESP32 PWM 信號(hào)
要測(cè)試 ESP32 PWM 信號(hào),請(qǐng)按照電路圖連接 LED 和電位器,然后將代碼上傳到您的 ESP32。確保您選擇了正確的板和 COM 端口。現(xiàn)在旋轉(zhuǎn)電位器來(lái)增加或減少 LED 亮度。
常量 int ledPin = 16; // 16對(duì)應(yīng)GPIO16
uint16_t 占空比;
// 設(shè)置 PWM 屬性
常量 int 頻率 = 15000;
常量 int ledChannel = 0;
常量 int 分辨率 = 13;
無(wú)效設(shè)置(){
序列號(hào).開(kāi)始(9600);
// 配置 LED PWM 功能
ledcSetup(ledChannel, 頻率, 分辨率);
// 將通道附加到要控制的 GPIO
ledcAttachPin(ledPin, ledChannel);
}
無(wú)效循環(huán)(){
dutyCycle = 模擬讀取(A0);
Serial.print(dutyCycle);
// 使用 PWM 改變 LED 亮度
ledcWrite(ledChannel, dutyCycle);
延遲(15);
}
-
led
+關(guān)注
關(guān)注
242文章
23356瀏覽量
663202 -
PWM
+關(guān)注
關(guān)注
114文章
5198瀏覽量
214882 -
ESP32
+關(guān)注
關(guān)注
18文章
978瀏覽量
17529
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論