آموزش ESP32آموزش اینترنت اشیا

آموزش استفاده از PWM برد ESP32 (+ پیکربندی کامل)

اگر قبلا با آردوینو کار کرده باشید، احتمالاً با تابع analogWrite() و سادگی تولید سیگنال PWM آشنا هستید: کافی است پین و سیکل وظیفه را مشخص کنید و کار تمام است.

اما در ESP32 قضیه کمی پیچیده تر است. این تراشه کنترل های بیشتری در اختیار قرار می دهد، ولی باید پارامترهای بیشتری را هم مشخص کنیم: فرکانس PWM، رزولوشن PWM، کانالی که استفاده می شود و البته مقدار duty cycle و شماره پین. این فهرست اول ممکن است طولانی به نظر برسد اما جای نگرانی نیست.

در این راهنما مفاهیم پایه PWM در ESP32 و نکات عملی لازم برای پیاده سازی آن و نمونه های کاربردی را بررسی می کنیم.

دوره آموزش ESP32 دوره آموزش اینترنت اشیا حرفه ای دوره آموزش اینترنت اشیا مقدماتی دوره آموزش آردوینو

پین های PWM در ESP32

در ESP32 تقریباً همه GPIO ها می توانند خروجی PWM تولید کنند، به جز چهار GPIO که فقط ورودی هستند. در تصویر زیر GPIO هایی که از PWM پشتیبانی می کنند نمایش داده شده اند.

نقشه GPIO های ESP32 که پشتیبانی PWM را نشان می دهد

PWM در ESP32

ESP32 دو واحد PWM جدا دارد: LED Control Peripheral (LEDC) و Motor Control Pulse Width Modulator Peripheral (MCPWM).

MCPWM برای کنترل موتور طراحی شده و قابلیت های اضافی مانند dead zone و auto braking را در اختیار قرار می دهد. از سوی دیگر LEDC برای درایو کردن LED ها طراحی شده و امکاناتی مانند auto dimming و ویژگی های پیشرفته تر را فراهم می کند، هرچند می توان از آن برای تولید سیگنال PWM در کاربردهای دیگر نیز استفاده کرد.

در این آموزش تمرکز اصلی ما روی واحد LEDC خواهد بود.

فرکانس PWM

واحد LEDC مانند اکثر کنترلرهای PWM از یک تایمر برای تولید سیگنال PWM استفاده می کند.

تایمر را مانند یک شمارنده در نظر بگیرید که از صفر شروع به شمارش می کند تا به یک حد بیشینه برسد، سپس به صفر بازنشانی شده و سیکل بعدی آغاز می شود. مدت زمانی که بین این بازنشانی ها می گذرد همان فرکانس PWM است و با هرتز (Hz) اندازه گیری می شود. به عنوان مثال اگر فرکانس را 1 Hz مشخص کنیم، تایمر برای رفتن از 0 تا مقدار بیشینه و شروع سیکل بعدی یک ثانیه زمان نیاز دارد. اگر فرکانس را 1000 Hz تنظیم کنیم، تایمر تنها 1 میلی ثانیه برای طی کردن آن بازه نیاز دارد.

نمودار زمانی که مفهوم فرکانس PWM را نمایش می دهد

ESP32 توانایی تولید سیگنال PWM تا فرکانس 40 MHz را دارد.

رزولوشن PWM

حداکثر مقدار شمارش تایمر که در مطالب قبلی به آن اشاره شد به رزولوشن PWM بستگی دارد. اگر رزولوشن n بیت باشد، تایمر از 0 تا 2n−1 می شمارد و سپس بازنشانی می شود. برای مثال اگر فرکانس را 1 Hz و رزولوشن را 8 بیت تنظیم کنیم، تایمر یک ثانیه طول می کشد تا از 0 تا 255 (28−1) بشمارد. اگر رزولوشن را 16 بیت انتخاب کنیم، تایمر باز هم یک ثانیه طول می کشد اما این بار از 0 تا 65,535 (216−1) می شمارد.

نمایش شماتیک شمارش تایمر برای رزولوشن 8 بیت
نمایش شماتیک شمارش تایمر برای رزولوشن 16 بیت

رزولوشن بالاتر یعنی تعداد گام های زمانی بیشتر در همان بازه زمانی مشخص؛ به عبارت دیگر دقت یا granularity بیشتری در تنظیم duty cycle خواهیم داشت.

