
پاسخ کوتاه: زمان روشنبودن را کنترل میکنیم
PWM یک خروجی پالسی است که سهم زمان High آن تغییر میکند. فرکانس میگوید در هر ثانیه چند چرخه داریم و Duty Cycle میگوید در هر چرخه چه نسبتی روشن است. تغییر یکی، الزاماً تغییر دیگری نیست. در خروجی ۵ ولتی با Duty برابر ۵۰٪، سیگنال بین Low و High میرود؛ خروجی در تمام زمانها ۲٫۵ ولت ثابت نیست.
مثال کد این مقاله برای Arduino Uno R3 است. رفتار تایمر و پایهٔ PWM را به Uno R4، ESP32 یا STM32 تعمیم ندهید. نمودار همراه، موج ریاضیِ ایدهآل است و عکس اسیلوسکوپ یا نتیجهٔ آزمون برد واقعی نیست.
دوره، فرکانس و Duty را حساب کنیم
| کمیت | رابطه | مثال آموزشی |
|---|---|---|
| دوره T | زمان یک چرخه | ۲ ms |
| فرکانس f | 1/T | ۵۰۰ Hz |
| زمان High | D × T | برای D=25% برابر ۰٫۵ ms |
| میانگین ایدهآل | D×Vhigh + (1−D)×Vlow | با High=5V و Low=0، در ۲۵٪ برابر ۱٫۲۵ V |
میانگین، همهٔ رفتار بار را توضیح نمیدهد. موتور، مقاومت، LED و ورودی دیجیتال به پالس یکسان پاسخ یکسان نمیدهند. دامنهٔ واقعی GPIO نیز زیر بار با ریل تغذیه برابر فرض نمیشود؛ جریان مجاز پایه و درایور را جدا بررسی کنید.
مثال Uno: پنج فرمان روشنایی با زمان مشخص
برای آزمایش کمجریان، LED معمولی را با مقاومت سری ۱ kΩ از D9 به آند LED و کاتد را به GND وصل کنید؛ قبل از سیمبندی تغذیه را قطع کنید. LED پرتوان، نوار LED یا موتور را به GPIO وصل نکنید. برای آنها درایور مناسب و منبع جداگانهٔ طراحیشده لازم است.
برنامه هر دو ثانیه فرمان بعدی را میدهد: صفر، ۶۴، ۱۲۸، ۱۹۲ و ۲۵۵. برای Uno R3، API پیشفرض analogWrite از بازهٔ ۰ تا ۲۵۵ استفاده میکند. پایهٔ ۹ در تنظیم پیشفرض هستهٔ AVR حدود ۴۹۰ Hz دارد؛ موج ۵۰۰ Hz شکل، فقط برای سادهشدن محاسبه است. مرجع analogWrite جزئیات بردها را جدا میگوید.
#include <Arduino.h>
#if !defined(ARDUINO_AVR_UNO)
#error "This example is qualified for Arduino Uno R3 only."
#endif
constexpr uint8_t PWM_PIN = 9;
constexpr uint8_t LEVELS[] = {0, 64, 128, 192, 255};
uint8_t nextLevel = 0;
uint32_t lastChange = 0;
void setup() {
pinMode(PWM_PIN, OUTPUT);
analogWrite(PWM_PIN, 0);
Serial.begin(115200);
lastChange = millis();
}
void loop() {
const uint32_t now = millis();
if (uint32_t(now - lastChange) < 2000UL) return;
lastChange = now;
const uint8_t value = LEVELS[nextLevel];
analogWrite(PWM_PIN, value);
Serial.print(F("PWM command (0..255): "));
Serial.println(value);
nextLevel = (nextLevel + 1) % (sizeof(LEVELS) / sizeof(LEVELS[0]));
}عدد چاپشده «فرمان PWM» است، نه روشنایی اندازهگیریشده. چشم انسان پاسخ خطی ندارد؛ دو برابرکردن فرمان الزاماً دو برابر روشنایی ادراکشده نیست. کد برای Uno R3 کامپایل شده است؛ آزمون LED فیزیکی انجام نشده است.
فرکانس بالاتر همیشه بهتر نیست
فرکانس کم ممکن است چشمک یا صدای قابلشنیدن ایجاد کند؛ فرکانس بیشتر نیز تعداد سوئیچینگ، تلفات و نیاز درایور را بالا میبرد. در بسیاری از تایمرها، تعداد شمارش در یک چرخه میان فرکانس و تفکیک Duty تقسیم میشود. محدودیت دقیق را از تایمر همان MCU بخوانید.
روی Uno، تغییر تنظیم تایمر میتواند با کتابخانهها یا توابع زمان تداخل داشته باشد. کد بالا تایمر را بازپیکربندی نمیکند. اگر از موتور یا بار القایی استفاده میکنید، مهار انرژی و رفتار Gate به بخش توان تعلق دارد؛ مقالهٔ NMOS و PMOS و چرا ESP32 ریست میشود؟ عیبیابی Brownout و تغذیه را هم ببینید.
آیا با فیلتر RC خروجی نرمتر میشود؟
برای یک ورودی پرامپدانس، یک فیلتر پایینگذر میتواند مؤلفهٔ سریع PWM را کم کند، اما خروجی همچنان ریپل و زمان نشست دارد. مثال ایدهآل R=1 kΩ و C=10 µF، ثابت زمانی ۱۰ ms و فرکانس قطع حدود ۱۵٫۹ Hz میدهد. پنج ثابت زمانی تقریباً ۵۰ ms است؛ این عدد برای پاسخ پلهٔ مدل ایدهآل و بدون بار اضافه است.
tau = R * C
fc = 1 / (2 * pi * R * C)
R = 1000 ohm; C = 10e-6 F
tau = 0.010 s; fc = 15.915 Hzاگر بار مقاومت پایینی داشته باشد، هم سطح نهایی و هم پاسخ تغییر میکند. یک RC کوچک منبع تغذیهٔ بار نیست. برای خروجی آنالوگ دقیق، ریپل، تلرانس، بافر و نیاز به DAC را مقایسه کنید. فایل محاسبهٔ همراه، تفاوت میانگین و ریپل مدل را نشان میدهد.
خطاهای رایج در اندازهگیری و استفاده
| اشتباه | اصلاح |
|---|---|
| مولتیمتر ۲٫۵ V نشان میدهد، پس خروجی DC ثابت است | شکل موج، حالت اندازهگیری ابزار و فرکانس را بررسی کنید |
| PWM را به هر پایه بدهیم | پایه و تایمر پشتیبانیشدهٔ همان برد را انتخاب کنید |
| برای دو برابر توان، Duty را دو برابر کنیم | نوع بار، ولتاژ و تلفات درایور را در نظر بگیرید |
| فرمان صفر یعنی مدار توان حتماً خاموش است | حالت Reset، Pull-down و درایور را مستقل آزمایش کنید |
برای بررسی، فرمان، Duty مشاهدهشده، فرکانس، جریان و دمای درایور را جدا ثبت کنید. از گرمنشدن یک قطعه در چند ثانیه، تأیید حرارتی محصول نسازید.
پرسشهای رایج
آیا analogWrite همان DAC است؟
روی Uno R3 در این مثال، خروجی PWM است. بعضی بردها پایهٔ DAC دارند؛ اسم تابع را بدون مشخصات برد تفسیر نکنید.
آیا LED روشنایی خطی با فرمان دارد؟
روشنایی ادراکشده الزاماً خطی نیست و جریان واقعی به مدار LED بستگی دارد. عدد فرمان، واحد لوکس یا لومن نیست.
برای موتور چه فرکانسی انتخاب کنیم؟
از مشخصات موتور، درایور، صدا، تلفات و آزمون شروع کنید؛ یک عدد عمومی برای تمام موتورها وجود ندارد.
برای اجرای چند کار همزمان بدون توقف دوثانیهای، ساختار برنامه را در برنامهنویسی Arduino بدون delay؛ millis و زمانبندی چند کار مطالعه کنید.
منابع رسمی و فایلهای همراه
منابع فنی در ۲۰۲۶/۱۰/۱۳ بررسی شدهاند. نسخه و مدل قطعهٔ خود را با سند مرتبط تطبیق دهید.
دریافت برگهٔ تصمیم و ثبت آزمون (CSV)؛ بستهٔ کامل مقاله و فایلهای همراه از بخش دانلود همین صفحه در دسترس است.
شیوهٔ تدوین: تهیه و بررسی فنی با کمک ابزارهای هوش مصنوعی، منابع رسمی و مثالهای محاسباتی. اعداد فرضی با برچسب مثال آمدهاند؛ آزمون نرمافزاری یا کامپایل، جای آزمون قطعه و مدار واقعی را نمیگیرد.