آموزش کامل PWM در ESP8266 و ESP32 + کنترل شدت نور LED (گام‌به‌گام و حرفه‌ای)
17
آذر 1404
0 نظر

آموزش کامل PWM در ESP8266 و ESP32 + کنترل شدت نور LED (گام‌به‌گام و حرفه‌ای)

PWM یکی از مهم‌ترین تکنیک‌های کنترل در ESP8266 و ESP32 است. در این مقاله با آموزش کامل PWM، کنترل شدت نور LED، کنترل موتور، RGB، سروو، انتخاب فرکانس مناسب، استفاده از LEDC در ESP32 و تکنیک‌های پیشرفته Fade آشنا می‌شوید

PWM یا مدولاسیون پهنای پالس یکی از مهم‌ترین قابلیت‌های دنیای الکترونیک و میکروکنترلرهاست. وقتی با ESP8266 یا ESP32 کار می‌کنیم، تقریباً غیرممکن است پروژه‌ای بسازیم که به PWM نیاز نداشته باشد: از کنترل LED و نورپردازی گرفته تا کنترل سرعت موتور، سروو، پمپ آب، رباتیک و حتی ساخت سیستم‌های نورپردازی سینمای خانگی

مقالات مفید دیگر جهت آشنایی با بردهای ESP:


فهرست کامل مطالب

  1. PWM چیست و چرا استفاده می‌شود؟

  2. اصول علمی PWM (فرکانس، رزولوشن، Duty Cycle)

  3. تفاوت PWM نرم‌افزاری و سخت‌افزاری

  4. PWM در ESP8266

  5. PWM در ESP32 و سیستم LEDC

  6. تعیین فرکانس‌های مناسب برای LED، موتور، سروو و RGB

  7. تشخیص پایه‌های مناسب PWM در ESP

  8. انجام پروژه LED Fade در ESP8266

  9. انجام پروژه LED Fade در ESP32

  10. کنترل PWM با پتانسیومتر

  11. کنترل RGB LED و ساخت نورپردازی حرفه‌ای

  12. کنترل موتور DC با PWM

  13. کنترل سرووموتور

  14. کنترل PWM از طریق وب‌سرور

  15. جلوگیری از نویز، فلیکر و ریست شدن

  16. تکنیک‌های حرفه‌ای PWM (Gamma Correction، Smooth Fade)

  17. API حرفه‌ای Fade در ESP32

  18. تولید موج سینوسی و مثلثی با PWM

  19. اندازه‌گیری PWM با اسیلوسکوپ

  20. عیب‌یابی کامل مشکلات PWM

  21. جمع‌بندی


۱. PWM چیست؟

PWM مخفف Pulse Width Modulation به‌معنی مدولاسیون پهنای پالس است. هدف PWM ایجاد یک ولتاژ متوسط کنترل‌شده است.

به‌جای تغییر مقدار ولتاژ واقعی (مثلاً ۰ تا ۳٫۳ ولت)، ما سیگنال دیجیتال را خیلی سریع روشن و خاموش می‌کنیم.

به این ترتیب:

  • اگر 10% زمان روشن باشد → خروجی ≈ 0.3V

  • اگر 50% روشن باشد → خروجی ≈ 1.6V

  • اگر 90% روشن باشد → خروجی ≈ 3.0V

PWM شبیه دیممر دیجیتال است

اما با دقت فوق‌العاده بالا و بدون تلفات انرژی.


۲. مفاهیم پایه PWM (مهم برای درک حرفه‌ای)

۱) Duty Cycle

نسبت زمان ON به کل سیکل:

Duty = TON / Ttotal

مثلاً Duty 25% یعنی:

🟩■■■ → کم‌نور
🟩🟩🟩🟩🟩■■■■■■ → پُرنور


۲) فرکانس PWM

تعداد سیکل در ثانیه.

  • فرکانس پایین (مثل 100Hz) → LED فلیکر می‌زند

  • فرکانس مناسب LED → 1kHz – 8kHz

  • فرکانس مناسب موتور → 10kHz – 20kHz

  • فرکانس مناسب فن → بالای 20kHz برای حذف صدا


۳) رزولوشن PWM

تعداد پله‌های بین ۰ تا ۱۰۰٪.

در ESP مقدار رزولوشن تأثیر مستقیم روی نرمی نور یا حرکت دارد:

  • ۸ بیت → ۲۵۶ پله

  • ۱۰ بیت → ۱۰۲۴ پله

  • ۱۲ بیت → ۴۰۹۶ پله

  • ۱۶ بیت → ۶۵۵۳۶ پله