رزولوشن PWM در ESP32 قابل تنظیم از 1 تا 16 بیت است. بنابراین می توان duty cycle را تا 65,536 سطح مختلف (216) تنظیم کرد که کنترل بسیار دقیق تری روی روشنایی LED ها یا سرعت موتورها فراهم می کند.

دیوٹی سایکل (Duty Cycle)

دیوٹی سایکل نشان دهنده تعداد تیک های تایمر است که خروجی PWM در وضعیت HIGH باقی می ماند قبل از اینکه به LOW برگردد. مقدار دیوٹی سایکل در رجیستر capture/compare تایمر ذخیره می شود.

هنگامی که تایمر بازنشانی می شود، خروجی PWM HIGH می شود. وقتی تایمر به مقدار ذخیره شده در capture/compare می رسد، خروجی LOW می شود و تایمر به شمارش ادامه می دهد. پس از رسیدن تایمر به مقدار بیشینه، خروجی دوباره HIGH شده و سیکل بعدی آغاز می شود.

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید

مثال: بخواهیم سیگنال PWM با فرکانس 1000 Hz، رزولوشن 8 بیت و دیوٹی 75% تولید کنیم. با رزولوشن 8 بیت مقدار بیشینه تایمر 255 خواهد بود. در فرکانس 1000 Hz تایمر برای شمارش از 0 تا 255 حدود 1 ms طول می کشد. مقدار ذخیره شده در capture/compare برابر 256 × 75% = 192 خواهد بود. وقتی تایمر بازنشانی شود خروجی HIGH می شود و تا رسیدن شمارنده به 192 HIGH باقی می ماند؛ پس از آن خروجی LOW می شود و پس از رسیدن شمارنده به 255 سیکل تکرار می شود.

نمودار نشان دهنده تغییر وضعیت خروجی بر اساس مقدار capture/compare

کانال های PWM

هر کانال نشان دهنده یک سیگنال خروجی PWM مستقل است.

ESP32 دارای 16 کانال است؛ یعنی می تواند تا 16 موج PWM منحصر به فرد تولید کند. این کانال ها به دو گروه تقسیم شده اند: 8 کانال high-speed و 8 کانال low-speed.

شمای تقسیم بندی 16 کانال PWM به گروه های high-speed و low-speed

کانال های high-speed سخت افزاری پیاده سازی شده اند و تغییرات دیوٹی سایکل را به صورت خودکار و بدون لرزش (glitch-free) اعمال می کنند. کانال های low-speed این قابلیت های سخت افزاری را ندارند و تغییر دیوٹی سایکل برای آن ها به وسیله نرم افزار انجام می شود.

در هر گروه، 4 تایمر بین 8 کانال به اشتراک گذاشته شده اند، یعنی هر دو کانال یک تایمر مشترک دارند. از آنجا که فرکانس را تایمر تعیین می کند، نمی توان فرکانس هر دو کانال در یک جفت را مستقل از هم تغییر داد؛ اما می توان دیوٹی سایکل هر کانال را به طور مستقل کنترل کرد.

خلاصه: ESP32 دارای 16 کانال PWM است که می توانند در مجموع تا هشت فرکانس مختلف داشته باشند، و هر کانال می تواند دیوٹی سایکل متفاوتی داشته باشد.

برای تولید PWM روی یک پین خاص، آن پین را به یک کانال «متصل» می کنیم تا خروجی کانال روی آن پین قرار گیرد. می توان چند پین مختلف را به یک کانال وصل کرد تا همه همان سیگنال را صادر کنند. اگرچه همه GPIO ها توانایی خروجی PWM دارند، محدودیت واقعی در تعداد کانال ها است: فقط 16 سیگنال متفاوت در یک زمان می توان تولید کرد. این موضوع تعداد پین هایی که می توانند PWM خروجی بدهند را محدود نمی کند، بلکه تنوع سیگنال های همزمان را محدود می کند.

مثلاً برای همزمانی چند LED می توان یک کانال با فرکانس و دیوٹی مشخص تنظیم کرد و چند پین را به آن کانال متصل نمود. اما برای کنترل سرووها که هر کدام باید به صورت مستقل کار کنند، بهتر است پین های مختلف به کانال های متفاوت اختصاص یابند.

انتخاب فرکانس و رزولوشن PWM

ESP32 توانایی تولید سیگنال PWM تا 40 MHz را دارد و رزولوشن از 1 تا 16 بیت قابل تنظیم است. اما این به معنای امکان انتخاب همزمان 40 MHz و 16 بیت نیست؛ علت این است که فرکانس و رزولوشن هر دو توسط منبع ساعت محدود می شوند.

