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

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

הפונקציה pulseInLong(pin, state[, timeout]) מודדת אורך של “פולס” (Pulse) יחיד של מתח חשמלי. כלומר, היא מחזירה את משך הזמן, במיליוניות שנייה, שעבר בין שינוי מתח ספציפי (מ-LOW ל-HIGH או מ-HIGH ל-LOW) בפין מסוים, לבין שינוי המתח בכיוון ההפוך.

בניגוד לפונקציה pulseIn, כאן מדידת משך הפולס נעשית על סמך הפונקציה micros, שמסתמכת בעצמה על פסיקות טיימר. לכן, לא ניתן להשתמש בפונקציה pulseInLong כאשר הפסיקות מושבתות (למשל בעקבות שימוש בפונקציה noInterrupts), או כאשר ספריות או קוד כלשהם מתערבים בפעולה הרגילה של טיימר 0 של המיקרו-בקר.

הפונקציה התווספה מאוחר יחסית לספריות הליבה של ארדואינו – ככל הנראה במאי 2015.

פרמטרים

pin הוא מספר/שם הפין שמחובר למקור הפולס, כפי שהוא רשום על לוח הארדואינו. פרמטר זה הוא מטיפוס uint8_t. שמות פינים כגון A0 הינם למעשה קבועים שמוגדרים מראש בספריות הליבה של ארדואינו, כך שניתן להשתמש גם בהם.

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

timeout, מטיפוס unsigned long, הוא פרמטר אופציונלי שמציין את משך הזמן, במיליוניות שנייה, שמוקצה לריצת הפונקציה. אם במהלך פרק זמן זה לא מופיע פולס שלם ניתן למדידה, הפונקציה תחזיר את הערך 0. אם פרמטר זה לא יצוין במפורש בקריאה לפונקציה, ערך ברירת המחדל שלו יהיה 1000000, כלומר שנייה אחת.

ערך חוזר

משך הפולס שנמדד, ביחידות של מיליוניות השנייה. אם לא הושלם פולס במשך זמן ה-timeout, יוחזר המספר 0. ערך זה מוחזר כמשתנה מטיפוס unsigned long.

דוגמאות

uint32_t us_limited_10ms, us_unlimited;
us_limited_10ms = pulseInLong(9, HIGH, 10000);
us_unlimited = pulseInLong(3, LOW);

הערות

  • הפונקציה ממתינה ראשית כל למעבר, בפין pin, למתח שהוגדר בפרמטר state. רק אז מתחילה מדידת הזמן של משך הפולס. אם המעבר מתרחש בסמיכות גדולה מדי לזמן הקריאה לפונקציה (עד כמה עשרות מיליוניות השנייה), היא עלולה לא לזהות אותו ולהמתין למעבר הדומה הבא.
  • מגבלת הזמן שצוינה בפרמטר timeout כוללת הן את משך הפולס עצמו והן את משך ההמתנה לתחילתו.
  • בגלל אופן חישוב הזמנים בתוך הפונקציה, משך הפולס המרבי שניתן למדוד הוא קצת פחות מארבע דקות וחצי.
  • הפונקציה אינה בודקת את תקינות הפרמטר pin, כך שאין לדעת איזה ערך יוחזר עבור מספר/שם פין לא חוקיים.
  • בספטמבר 2015 גיליתי שהמימוש של הפונקציה pulseInLong בארדואינו היה שגוי, ומשך ה-timeout בפועל היה גדול בערך פי 20 מהמשך שצוין בפרמטר. מפתחי התוכנה דיווחו שהבאג תוקן.

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

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