סיפור קצר על Brown Out

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

מערכת צ'קלקה לילדים
מערכת צ'קלקה לילדים

המודול הסופי שיצרתי, שמופיע בתמונה למעלה, בסיסי למדי. אספקת החשמל היא סוללת AA יחידה (בצד האחורי, לא נראית בתמונה), שהמתח ממנה עובר דרך מודול Step-up (משמאל למטה על הלוח) שמרים אותו ל-5V. מיקרו-בקר PIC12F675 מתזמן, בעזרת טיימר פנימי, את הפעלת האורות באחד משני דפוסים, כפי שנקבע על ידי המתג שמתחת לג'וק. כל זוג נוריות LED מחובר בטור, והשליטה בזרם נעשית באמצעות טרנזיסטורי NPN מדגם 2N3904 הצנוע. למעשה, ה-PIC חזק מספיק כדי לתמוך בזרם הדרוש, אך בזמן התכנון הראשוני לא הייתי בטוח שהנוריות יחוברו בטור, או שיהיו רק שתיים בכל צד, אז הלכתי על בטוח.

העסק עבד כמעט במכה ראשונה, אבל עם באג משונה: אם כיביתי והדלקתי אותו שוב מהר (תוך שתיים-שלוש שניות), המערכת התחרפנה לחלוטין. בהמתנה ממושכת יותר, הכל עבד כשורה. זה לא היה משהו בקוד או בהלחמות – אז מה כן? בפרויקט הצ'קלקה שבקישור למעלה קרה משהו דומה, והוא נפתר כשהוספתי קבל קרמי קטן על כניסות המתח של המיקרו-בקר, אבל במקרה הנוכחי כבר היה קבל כזה. דקה ארוכה בהיתי במעגל, ממצמץ כמו לטאה, עד שנזכרתי פתאום בעניין של ה-Brown Out.

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

כידוע, מתח פחות-מהמקסימום מהווה מגבלה על מהירות השעון המרבית שאפשר להשיג, אבל כאן אנחנו מדברים מצב חמור יותר, של מתח שהוא מתחת למינימום. ובכן, ללא אמצעי זהירות מתאימים, המיקרו-בקר לא יידע שיש בעיה וינסה לפעול כרגיל. המתח לא יספיק לפעולות המיתוג האלקטרוניות שבפנים, והכל יילך לעזאזל – התוכן של זיכרון ה-RAM, ערכי הרגיסטרים, פסיקות, טיימרים וכו'. אין שום דרך לדעת איך המערכת תתנהג – וזה נכון גם אם המתח הבעייתי אינו קבוע, אלא רק נפילה רגעית קצרה אל מתחת לסף התחתון המותר, מה שנקרא Brown out.

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

נפילות מתח (ושימו לב, מדובר כאן על נפילות במובן של ירידה, לא על הפסקות) הן מאורע נפוץ בעולם ה-Embedded, עד כדי כך שכל מיקרו-בקר, ולו המצ'וקמק ביותר, כולל איזשהו מעגל הגנה שמסוגל לזהות Brown Out ולהעביר את המיקרו-בקר למצב Reset כדי למנוע נזקים נוספים, עד שהמתח יחזור לרמה מתקבלת על הדעת.

ב-PIC12F675, יש שני דברים פשוטים שצריך לעשות כדי להיעזר במעגל הזה: להגדיר כ-ON את ה-Configuration bits ששמותיהם BOREN (מפעיל את מעגל ההגנה) ו-PWRTE (מפעיל את ה-Power Up Timer). טיימר ייעודי זה מספק שכבת הגנה נוספת וחשובה – לפי המפרט הטכני, חייבים להפעיל אותו אם מפעילים את BOREN – בכך שאחרי הטיפול ב-Brown Out, הוא ממתין עוד כ-72 אלפיות השניה עד לשחרור המיקרו-בקר ממצב ה-Reset, כדי להבטיח עד כמה שניתן שהמתח באמת יציב ואפשר לחזור לעבוד. בסביבת הפיתוח MPLAB X זה יופיע בקוד התוכנית ככה:

#pragma config PWRTE = ON // Power-up Timer
#pragma config BOREN = ON // Brown Out Detect

ברגע שהגדרתי את הביטים האלה כ-ON, הבעיה נפתרה. ככל הנראה, מודול ה-Step Up הסיני הזול לוקח את הזמן, ובכיבוי והפעלה מהירים מתח המוצא לא חוזר לאפס או לא מתייצב מספיק מהר.

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

לחובבי הטריוויה, המונח Brown Out מקורו בנפילות מתח ברשת החשמל הביתית, שגרמו לתאורה של נורות הליבון להידרדר עד כדי כך שבמקום אור לבן או צהוב התקבל אור חום קלוש.

להרשמה
הודע לי על
3 Comments
מהכי חדשה
מהכי ישנה לפי הצבעות
Inline Feedbacks
הראה את כל התגובות

למה לא עשית את זה עם מעגל LED FLASHER או זוג טרנזעסטורים או לדים מהבהבים?

יפה מאוד!