برای روشن شدن موضوع فرض کنید کلاکی با فرکانس 40 MHz وجود دارد؛ در این حالت سریع ترین فرکانس قابل تولید نیز نمی تواند از 40 MHz بیشتر باشد. از طرف دیگر رزولوشن مشخص می کند که یک دوره PWM تا چه حد به تکه های زمانی کوچک تقسیم شود. برای ایجاد این تقسیم بندی نیاز است که کلاک سیستمی با نرخ PWM_freq × 2PWM_resolution در دسترس باشد؛ یعنی:

  • PWM_freq × 2PWM_resolution نباید از سرعت کلاک فراتر رود.
  • فرکانس و رزولوشن وابسته به هم هستند: هرچه فرکانس بالاتر باشد رزولوشن دیوٹی سایکل کمتر خواهد بود و بالعکس.

در اسناد Espressif آمده است که منبع ساعت تایمر low-speed واحد LEDC کلاک APB با فرکانس 80 MHz است. به عنوان یک قاعده کلی باید تلاش شود تا مقدار PWM_freq × 2PWM_resolution کمتر از 80 MHz نگه داشته شود.

اسناد Espressif چند مثال نیز ارائه می دهند:

  • فرکانس PWM برابر 5 kHz می تواند رزولوشن حداکثر 13 بیت داشته باشد که برابر با ~0.012% دقت یا 213=8192 سطح مجزا است.
  • فرکانس PWM برابر 20 MHz می تواند رزولوشن حداکثر 2 بیت داشته باشد که برابر 25% دقت یا 22=4 سطح مجزا است.
  • فرکانس PWM برابر 40 MHz تنها می تواند رزولوشن 1 بیت داشته باشد؛ در این حالت دیوٹی سایکل ثابت 50% خواهد بود و قابل تغییر نیست.

اگر این اعداد گیج کننده به نظر می رسند، به عنوان نقطه شروع می توانید از تنظیم رایج آردوینو Uno یعنی تقریباً 490 Hz با رزولوشن 8 بیت استفاده کنید که برای محو کردن یک LED به طور روان کافی است. به عنوان مثال 500 Hz و رزولوشن 8 بیت یک نقطه شروع مناسب است و سپس می توانید آزمایش کنید.

تولید سیگنال PWM با کتابخانه LEDC

هسته آردوینو برای ESP32 شامل کتابخانه LEDC است که کار مدیریت PWM را ساده می کند. این کتابخانه برای کنترل LED طراحی شده اما می توان از آن برای کاربردهایی مانند تولید صدا در بیزر و درایو موتور هم استفاده کرد.

<pمراحل کلی برای تولید PWM با استفاده از LEDC در محیط Arduino IDE به قرار زیر است:

  1. انتخاب کانال PWM: از بین 16 کانال شماره های 0 تا 15 را می توان انتخاب کرد.
  2. تعیین فرکانس PWM: تا 40 MHz قابل انتخاب است؛ برای مثال برای محو کردن LED فرکانس 500 Hz معمولاً کافی است.
  3. تعیین رزولوشن PWM: از 1 تا 16 بیت قابل انتخاب است. تعداد گام های دیوٹی برابر 2resolution است. برای رزولوشن 8 بیت، سطوح 0–255 و برای 16 بیت سطوح 0–65535 وجود دارد.
  4. انتخاب پین های GPIO: پین یا پین های مورد نظر برای خروجی PWM را انتخاب کنید.
  5. اتصال پین ها به کانال: با استفاده از تابع ledcAttachChannel(pin, freq, resolution, channel) پین ها را به کانال انتخابی با فرکانس و رزولوشن مشخص متصل کنید.
  6. تنظیم دیوٹی سایکل: با استفاده از تابع ledcWriteChannel(channel, dutycycle) مقدار دیوٹی سایکل برای یک کانال را تعیین کنید.

مثال 1 – محو کردن یک LED

در این مثال یک اسکچ ساده نشان داده می شود که چگونه یک LED را با استفاده از PWM در ESP32 به صورت نرم روشن و خاموش کنیم.

سیم کشی

اتصال ساده است: یک LED و یک مقاومت محدود کننده جریان 330 Ω روی برد قرار دهید. پایه بلندتر LED (آند) را از طریق مقاومت 330 Ω به پین GP18 وصل کنید و پایه کوتاه تر (کتد) را به زمین ESP32 متصل کنید.