ESP32 قادر است ۱۶ بیت رزولوشن واقعی بدهد که برای نورپردازی حرفه‌ای یک مزیت است.


۳. PWM نرم‌افزاری vs سخت‌افزاری

ویژگی نرم‌افزاری (ESP8266) سخت‌افزاری (ESP32 – LEDC)
دقت متوسط بسیار بالا
تداخل با WiFi زیاد تقریباً صفر
ثبات فرکانس متغیر پایدار
تعداد کانال‌ها فقط یکی ۱۶ کانال مستقل
مناسب موتور خیر عالی
مناسب نور RGB بله بسیار عالی

۴. PWM در ESP8266

ESP8266 PWM را با تابع معروف analogWrite() در Arduino Core اجرا می‌کند.

ویژگی‌ها:

  • رزولوشن: ۱۰ بیت

  • فرکانس: حدود 1kHz

  • کمی وابسته به WiFi

  • مناسب LED و RGB

  • کمتر مناسب موتور

تغییر فرکانس PWM:

analogWriteFreq(2000); // 2kHz

۵. PWM در ESP32 (سیستم LEDC فوق حرفه‌ای)

ESP32 دارای یک واحد سخت‌افزاری اختصاصی است:

LED Control Peripheral (LEDC)

مزایا:

  • ۱۶ کانال مستقل

  • Two Speed Mode (پرفورمنس بالا)

  • رزولوشن تا ۱۶ بیت

  • فرکانس تا ۴۰MHz

  • عدم تأثیر WiFi

  • امکان اعمال Fade به‌صورت سخت‌افزاری (!)

این سطح از امکانات در هیچ میکروکنترلر Arduino مانند وجود ندارد.


۶. فرکانس مناسب PWM برای کاربردهای مختلف

کاربرد فرکانس پیشنهادی
LED تک‌رنگ 1kHz – 5kHz
RGB LED 5kHz – 12kHz
فن DC 20kHz (برای حذف صدا)
موتور گیربکسی 10kHz – 20kHz
سروو ثابت 50Hz
بوزر اکتیو 1kHz – 3kHz
رله Solid State 1kHz طبق دیتاشیت

۷. پایه‌های PWM در ESP

ESP8266 (بهتر است از پایه‌های زیر استفاده نشود):

  • GPIO0

  • GPIO2

  • GPIO15
    به دلیل وابستگی به حالت بوت.

ESP32 (پایه‌های فقط ورودی):

  • GPIO34

  • GPIO35

  • GPIO36

  • GPIO39

پایه‌های توصیه‌شده PWM:
GPIOs: 4, 5, 12–19, 21–23, 25–27, 32–33


۸. پروژه LED Fade در ESP8266

int led = 2; void setup() { pinMode(led, OUTPUT); } void loop() { for(int i = 0; i < 1024; i++) { analogWrite(led, i); delay(2); } for(int i = 1023; i > 0; i--) { analogWrite(led, i); delay(2); } }

۹. پروژه LED Fade در ESP32

const int ledPin = 2; const int freq = 5000; const int channel = 0; const int resolution = 10; void setup() { ledcSetup(channel, freq, resolution); ledcAttachPin(ledPin, channel); } void loop() { for(int i = 0; i < 1024; i++) { ledcWrite(channel, i); delay(2); } for(int i = 1023; i > 0; i--) { ledcWrite(channel, i); delay(2); } }

۱۰. پروژه: کنترل PWM با پتانسیومتر

مدار:

  • وسط پتانسیومتر → ADC

  • یک طرف → GND

  • طرف دیگر → 3.3V

کد ESP32:

int pot = 34; void loop() { int val = analogRead(pot); int duty = map(val, 0, 4095, 0, 1023); ledcWrite(0, duty); }

۱۱. کنترل RGB LED

RGB = سه LED مجزا
با سه کانال PWM:

void setColor(int R, int G, int B) { ledcWrite(0, R); ledcWrite(1, G); ledcWrite(2, B); }

تولید رنگین‌کمان:

for(int i = 0; i < 255; i++) { setColor(i, 255 - i, random(255)); delay(10); }

۱۲. کنترل موتور DC با PWM

هیچ‌وقت موتور را مستقیماً به ESP وصل نکنید.
از درایورهای زیر استفاده کنید:

  • L298N

  • L293D

  • MX1508

  • BTS7960 (برای موتورهای قوی)

مثال:

