مبتدی⏱ 13 دقیقه مطالعه

PWM (مدولاسیون پهنای پالس) روشی است برای شبیه‌سازی خروجی آنالوگ با یک سیگنال دیجیتال که به‌سرعت روشن و خاموش می‌شود. با تغییر درصد زمان روشن‌بودن (Duty Cycle)، می‌توانیم روشنایی LED یا سرعت موتور DC را کنترل کنیم.

مفهوم Duty Cycle در سیگنال PWM

ایجاد یک سیگنال PWM با ledc

ESP32 دارای واحد سخت‌افزاری اختصاصی به‌نام LEDC برای تولید PWM است. در نسخه‌های جدید هستهٔ Arduino-ESP32 (نسخهٔ ۳ به بعد)، کافی است پایه را مستقیماً «attach» کنید:

CPP
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 را با چرخاندن یک پیچ کنترل کنید.

شبیه‌سازی زندهٔ محوشدگی PWM — دقیقاً همین کد (ledcAttach + ledcWrite روی پایهٔ ۲) باز کردن در Wokwi ↗
در حال بارگذاری شبیه‌ساز… (ممکن است چند ثانیه طول بکشد)

این یک شبیه‌سازی واقعی و قابل اجراست؛ روی دکمه پخش (▶) در Wokwi بزنید تا کد روی برد مجازی ESP32 اجرا شود. اگر جعبهٔ بالا بیش از حد سیاه/خالی ماند، صفحه را رفرش کنید یا از دکمهٔ «باز کردن در Wokwi» بالا استفاده کنید.

❓ بازهٔ معمول مقدار duty در PWM ده‌بیتی ESP32 (با ledcWrite) چقدر است؟
طراحی و توسعه: امین شیخ نجدیglcd.ir | نسخهٔ افزونه: 1.21.0