سیم کشی LED با مقاومت 330 Ω به پین GPIO18 روی برد ESP32

کد

کد زیر را در Arduino IDE کپی کنید:

const int PWM_CHANNEL = 0;     // ESP32 has 16 channels which can generate 16 independent waveforms
const int PWM_FREQ = 500;      // Recall that Arduino Uno is ~490 Hz. Official ESP32 example uses 5,000Hz
const int PWM_RESOLUTION = 8;  // We'll use same resolution as Uno (8 bits, 0-255) but ESP32 can go up to 16 bits

// The max duty cycle value based on PWM resolution (will be 255 if resolution is 8 bits)
const int MAX_DUTY_CYCLE = (int)(pow(2, PWM_RESOLUTION) - 1);

const int LED_OUTPUT_PIN = 18;

const int DELAY_MS = 4;  // delay between fade increments

void setup() {
  // Attach the GPIO to the Channel
  ledcAttachChannel(LED_OUTPUT_PIN, PWM_FREQ, PWM_RESOLUTION, PWM_CHANNEL);
}

void loop() {

  // fade up PWM on given channel
  for (int dutyCycle = 0; dutyCycle <= MAX_DUTY_CYCLE; dutyCycle++) {
    ledcWriteChannel(PWM_CHANNEL, dutyCycle);
    delay(DELAY_MS);
  }

  // fade down PWM on given channel
  for (int dutyCycle = MAX_DUTY_CYCLE; dutyCycle >= 0; dutyCycle--) {
    ledcWriteChannel(PWM_CHANNEL, dutyCycle);
    delay(DELAY_MS);
  }
}

اجرای مثال

کد را آپلود کنید. مشاهده خواهید کرد که روشنایی LED به صورت نرم از خاموش تا کامل روشن و دوباره به خاموش تغییر می کند.

توضیح کد

در ابتدای اسکچ چند ثابت برای پیکربندی PWM تعریف شده است. اول PWM_CHANNEL که برابر 0 قرار گرفته است. ESP32 دارای کانال های 0 تا 15 است که هر کدام می توانند موج های مستقل تولید کنند.

PWM_FREQ برابر 500 تعیین شده که فرکانس سیگنال PWM ما است. مقدار حدودی آردوینو Uno تقریباً 490 Hz است و این مقدار برای محو کردن LED کافی است.

PWM_RESOLUTION برابر 8 بیت تنظیم شده است. هرچند ESP32 تا 16 بیت را پشتیبانی می کند، در این مثال از 8 بیت (مطابق Uno) استفاده شده است.

const int PWM_CHANNEL = 0;
const int PWM_FREQ = 500;
const int PWM_RESOLUTION = 8;

سپس MAX_DUTY_CYCLE با فرمول 2PWM_RESOLUTION − 1 محاسبه می شود تا بیشینه مقدار دیوٹی بر اساس رزولوشن مشخص گردد.

const int MAX_DUTY_CYCLE = (int)(pow(2, PWM_RESOLUTION) - 1);

LED_OUTPUT_PIN روی 18 تنظیم شده و DELAY_MS برابر 4 میلی ثانیه تعیین شده است تا سرعت محو شدن کنترل شود.

const int LED_OUTPUT_PIN = 18;
const int DELAY_MS = 4;

در setup با فراخوانی ledcAttachChannel() پین به کانال متصل می شود تا کانال با فرکانس و رزولوشن انتخاب شده سیگنال را تولید کند.

ledcAttachChannel(LED_OUTPUT_PIN, PWM_FREQ, PWM_RESOLUTION, PWM_CHANNEL);

در حلقه اول for مقدار دیوٹی از 0 تا MAX_DUTY_CYCLE به صورت مرحله ای افزایش می یابد و LED روشن می شود. در حلقه دوم برای مقدار دیوٹی را از MAX_DUTY_CYCLE تا 0 کاهش می دهیم تا LED کم نور شود.

for(int dutyCycle = 0; dutyCycle <= MAX_DUTY_CYCLE; dutyCycle++){   
  ledcWrite(PWM_CHANNEL, dutyCycle);
  delay(DELAY_MS);
}

for(int dutyCycle = MAX_DUTY_CYCLE; dutyCycle >= 0; dutyCycle--){
  ledcWrite(PWM_CHANNEL, dutyCycle);   
  delay(DELAY_MS);
}