ledcWrite(0, speedPWM);

۱۳. کنترل سرووموتور با PWM

در ESP8266 از کتابخانه Servo استفاده کنید.
در ESP32 بهتر است کتابخانه ESP32Servo را نصب کنید.


۱۴. کنترل PWM از طریق وب‌سرور

این بخش یکی از محبوب‌ترین‌ها در گوگل است.

اسلایدر HTML → ارسال به ESP → تغییر نور LED

server.on("/set", []() { int duty = server.arg("value").toInt(); ledcWrite(0, duty); server.send(200, "text/plain", "OK"); });

۱۵. جلوگیری از فلیکر، نویز و ریست شدن ESP

مهم‌ترین علت ریست: تغذیه ضعیف

لینک مقاله مرتبط:
«روش‌های تغذیه صحیح ESP و جلوگیری از ریست شدن»

راهکارها:

  • تغذیه حداقل 1A واقعی

  • خازن 470µF + 100µF + 10µF نزدیک ماژول

  • زمین مشترک

  • حذف سیم‌های بلند

  • حذف نویز با دیود و سلف هنگام کار با موتور


۱۶. تکنیک‌های حرفه‌ای PWM

۱) Gamma Correction

چشم انسان نسبت خطی به نور ندارد.

float corrected = pow(value / 255.0, 2.2) * 255;

۲) Soft Fade بدون Delay

if (millis() - last >= 3) { ledcWrite(0, brightness); brightness += dir; if (brightness <= 0 || brightness >= 255) dir = -dir; last = millis(); }

۳) موج سینوسی با PWM

برای نورپردازی حرفه‌ای:

float t; int val = (sin(t) + 1) * 127; ledcWrite(0, val); t += 0.05;

۱۷. API سخت‌افزاری Fade در ESP32

ESP32 به‌صورت سخت‌افزاری Fade ایجاد می‌کند!

ledcSetFadeTimeAndStart(0, 1023, 2000, LEDC_FADE_NO_WAIT);

امکانات:

  • Fade در مدت زمان دلخواه

  • بدون استفاده از delay

  • کاملاً نرم و حرفه‌ای


۱۸. تولید موج مثلثی / مربعی / سینوسی

ESP32 به دلیل LEDC حرفه‌ای قابلیت تولید انواع موج را دارد.
برای پروژه‌های:

  • PWM-controlled DAC

  • Audio PWM

  • نورپردازی موزیکال

  • رانندگی حرفه‌ای موتور

این تکنیک پرکاربرد است.


۱۹. ابزارهای تست PWM

1) اسیلوسکوپ

اگر دارید عالی است.

2) Logic Analyzer

با ۱۰۰ هزار تومان هم می‌توانید بخرید.

3) مولتی‌متر True RMS

برای اندازه‌گیری میانگین ولتاژ PWM مناسب است.


۲۰. عیب‌یابی کامل PWM در ESP

مشکل علت راه‌حل
LED فلیکر می‌زند فرکانس پایین فرکانس >5kHz
موتور لرزش دارد PWM نرم‌افزاری استفاده از ESP32
رنگ RGB درست نیست رزولوشن کم رزولوشن 12bit
ESP ریست می‌شود تغذیه ضعیف خازن + تغذیه 1A
PWM تغییر نمی‌کند پایه فقط ورودی است GPIO34–39 ممنوع
WiFi کند می‌شود ESP8266 Busy Delay کمتر + فرکانس پایین‌تر

۲۱. جمع‌بندی

در این مقاله به صورت کاملاً جامع و حرفه‌ای تمام مفاهیم PWM در ESP8266 و ESP32 را بررسی کردیم.
اکنون قادر هستید:

  • نور LED را نرم و دقیق کنترل کنید

  • RGB بسازید

  • موتور کنترل کنید

  • سروو راه‌اندازی کنید

  • PWM تحت وب بسازید

  • از LEDC در ESP32 برای موج‌های دقیق استفاده کنید

  • مشکلات نویز و ریست را کاملاً حل کنید

ارسال نظر
(بعد از تائید مدیر منتشر خواهد شد)
  • - نشانی ایمیل شما منتشر نخواهد شد.
  • - لطفا دیدگاهتان تا حد امکان مربوط به مطلب باشد.
  • - لطفا فارسی بنویسید.
  • - میخواهید عکس خودتان کنار نظرتان باشد؟ به gravatar.com بروید و عکستان را اضافه کنید.
  • - نظرات شما بعد از تایید مدیریت منتشر خواهد شد