راه اندازی PWM (پالس مربعی) در ESP32

به نام خدا

به آموزش راه اندازی PWM (پالس مربعی) در ESP32 خوش آمدید.

در این جلسه به آموزش راه اندازی PWM (پالس مربعی) در ESP32در ARDUINO IDE می پردازیم.

این آموزش شامل یک مدار ساده با یک کنترلر LED در ESP32 هست که نور یک LED رو کم و زیاد می کنه. همچنین یاد می گیریم چطور پالس مربعی یکسانی رو به صورت همزمان روی GPIO های مختلف داشته باشیم.

 قطعاتی که برای این مثال نیاز داریم

کنترلر پالس مربعیLED  در ESP32

ESP32 یک کنترلری برای پالس مربعی LED داره که ۱۶ تا کانال جداگانه برای تولید ۱۶ تا سیگنال پالس مربعی با مشخصات متفاوتی داره.

خب چه مراحلی برای کم کردن نور یک LED در ARDUINO IDE وجود داره؟

  • اولین مرحله باید یکی از ۱۶ تا کانال رو (از ۰ تا ۱۵) انتخاب کنید.
  • مرحله بعدی مشخص کردن فرکانس پالس مربعیه . مثلا برای LED فرکانس ۵۰۰۰ HZ  مناسبه.
  • کار دیگه ای که نیازه انجام بدین باید رزولوشن سیکل وظیفه (Duty Cycle) رو مشخص کنید. از رزولوشن ۱ تا ۱۶ بیتی که در اختیار داریم (برای توضیحات بیشتر اینجا کلیک کنید) ما رزولوشن ۸ بیتی رو استفاده می کنیم. یعنی برای کنترل نور LED اعداد در بازه ۰ تا ۲۵۵ هستن.
  • در مرحله بعد باید  مشخص کنید با چه GPIO یا GPIO هایی سیگنال رو منتقل می کنید.  با کمک دستور زیر این کار انجام میشه :
ledcAttachPin(GPIO, channel)
  • در مرحله آخر هم با دستور زیر به کمک PWM نور LED رو تنظیم می کنید:
ledcWrite(channel, dutycycle)

با هم مثال کنترل نور LED با PWM رو بررسی می کنیم .

شماتیک

به صورت شکل زیر یک LED رو به ESP32 با سیم متصل کنید. LED باید به GPIO شماره ۱۶ متصل بشه.

حالا کد زیر رو در ARDUINO IDE کپی کنید :

// the number of the LED pin
const int ledPin = 16;  // 16 corresponds to GPIO16

// setting PWM properties
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
 
void setup(){
  // configure LED PWM functionalitites
  ledcSetup(ledChannel, freq, resolution);
  
  // attach the channel to the GPIO to be controlled
  ledcAttachPin(ledPin, ledChannel);
}
 
void loop(){
  // increase the LED brightness
  for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){   
    // changing the LED brightness with PWM
    ledcWrite(ledChannel, dutyCycle);
    delay(15);
  }

  // decrease the LED brightness
  for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
    // changing the LED brightness with PWM
    ledcWrite(ledChannel, dutyCycle);   
    delay(15);
  }
}


جزییات این کد رو بررسی کنیم؟

کارمون رو با مشخص کردن شماره پین که اینجا GPIO شماره ۱۶ هست شروع کردیم.

const int ledPin = 16;  // 16 corresponds to GPIO16

در خط های بعدی کد مشخصات سیگنال PWM ، فرکانس ۵۰۰۰ HZ ، کانال شماره صفر و رزولوشن ۸ بیتی رو تنظیم کردیم. اگر پالس مربعی با مشخصات دیگه ای نیاز داشتین همین پارامترها رو تغییر بدید.

const int freq = 5000; 
const int ledChannel = 0; 
const int resolution = 8;

در دستور ()SETUP، شما باید پالس مربعی LED رو پیکربندی کنید . این کار با مشخصاتی که از قبل در آرگومان های ورودی دستور  ()ledcSetup وارد کردید انجام میشه. مثلا کانال LED ، فرکانس ، رزولوشن :

ledcSetup(ledChannel, freq, resolution);