در هر دو حلقه از ledcWriteChannel(channel, dutyCycle) برای اعمال مقدار دیوٹی روی کانال استفاده می شود.

ledcWriteChannel(ledChannel, dutyCycle);

مثال 2 – یک سیگنال PWM یکسان روی چند GPIO

می توانید یک سیگنال PWM را همزمان روی چند GPIO داشته باشید؛ کافی است آن GPIO ها را به یک کانال متصل کنید.

سیم کشی سه LED

دو LED دیگر مانند LED اول اضافه کنید و آن ها را به GPIO19 و GPIO21 متصل کنید.

سیم کشی سه LED به پین های GPIO18، GPIO19 و GPIO21 برای دریافت یک سیگنال PWM یکسان

کد

کد مثال قبل را به گونه ای تغییر می دهیم که سه LED با یک کانال یکسان محو شوند:

const int PWM_CHANNEL = 0;     // ESP32 has 16 channels which can generate 16 independent waveforms
const int PWM_FREQ = 500;      // Recall that Arduino Uno is ~490 Hz. Official ESP32 example uses 5,000Hz
const int PWM_RESOLUTION = 8;  // We'll use same resolution as Uno (8 bits, 0-255) but ESP32 can go up to 16 bits

// The max duty cycle value based on PWM resolution (will be 255 if resolution is 8 bits)
const int MAX_DUTY_CYCLE = (int)(pow(2, PWM_RESOLUTION) - 1);

const int LED_1_OUTPUT_PIN = 18;
const int LED_2_OUTPUT_PIN = 19;
const int LED_3_OUTPUT_PIN = 21;

const int DELAY_MS = 4;  // delay between fade increments

void setup() {
  // Attach the GPIOs to the same Channel
  ledcAttachChannel(LED_1_OUTPUT_PIN, PWM_FREQ, PWM_RESOLUTION, PWM_CHANNEL);
  ledcAttachChannel(LED_2_OUTPUT_PIN, PWM_FREQ, PWM_RESOLUTION, PWM_CHANNEL);
  ledcAttachChannel(LED_3_OUTPUT_PIN, PWM_FREQ, PWM_RESOLUTION, PWM_CHANNEL);
}

void loop() {
  // fade up PWM on given channel
  for (int dutyCycle = 0; dutyCycle <= MAX_DUTY_CYCLE; dutyCycle++) {
    ledcWriteChannel(PWM_CHANNEL, dutyCycle);
    delay(DELAY_MS);
  }

  // fade down PWM on given channel
  for (int dutyCycle = MAX_DUTY_CYCLE; dutyCycle >= 0; dutyCycle--) {
    ledcWriteChannel(PWM_CHANNEL, dutyCycle);
    delay(DELAY_MS);
  }
}

اجرای مثال

کد را آپلود کنید؛ هر سه LED همزمان محو خواهند شد چون همه GPIO ها سیگنال PWM یکسانی را دریافت می کنند.

توضیح کد

در مقایسه با اسکچ اول تفاوت ها اندک است: در ناحیه جهانی سه ثابت LED_1_OUTPUT_PIN، LED_2_OUTPUT_PIN و LED_3_OUTPUT_PIN تعریف شده و مقادیر 18، 19 و 21 به آن ها نسبت داده شده است تا نشان دهد هر LED به یک GPIO جداگانه متصل است.

const int LED_1_OUTPUT_PIN = 18;
const int LED_2_OUTPUT_PIN = 19;
const int LED_3_OUTPUT_PIN = 21;

در setup سه بار ledcAttachChannel فراخوانی می شود تا هر سه پین به همان کانال متصل شوند و بنابراین همان سیگنال PWM را دریافت کنند. حلقه loop تغییری نکرده است چون یک کانال همه LED ها را کنترل می کند.

ledcAttachChannel(LED_1_OUTPUT_PIN, PWM_FREQ, PWM_RESOLUTION, PWM_CHANNEL);
ledcAttachChannel(LED_2_OUTPUT_PIN, PWM_FREQ, PWM_RESOLUTION, PWM_CHANNEL);
ledcAttachChannel(LED_3_OUTPUT_PIN, PWM_FREQ, PWM_RESOLUTION, PWM_CHANNEL);

مثال 3 – محو کردن LED با پتانسیومتر

این مثال نشان می دهد چگونه با پتانسیومتر مقدار دیوٹی را به صورت دینامیک تعیین کنیم و روشنایی LED را کنترل کنیم.

سیم کشی

