具有Arduino IDE的ESP32 PWM
在本教程中,我們將向您展示如何使用Arduino IDE通過ESP32生成PWM信號。作為示例,我們將構建一個簡單的電路,使用ESP32的LED PWM控制器使LED變暗。我們還將向您展示如何在不同的GPIO上同時獲得相同的PWM信號。
在繼續本教程之前,您應該在Arduino IDE中安裝ESP32插件。
所需部件
要使用本教程,您需要以下部分:
ESP32 DOIT DEVKIT V1 開發板
ESP32 LED PWM控制器
ESP32的LED PWM控制器具有16個獨立通道,可配置為生成具有不同屬性的PWM信號。
這是您必須使用Arduino IDE通過PWM使LED變暗的步驟:
1.首先,您需要選擇一個PWM通道。從0到15有16個頻道。
2.然後,需要設置PWM信號頻率。對於LED,可以使用5000 Hz的頻率。
3. 您還需要設置信號的佔空比分辨率:分辨率為1到16位。我們將使用8位分辨率,這意味著您可以使用0到255之間的值來控制LED亮度。
4. 接下來,您需要指定信號將出現在哪個GPIO上。為此,您將使用以下功能:
ledcAttachPin(GPIO, channel)
該函數接受兩個參數。第一個是將輸出信號的GPIO,第二個是將生成信號的通道。
5. 最後,要使用PWM控制LED亮度,請使用以下功能:
ledcWrite(channel, dutycycle)
此函數接受生成PWM信號的通道和佔空比作為參數。
調光LED
讓我們看一個簡單的示例,瞭解如何通過Arduino IDE使用ESP32 LED PWM控制器。
原理圖
如下圖所示,將LED線連接到ESP32。LED應該連接到GPIO 16。
(此原理圖使用帶有30個GPIO的ESP32 DEVKIT V1模塊版本–如果您使用的是其他型號,請檢查所用電路板的引腳排列。)
注意:您可以使用所需的任何引腳,只要它可以用作輸出即可。所有可用作輸出的引腳都可用作PWM引腳。
程序代碼
打開您的Arduino IDE並複製以下代碼。
// the number of the LED pin
const int ledPin = 16; // 16 corresponds to GPIO16
// setting PWM properties
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
void setup(){
// configure LED PWM functionalitites
ledcSetup(ledChannel, freq, resolution);
// attach the channel to the GPIO to be controlled
ledcAttachPin(ledPin, ledChannel);
}
void loop(){
// increase the LED brightness
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
// decrease the LED brightness
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
}
首先定義LED所連接的引腳。在這種情況下,LED連接到GPIO 16。
const int ledPin = 16; // 16 corresponds to GPIO16
然後,設置PWM信號屬性。您定義的頻率為5000 Hz,選擇通道0生成信號,並將分辨率設置為8位。您可以選擇不同於這些的其他屬性來生成不同的PWM信號。
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
在setup()中,您需要通過使用ledcSetup()函數將LEDPWM配置為先前定義的屬性,該函數接受ledChannel,頻率和分辨率作為參數,如下所示:
ledcSetup(ledChannel, freq, resolution);
接下來,您需要選擇將從其獲取信號的GPIO。為此,請使用ledcAttachPin()函數,該函數接受要獲取信號的GPIO以及生成信號的通道作為參數。在此示例中,我們將在ledPin GPIO中獲取信號,該信號對應於GPIO 16。產生信號的通道是ledChannel,它對應於通道0。
ledcAttachPin(ledPin, ledChannel);
在循環中,您將在0到255之間改變佔空比,以增加LED亮度。
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
然後,在255和0之間降低亮度。
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
要設置LED的亮度,您只需要使用ledcWrite()函數,該函數接受生成信號的通道和佔空比作為參數。
ledcWrite(ledChannel, dutyCycle);
當我們使用8位分辨率時,將使用0到255之間的值來控制佔空比。請注意,在ledcWrite()函數中,我們使用的是生成信號的通道,而不是GPIO。
測試示例
將代碼上傳到ESP32。確保選擇了正確的板和COM端口。看你的電路。您應該有一個調光器LED,它可以增加和減少亮度。
在不同的GPIO上獲得相同的信號
您可以在不同的GPIO中從同一通道獲得相同的信號。為此,您只需要將這些GPIO附加到setup()的同一通道上即可。
讓我們修改前面的示例,以使用來自同一通道的相同PWM信號使3個LED變暗。
原理圖
遵循下一個原理圖,在電路中再增加兩個LED:
(此原理圖使用帶有30個GPIO的ESP32 DEVKIT V1模塊版本–如果您使用的是其他型號,請檢查所用電路板的引腳排列。)
程序代碼
將以下代碼複製到您的Arduino IDE。
// the number of the LED pin
const int ledPin = 16; // 16 corresponds to GPIO16
const int ledPin2 = 17; // 17 corresponds to GPIO17
const int ledPin3 = 5; // 5 corresponds to GPIO5
// setting PWM properties
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
void setup(){
// configure LED PWM functionalitites
ledcSetup(ledChannel, freq, resolution);
// attach the channel to the GPIO to be controlled
ledcAttachPin(ledPin, ledChannel);
ledcAttachPin(ledPin2, ledChannel);
ledcAttachPin(ledPin3, ledChannel);
}
void loop(){
// increase the LED brightness
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
// decrease the LED brightness
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
}
該代碼與上一個代碼相同,但有一些修改。我們為兩個新的LED定義了另外兩個變量,分別引用GPIO 17和GPIO 5。
const int ledPin2 = 17; // 17 corresponds to GPIO17
const int ledPin3 = 5; // 5 corresponds to GPIO5
然後,在setup()中,添加了以下幾行以將兩個GPIO分配給通道0。這意味著我們將在兩個GPIO上獲得在通道0上生成的相同信號。
ledcAttachPin(ledPin2, ledChannel);
ledcAttachPin(ledPin3, ledChannel);
測試項目
將程序上傳到ESP32。確保選擇了正確的板和COM端口。現在,看看您的電路:
所有GPIO都輸出相同的PWM信號。因此,所有三個LED同時增加和減少亮度,從而產生同步效果。
總而言之,在本文中,您學習瞭如何將ESP32的LED PWM控制器與Arduino IDE配合使用來使LED變暗。通過為信號設置正確的屬性,可以將學習到的概念用於PWM的其他輸出控制。
閱讀更多 工控電子愛好者 的文章