الـ Pulse Width Modulation أو الـ PWM هي طريقـة للتحكم في عرض النبضــة في Train أو سلسلـة نبضات، أي أنهـا طريقـة للتحك في الفترة الزمنيـة التي تكـون فيهـا الإشارة HIGH و الفترة التي تكـون فيهـا الإشارة LOW. الـ PWM تستخدم في العديد من التطبيقـات مثل التحكم في محركـات السيرفو و دوائر التحكم في السرعـة للمحركـات و تحديد القدرة الفعالة للمحركـات.
الـ PWM في الأساس عبارة عن موجـة مربعـة Square wave يتغير فيهـا الأزمنة التي تكون فيهـا الإشارة LOW و HIGH, الشكل التالي يوضح إشارة الـ PWM
بعض المصطلحات المتعلقـة بالـ PWM
كما هو موضح بالشكل السابق، الـTon يمثل الزمن الذي تكون فيه الإشارة HIGH و الـ Toff يمثل الزمن الذي تكون فيه الإشارة LOW. الفترة الزمنية Period عبارة عن مجموع الأزمنة التي تكون فيها الإشارة HIGH و LOW و يتم التعبير عنها رياضياً كالتالـي:
دورة العمل عبارة عن النسبة المئوية لزمن التشغيل من الزمن الكلي، ويتم التعبير عنها رياضياً كالتالي:
تستخدم الدالـة analogWrite() لكتابـة قيمة تماثلية على أحد أرجل الأردوينـو التي تدعم الـPWM. يمكن إستخدام هذه الدالة لتشغيل المحركات بسرعات مختلفة أو تشغيل الـLED بسطوع مختلف. بعد إستدعاء دالة analogWrite() ستقوم الرجل الخاصة بالأردوينـو بإنتاج موجة مربعـة ثابتـة لدورة العمل المحددة حتى الإستدعاء التالي لدالة analogWrite() أو دالة digitalRead() أو digitalWrite() على نفس الرجل. يبلغ تردد إشارة PWM على معظم الأرجل حوالي 490 هرتز. في لوحات Uno واللوحات المشابهة، يبلغ تردد الأطراف 5 و6 حوالي 980 هرتز. تعمل الأرجل رقم 3 و 11 الموجودة في أردوينو ليوناردو أيضًا بسرعة 980 هرتز.
في معظم لوحات أردوينو (التي تحتوي على ATmega168 أو ATmega328)، تعمل هذه الوظيفة على الأرجل 3 و5 و6 و9 و10 و11. وفي Arduino Mega، تعمل على الأرجل 2 - 13 و44 - 46. اللوحات التي تحتوي على ATmega8 تدعم فقط AnalogWrite() على الأرجل 9 و10 و11.
يدعم Arduino Due دالة AnalogWrite() على الأرجل من 2 إلى 13، وعلى الأرجل DAC0 وDAC1. على عكس أطراف PWM، فإن DAC0 وDAC1 عبارة عن محولات رقمية إلى تناظرية، وتعمل كمخرجات تناظرية حقيقية.
لا تحتاج إلى استدعاء pinMode() لتعيين الرجل كمخرج قبل استدعاء AnalogWrite().
القيمة - دورة العمل: بين 0 (إيقاف دائمًا) و255 (تشغيل دائمًا).
int ledPin = 9; // LED connected to digital pin 9
int analogPin = 3; // potentiometer connected to analog pin 3
int val = 0; // variable to store the read value
void setup() {
pinMode(ledPin, OUTPUT); // sets the pin as output
}
void loop() {
val = analogRead(analogPin); // read the input pin
analogWrite(ledPin, (val / 4)); // analogRead values go from 0 to 1023,
// analogWrite values from 0 to 255
}
المختــرع المجنــون © جميـــع الحقــوق محفوظــة