دو LED اضافی را بردارید و یک پتانسیومتر اضافه کنید. یکی از پایه های خارجی پتانسیومتر را به 3.3V و پایه خارجی دیگر را به GND متصل کنید و پایه وسط (wiper) را به GPIO34 وصل کنید.

اتصال پتانسیومتر به 3.3V، GND و ورودی آنالوگ GPIO34

کد

const int PWM_CHANNEL = 0;    // ESP32 has 16 channels which can generate 16 independent waveforms
const int PWM_FREQ = 500;     // Recall that Arduino Uno is ~490 Hz. Official ESP32 example uses 5,000Hz
const int PWM_RESOLUTION = 8; // We'll use same resolution as Uno (8 bits, 0-255) but ESP32 can go up to 16 bits 

// The max duty cycle value based on PWM resolution (will be 255 if resolution is 8 bits)
const int MAX_DUTY_CYCLE = (int)(pow(2, PWM_RESOLUTION) - 1); 

const int LED_OUTPUT_PIN = 18;
const int POT_PIN = 34;

const int DELAY_MS = 100;  // delay between fade increments

void setup() {
  // Attach the GPIO to the Channel
  ledcAttachChannel(LED_OUTPUT_PIN, PWM_FREQ, PWM_RESOLUTION, PWM_CHANNEL);
}

void loop() {
  int dutyCycle = map(analogRead(POT_PIN), 0, 4095, 0, MAX_DUTY_CYCLE);
  ledcWriteChannel(PWM_CHANNEL, dutyCycle);

  delay(DELAY_MS);
}

اجرای مثال

پتانسیومتر را تا انتها بچرخانید و سپس در جهت مخالف. خواهید دید روشنایی LED از یک انتها کاملاً خاموش تا انتهای دیگر کاملاً روشن تغییر می کند.

توضیح کد

در این اسکچ یک ثابت جدید POT_PIN تعریف شده و مقدار آن برابر 34 قرار گرفته است، به این معنی که پتانسیومتر به GPIO34 متصل است و مقدار آن برای تعیین دیوٹی سایکل استفاده می شود.

const int POT_PIN = 34;

در حلقه اصلی به جای استفاده از حلقه های for، مقدار آنالوگ از پتانسیومتر با analogRead(POT_PIN) خوانده می شود. مقدار خوانده شده در بازه 0 تا 4095 است و با تابع map() به بازه 0 تا MAX_DUTY_CYCLE تبدیل می شود تا با محدوده قابل قبول برای PWM متناظر شود. سپس ledcWriteChannel(PWM_CHANNEL, dutyCycle) مقدار محاسبه شده را روی کانال اعمال می کند.

analogRead(POT_PIN);

int dutyCycle = map(analogRead(POT_PIN), 0, 4095, 0, MAX_DUTY_CYCLE);

ledcWriteChannel(PWM_CHANNEL, dutyCycle);

سوالات متداول

آیا همه GPIO های ESP32 از PWM پشتیبانی می کنند؟

تقریباً همه GPIO ها می توانند خروجی PWM تولید کنند؛ تنها استثناء چهار GPIO هستند که فقط ورودی (input only) هستند و از خروجی PWM پشتیبانی نمی کنند.

تفاوت کانال های high-speed و low-speed چیست؟

کانال های high-speed پیاده سازی سخت افزاری دارند و تغییرات دیوٹی سایکل را به صورت خودکار و بدون ایجاد glitch اعمال می کنند. کانال های low-speed این قابلیت سخت افزاری را ندارند و تغییر دیوٹی سایکل برای آن ها از طریق نرم افزار انجام می شود. همچنین هر 2 کانال از یک تایمر مشترک استفاده می کنند و بنابراین فرکانس آن ها در زوج ها قابل تفکیک نیست ولی دیوٹی سایکل هر کانال مستقل است.

چطور فرکانس و رزولوشن PWM را انتخاب کنم؟

فرکانس و رزولوشن به هم وابسته اند زیرا مقدار PWM_freq × 2PWM_resolution نباید از سرعت کلاک منبع تجاوز کند. منبع کلاک تایمر low-speed در LEDC کلاک APB با فرکانس 80 MHz است، بنابراین به عنوان قاعده کلی باید تلاش کنید تا PWM_freq × 2PWM_resolution کمتر از 80 MHz بماند. به عنوان نقطه شروع عملی می توانید از 500 Hz فرکانس و رزولوشن 8 بیت استفاده کنید.

5 (1 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *