PWM (مدولاسیون پهنای پالس) روشی است برای شبیهسازی خروجی آنالوگ با یک سیگنال دیجیتال که بهسرعت روشن و خاموش میشود. با تغییر درصد زمان روشنبودن (Duty Cycle)، میتوانیم روشنایی LED یا سرعت موتور DC را کنترل کنیم.
ایجاد یک سیگنال PWM با ledc
ESP32 دارای واحد سختافزاری اختصاصی بهنام LEDC برای تولید PWM است. در نسخههای جدید هستهٔ Arduino-ESP32 (نسخهٔ ۳ به بعد)، کافی است پایه را مستقیماً «attach» کنید:
const int LED_PIN = 2;
void setup() {
// پایه، فرکانس (هرتز)، دقت (بیت)
ledcAttach(LED_PIN, 1000, 10); // فرکانس ۱ کیلوهرتز، دقت ۱۰ بیتی (۰ تا ۱۰۲۳)
}
void loop() {
// نرم شدن و کمنور شدن تدریجی LED
for (int duty = 0; duty <= 1023; duty += 10) {
ledcWrite(LED_PIN, duty);
delay(10);
}
for (int duty = 1023; duty >= 0; duty -= 10) {
ledcWrite(LED_PIN, duty);
delay(10);
}
}در نسخههای قدیمیتر هستهٔ ESP32-Arduino (نسخهٔ ۲ و ماقبل)، بهجای ledcAttach باید ابتدا با ledcSetup(channel, freq, resolution) یک کانال PWM تعریف و با ledcAttachPin(pin, channel) به پایه وصل میکردید، سپس با ledcWrite(channel, duty) نوشتید. اگر با پیام خطای «ledcAttach not declared» مواجه شدید، یعنی نسخهٔ هستهٔ برد شما قدیمیتر است — از Boards Manager آن را بهروزرسانی کنید یا از API قدیمی استفاده کنید.
مقدار duty در دقت ۱۰ بیتی بین ۰ (خاموش کامل) تا ۱۰۲۳ (روشن کامل) است — دقیقاً همان بازهای که در نسخهٔ میکروپایتون با duty() دیدید.
برای کنترل سروموتور نیز از همین API استفاده میشود، اما با فرکانس ۵۰ هرتز و duty متناسب با زاویهٔ موردنظر (یا با کتابخانهٔ آمادهتر ESP32Servo).
مثال: کنترل روشنایی با پتانسیومتر
در درس بعدی با ADC آشنا میشوید و میتوانید مقدار پتانسیومتر را بخوانید و مستقیماً به duty سیگنال PWM نگاشت کنید تا روشنایی LED را با چرخاندن یک پیچ کنترل کنید.