analogWrite – הסבר ופרטים

- עמוד זה הוא חלק מהמדריך לפונקציות ארדואינו -

הפונקציה analogWrite(pin, val) גורמת לפלט של אות PWM בפין המתאים בלוח הארדואינו. פלט זה ימשיך ברציפות, בלי להפריע לפעולת הקוד הראשי.

שם הפונקציה מטעה, מכיוון שהיא אינה מאפשרת פלט של מתח אנלוגי (רצוף) אמתי, אלא רק קפיצה מהירה הלוך-ושוב ממתח מינימום (LOW) למקסימום (HIGH). בנסיבות מסוימות מאד ומוגבלות, פלט שכזה יכול להיתפס כשווה-ערך לפלט אנלוגי של ממש.

פרמטרים

pin הוא מספר הפין הרלוונטי, כפי שהוא רשום על לוח הארדואינו. פרמטר זה הוא מטיפוס uint8_t. הפונקציה analogWrite מסוגלת לעבוד אך ורק עם מספר מצומצם של פינים מוגדרים מראש. לרוב, הם מסומנים על גבי לוח הארדואינו בסימון מיוחד (כגון התו ~, # או הכיתוב PWM). בלוחות ארדואינו שמבוססים על המיקרו-בקר ATmega328P, כגון ארדואינו אונו (Uno) או נאנו (Nano) אלו הם הפינים 3,5,6,9,10,11.

val, מטיפוס int, קובע את חלק ה-HIGH מתוך 255 היחידות שמהוות את מחזור ה-PWM השלם. חלק ה-LOW יהיה לפיכך 255 פחות val.

הסבר קצר: אות PWM בארדואינו

אות PWM (ראשי תיבות של Pulse Width Modulation – אפנון רוחב פולס) הוא אות מחזורי, שמורכב מפרק זמן מסוים במצב HIGH ופרק זמן משלים במצב LOW, שחוזרים על עצמם שוב ושוב. לכל אות PWM יש תדר (מחושב לפי מספר המחזורים – HIGH+LOW – ש“נכנסים” בשנייה אחת), וכן Duty cycle – ערך באחוזים שמייצג את חלק ה-HIGH מתוך המחזור.

שימו לב שה-Duty cycle ה"רשמי" מוגדר באחוזים, אך בפקודה analogWrite אנחנו לא מציינים אחוזים אלא מספר מוחלט. אם נרצה לדעת מה ה-Duty cycle שהמספר שלנו ייתן, נחלק את המספר הזה ב-255 ונכפיל את התוצאה ב-100.

הנה דוגמאות למתחים החשמליים המתחלפים (גבוה ונמוך) במקורות PWM עם Duty Cycle שונה. כך ייראה קטע מאות PWM בעל Duty cycle של 25% (מתח גבוה רבע מהזמן):

אות PWM של 25%

וכך ייראה קטע מאות PWM בעל Duty cycle של 75% (מתח גבוה שלושה רבעים מהזמן:

אות PWM של 75%

בארדואינו, הפקודה analogWrite גורמת להפקה של אותות PWM באמצעות טיימרים בחומרת המיקרו-בקר. כל טיימר מסוגל ליצור מספר מוגבל מאד של אותות נפרדים, ובפינים ספציפיים בלבד. זו הסיבה למגבלת ששת הפינים שהוזכרה בסעיף הפרמטרים.

בנוסף, הגדרות ברירת המחדל של ספריות הליבה של ארדואינו קובעות את התדר של אותות ה-PWM. בלוחות ארדואינו Uno, הפינים 3,9,10 ו-11 (הקשורים לטיימרים 1 ו-2) יוציאו אותות PWM בתדר 490.20 הרץ, ואילו הפינים 5 ו-6 (הקשורים לטיימר 0) יוציאו אותות PWM בתדר 976.5625 הרץ.

דוגמאות

analogWrite(3, 64);

הערות

  • אחד השימושים הנפוצים לאות PWM בארדואינו הוא כיבוי והדלקה מהירים מאד של נוריות LED. אלה מתבצעים במהירות גדולה מכפי שהעין מסוגלת לתפוס, וכך ערכים שונים של הפרמטר val משנים את הבהירות הנתפסת של הנורית.
  • ניתן להשתמש באות PWM גם לשליטה במהירות סיבוב של מנועי DC, אם כי תדר ה-PWM של ברירת המחדל בארדואינו נמוך יחסית ואינו אופטימלי למנועים כאלה. כמובן שאין לחבר מנועים ישירות לפיני ארדואינו – רק דרך טרנזיסטורים או דרייברים מתאימים.
  • ערך 0 בפרמטר val פירושו שהפלט יהיה LOW רצוף (Duty Cycle = 0%), ואילו ערך 255 ייתן פלט HIGH רצוף (Duty Cycle = 100%).
  • הפונקציה מעבירה אוטומטית את הפין הרלוונטי למצב OUTPUT (פלט).
  • אם נשלח כפרמטר מספר/שם פין שאינו אחד מהפינים הייעודיים לאותות PWM, ערך הפלט של הפין יהיה קבוע ולפי הכלל הבא: אם val קטן מ-128, הערך יהיה LOW – אחרת הערך יהיה HIGH.
  • בתיעוד הרשמי (קישור למטה) מצוין שה-Duty Cycle בפינים 5 ו-6 עשוי להיות לא מדויק בערכים הנמוכים. אפקט כזה, אם קיים, אינו מופיע תמיד – ייתכן שמדובר בשאריות מתיעוד של גרסאות קודמות.

קישורים רלוונטיים

בלוג אישי בנושאי מייקינג, תכנות, מיקרו-בקרים ואלקטרוניקה