بعد باید مشخص کنید با کدوم GPIO سیگنال رو دریافت می کنید. این هم با دستور ()ledcAttachPin که آرگومان های ورودیش GPIO انتخابی و کانال هست انجام میشه. در این مثال ما سیگنال رو با ()GPIO ledPin که GPIO شماره ۱۶ هست می گیریم.کانال رو هم در ledChannel که کانال شماره صفر هست تنظیم کردیم :

ledcAttachPin(ledPin, ledChannel);

با استفاده از حلقه زیر با تغییر سیکل وظیفه از ۰ تا ۲۵۵ نور LED رو زیاد میشه:

for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
    // changing the LED brightness with PWM
    ledcWrite(ledChannel, dutyCycle);
    delay(15); 
{

و با تغییر سیکل وظیفه از ۲۵۵ تا ۰ نور LED رو کم میشه:

for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
    // changing the LED brightness with PWM
    ledcWrite(ledChannel, dutyCycle);
    delay(15);
 }

برای تنظیم نور LED کافیه دستور  ()ledcWrite رو بنویسید و در ورودی هاش کانال و سیکل وظیفه رو مشخص کنید:

ledcWrite(ledChannel, dutyCycle);

ما رزولوشن ۸ بیتی در نظر گرفتیم پس باید Duty Cycle  مقداری بین ۰ تا ۲۵۵ داشته باشه.

نکته : توجه داشته باشید که در دستور ()ledcWrite کانالی رو استفاده می کنیم که سیگنال رو تولید می کنه نه GPIO !

تست مثال

کد رو در ESP32 آپلود کنید . به مدار که نگاه کنید LED رو می بینید که نورش کم و زیاد میشه.

سیگنال پالس مربعی یکسان در GPIO های مختلف

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

حالا با هم مثال قبلی رو برای تغییر نور ۳ تا LED با یک PWM و یک کانال تغییر بدیم .

شماتیک به این صورت میشه:

کد زیر رو در ARDUINO IDE کپی کنید:

// the number of the LED pin
const int ledPin = 16;  // 16 corresponds to GPIO16
const int ledPin2 = 17; // 17 corresponds to GPIO17
const int ledPin3 = 5;  // 5 corresponds to GPIO5

// setting PWM properties
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;

void setup(){
  // configure LED PWM functionalitites
  ledcSetup(ledChannel, freq, resolution);

  // attach the channel to the GPIO to be controlled
  ledcAttachPin(ledPin, ledChannel);
  ledcAttachPin(ledPin2, ledChannel);
  ledcAttachPin(ledPin3, ledChannel);
} 

void loop(){
  // increase the LED brightness
  for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){   
    // changing the LED brightness with PWM
    ledcWrite(ledChannel, dutyCycle);
    delay(15);
  }

  // decrease the LED brightness
  for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
    // changing the LED brightness with PWM
    ledcWrite(ledChannel, dutyCycle);   
    delay(15);
  }
}

تغییراتی که در کد مثال قبل اعمال کردیم رو با هم بررسی کنیم.

دو مقدار جدید رو برای دو LED دیگه اضافه  کردیم که مربوط به GPIO17 و  GPIO5هستن.

const int ledPin2 = 17; // 17 corresponds to GPIO17 
const int ledPin3 = 5;  // 5 corresponds to GPIO5

و بعد در دستور ()setup در دو خط کد زیر ، هر دو GPIO رو به کانال صفر متصل کردیم. یعنی ما یک سیگنال رو از طریق کانال شماره ۰ ، روی هر دو GPIO دریافت می کنیم :

ledcAttachPin(ledPin2, ledChannel); 
ledcAttachPin(ledPin3, ledChannel);

تست پروژه

کد برنامه رو در ESP32 آپلود کنید و به مدار نگاه کنید.

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

پایان آموزش راه اندازی PWM (پالس مربعی) در ESP32.

2 دیدگاه در “راه اندازی PWM (پالس مربعی) در ESP32

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

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

قبلا حساب کاربری ایجاد کرده اید؟
گذرواژه خود را فراموش کرده اید؟
Loading...