החיישן שנרדם בשמירה

…ולפעמים חיסכון בחשמל הוא כאב ראש לא קטן, כפי שהוכיח בדרך הקשה חיישן Hall effect תמים-למראה שחשבתי לשלב בפרויקט של לקוח. ועוד בפוסט: איך לסחוט מהחיישן ביצועים טובים יותר ממה שהמפרט מכיר.

חיישנים מגנטיים ארוזים
חיישנים מגנטיים ארוזים

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

שימושים שונים מחייבים תכונות שונות של החיישנים, ואכן הם מתחלקים לכל מיני סוגים. לדוגמה, יש חיישנים שהם Unipolar – מגיבים רק לקוטב אחד של שדה מגנטי, בדרך כלל הדרומי, או Omnipolar שמגיבים לשני הקטבים; יש רמות רגישות ומתחי הפעלה שונים; הפלט יכול להיות דיגיטלי או לינארי; ועוד.

בשביל פרויקט הלקוח נכנסתי לאתר הרכיבים arrow.com (בכל זאת, משלוח מהיר חינם) ומבין החיישנים שבמלאי בחרתי בדגם AH9251 שנראה לי מתאים: פלט דיגיטלי בתגובה לכל קוטב שהוא, מארז נוח, ובעיקר טווח מתחי הפעלה גדול ופעולה חסכונית בחשמל, שהיו חשובים מכיוון שמדובר במערכת מופעלת בסוללה. בבדיקה ידנית בסיסית החיישן הגיב למגנט בדיוק כמו שציפיתי, ויחידת "הוכחת ההיתכנות" ששלחתי ללקוח עבדה היטב. אבל אז התחלתי לעבוד על מערכת משוכללת יותר, שהייתה צריכה למדוד במדויק גם זמנים, והדברים התחילו להשתבש: חלק קטן מההיתקלויות במגנט לא זוהו כלל, ואלה שכן זוהו הופיעו בזמנים סדירים במידה לא סבירה.

מה זה אומר "סדירים במידה לא סבירה"? אם אני מקרב ומרחיק מגנט ידנית הכי מהר שאני יכול, ולוח ארדואינו שמחובר לחיישן מדווח לי שהקצב – שמחושב מחדש עם כל זיהוי – הוא תמיד 6.231 הרץ בדיוק (זו דוגמה, אני לא זוכר את המספר שהופיע בפועל), זה לא סביר. אפילו אם הייתי מתופף מקצועי קשה לי להאמין שהייתי מצליח להגיע לעקביות שכזו. אז איפה הבעיה?

החשד הראשוני נפל מטבע הדברים על הקוד שלי. האם עיגלתי איזשהו מספר בצורה לא טובה במהלך החישוב? האם פגעתי איכשהו בהגדרות הפסיקה החיצונית שאמורה להגיב מיידית לשינויים בפלט החיישן? בדקתי, שיניתי, בדקתי שוב ולא מצאתי שום פגם בקוד. עם זאת, תוך כדי התבוננות ברישומים של ה-Logic Analyzer גיליתי עוד ממצא מוזר: אורך התגובה של החיישן למגנט (שקירבתי והרחקתי ידנית במהירות) היה כמעט תמיד 90.7 אלפיות השנייה. או שאני קיבורג משוכלל, או ש…

חזרתי ל-Datasheet, קראתי לעומק ואז הבנתי. החיסכון של החיישן בחשמל הושג על ידי מצבי שינה מטורפים למדי: בין כל שתי מדידות, שנמשכות 0.15 אלפיות השנייה כל אחת, יש 100 אלפיות שנייה של חוסר פעילות! כלומר, החיישן עצמו דוגם את השדה המגנטי רק עשר פעמים בשנייה! לא פלא, ברזולוציה נמוכה כזו, שאירועים קצרים התפספסו, ושאירועים ארוכים קצת יותר הופיעו כבעלי משך זהה.

האם הכול אבוד? תלוי ביישום, ואם בא לנו להיות יצירתיים. הסוד לתדר דגימה גבוה יותר טמון בנתון אחד קריטי: כמה זמן לוקח מרגע החיבור של החיישן לחשמל ועד שהוא נותן תשובה. בדקתי וגיליתי שעם החיבור לחשמל החיישן נכנס מיד למצב מדידה, ורק בסיומו עובר למצב השינה הראשון. אז אני יכול לתת לו חשמל למשך 0.15 אלפיות השנייה, לקרוא את התוצאה – ואז לנתק אותו ולחבר מיד שוב כדי להתחיל מדידה חדשה.

כמובן, צריך לוודא שאין איזו קיבוליות במעגל שתשאיר את החיישן חי, או במצב לא מוגדר, בין הניתוק לחיבור. אם התגברנו על המכשול הזה אפשר די בקלות להגיע למדידה בקצב של אלף פעמים בשנייה – פי מאה מהתדר ה"רגיל" של החיישן. מי שאוהב לחיות על הקצה יצליח אולי למתוח את החבל עד קרוב לעשרת אלפים הרץ. הבעיה היא שזה עדיין polling, שמחייב את המיקרו-בקר להשקיע משאבים שאפשר היה להימנע מהם באמצעות פסיקות.

בשביל הפרויקט שהתחיל את כל הסיפור, שזקוק למדידות מדויקות ומהירות מאוד, בחרתי לנטוש את החיישן הישנוני ולהזמין חיישנים נמרצים יותר. את מוסר ההשכל מהסיפור אני לא צריך להסביר לכם, נכון? 🙂

להרשמה
הודע לי על
0 תגובות
Inline Feedbacks
הראה את כל התגובות