בשיטה הישנה כל בלוק בדרך כלל עושה דבר אחד ברור. המטען טוען את התא, מייצב אחד מזין את המיקרו־בקר, מייצב אחר מזין חיישן או מודם, ומתג עומס מנתק צרכן שלא צריך לעבוד. היתרון הוא שקל לפתוח כל דף נתונים ולראות מי אחראי למה. החיסרון הוא שכל בלוק מקבל החלטות כמעט לבדו: המטען אינו בהכרח יודע מה צורך המוצר, המיקרו־בקר אינו בהכרח יודע מדוע המתח נפל, וכדי לקבל סדר הדלקה, מצב משלוח, מדידת זרם ושומר מערכת מוסיפים עוד רכיבים ועוד קווים.
PMIC מרכז את התפקידים האלה ומוסיף להם מוח ניהולי קטן. הוא עדיין אינו מחליף את המיקרו־בקר של המוצר, אבל הוא מאפשר לו לקרוא מתח, זרם וטמפרטורה, לשנות מסילות, להדליק עומסים, להגיב ל־USB ולכבות את המערכת למצב עמוק. הדימוי השימושי הוא לא ספק כוח גדול יותר אלא לוח חלוקה חכם: המפסקים, המונים וההגנות נמצאים באותו ארון, והמיקרו־בקר נותן להם הוראות דרך קו תקשורת אחד.
ב־nPM1300 הארון הזה כולל מטען ליניארי לתא יחיד מסוג Li‑ion, Li‑poly או LiFePO4, עם זרם שניתן להגדיר בין 32 ל־800 מיליאמפר ומתח סיום בין 3.5 ל־4.45 וולט. יש בו שני ממירי Buck שמורידים מתח, כל אחד עד 200 מיליאמפר ובטווח 1.0 עד 3.3 וולט. בנוסף יש שני ערוצים שיכולים להיות מתגי עומס של 100 מיליאמפר או LDO של 50 מיליאמפר, נתיב VSYS לא מיוצב, מדידת מתח וזרם, חמישה GPIO, שלושה דרייברים ל־LED, שומר מערכת, אזהרת נפילת מתח ומצבי Ship ו־Hibernate.
זה נשמע כמו הרבה חומרה שנעלמה, אבל לא הכול נכנס לשבב. כל Buck עדיין צריך סליל 2.2 מיקרו־הנרי וקבל יציאה מתאים, הכניסות ו־VSYS צריכים קבלי ניתוק, וקווי I²C עשויים לדרוש נגדי Pull‑up. התא עצמו צריך להגיע כחבילת סוללה עם הגנות מתח־יתר, מתח־חסר וזרם־יתר; Nordic אינה מציגה את ה־PMIC כתחליף למעגל ההגנה של התא. אם משתמשים בבקרת טמפרטורת הסוללה צריך גם NTC צמוד תרמית לתא, ואין להזין את המוצר ישירות מ־VBAT משום שלפי Nordic הדבר עלול לשבש את מחזור הטעינה. משתמשים ב־VOUT1, VOUT2 או VSYS.
כאשר לוח ה־nPM1300 EK מגיע, מתחילים דווקא בשני כבלי USB ולא בקוד. מחברים מקור USB‑C למחבר USB PMIC כדי להזין את ה־nPM1300, ומחברים כבל USB נוסף מן המחשב למחבר nPM CONTROLLER. אם לסוללה יש NTC משתמשים במחבר התלת־פיני; אם אין, משתמשים במחבר הדו־פיני ומגדירים את חיבור ה־NTC על הלוח לפי ההוראות. חשוב לבדוק קוטביות: Nordic מזהירה שהמחברים בלוח משתמשים בסידור JST מסוים וחיבור הפוך עלול לחמם את הלוח מאוד.
במחשב מתקינים nRF Connect for Desktop ומתוכו את nPM PowerUP. האפליקציה מזהה את בקר העזר שעל ה־EK, והוא זה שמדבר עם ה־PMIC. זה מאפשר לשנות הגדרות בלי לכתוב שורת קוד, אך חשוב לזכור שהבקר הזה אינו חלק מן ה־nPM1300 ולא יהיה במוצר הסופי. בשלב הזה המטרה היא לא לסמן את כל האפשרויות במסך, אלא לבנות טבלת דרישות: סוג התא, מתח סיום, זרם טעינה מותר, גבולות טמפרטורה, מתח וזרם לכל מסילה, מה חייב לעלות מיד ומה מותר להדליק רק אחרי שהקושחה רצה.
ההגדרה הראשונה היא המטען, מפני שטעות בה אינה רק באג תוכנה. לוקחים את מתח הסיום, זרם הטעינה וטווח הטמפרטורה מדף הנתונים של התא המסוים, ולא מן הערך המרבי של ה־PMIC. ה־nPM1300 מתחיל כברירת מחדל ב־32 מיליאמפר, וצריך להשבית טעינה לפני שינוי זרם הטעינה ברגיסטרים. אם יש NTC בוחרים באפליקציה את משפחת ההתנגדות המתאימה ומגדירים את אזורי הקור, הטמפרטורה הרגילה והחום; אם אין NTC, לא מספיק לקשור את הפין לאדמה — צריך גם לבטל את הפונקציה בתצורה.
אחר כך מגדירים את שתי מסילות ה־Buck. לדוגמה, אפשר לתת 1.8 וולט למיקרו־בקר ו־3.0 וולט לחיישנים, ואז לבדוק אם כל צרכן באמת עובד בתחום הזה. במצב Auto הממיר עובר אוטומטית בין מצב חסכוני בעומס קל לבין PWM בתדר קבוע בעומס גבוה; מצב PWM נותן אדווה נמוכה וצפויה יותר ליד רדיו, אך צורך יותר זרם כשהמערכת כמעט ישנה. לכן לא מסתפקים בכך שהמתח נראה נכון במולטימטר. מודדים זרם בשינה, פולס שידור, שינוי עומס, חיבור וניתוק USB ומעבר בין סוללה למטען.
את ערוצי LOADSW/LDO בוחרים לפי התפקיד. כמתג עומס הם מתאימים לניתוק חיישן, Flash או תצוגה עד 100 מיליאמפר, עם Soft Start שמקטין את זרם ההתנעה. כ־LDO הם נותנים מסילה נקייה יותר אך מוגבלים ל־50 מיליאמפר מעל 1.2 וולט, והאנרגיה העודפת הופכת לחום. בשני המצבים הערוצים כבויים כברירת מחדל, ולכן הם מתאימים לעומסים שהמוצר יכול לחיות בלעדיהם בזמן האתחול. אם ה־MCU עצמו תלוי ב־LDO שעדיין לא הוגדר, נוצר מעגל שבו התוכנה מחכה לספק שמחכה לתוכנה.
אם רוצים אחוז סוללה מדויק, יש שלב נוסף. ה־nPM1300 מודד מתח, זרם וטמפרטורה, אבל אלגוריתם ה־Fuel Gauge רץ על המיקרו־בקר המארח ולא בתוך ה־PMIC. אפשר להתחיל עם מודל סוללה מוכן כדי לבדוק את הזרימה, אך למוצר רציני רצוי לפרופיל את דגם התא האמיתי בטמפרטורות ובעומסים הרלוונטיים. לשם כך Nordic מציעה לוח Fuel Gauge נוסף שמתחבר ל־EK ומייצר מודל שאחר כך נכנס לקושחה. כלומר גם כאן האינטגרציה חוסכת שבב מדידה נפרד, אבל מוסיפה ספריית תוכנה ותהליך אפיון.
כאשר ההגדרות עובדות ב־PowerUP, מייצאים אותן. בפרויקט Zephyr או nRF Connect SDK אפשר לייצא קובץ Devicetree overlay שמתאר את ה־PMIC ואת תצורת האתחול שלו; אפשר גם לשמור JSON כדי לחזור לפרויקט באפליקציה. בפרויקט Bare‑metal Nordic מציעה את דרייברי npmx, ואפשר כמובן לכתוב ישירות לרגיסטרים לפי המפרט. הקובץ המיוצא הוא נקודת פתיחה טובה וביקורת תצורה נוחה ל־Git, אבל הוא אינו קושחה שנצרבה לתוך nPM1300.
כאן מגיע ההבדל הגדול בין ה־EVAL למוצר המולחם: ל־nPM1300 אין זיכרון תצורה לא־נדיף. אחרי ניתוק מתח הוא אינו זוכר את הפרויקט שבניתם ב־PowerUP. שני פיני VSET ונגדים לאדמה קובעים בזמן Power‑on אילו ממירי Buck יעלו ובאיזה מתח בסיסי. לדוגמה, 47 קילו־אוהם על VSET1 מעלה את BUCK1 ל־1.8 וולט, ו־150 קילו־אוהם על VSET2 מעלה את BUCK2 ל־3.0 וולט. אסור להשאיר את הפינים צפים.
רצף האתחול הנכון נראה כך: הסוללה או ה־USB מזינים את ה־PMIC; נגד VSET מעלה לפחות מסילה אחת שמספיקה ל־MCU; המיקרו־בקר יוצא מ־Reset; הדרייבר כותב דרך I²C את מתחי העבודה, המטען, ה־NTC, ה־GPIO, ה־LDO ומנגנוני ההשגחה; ורק אז מפעילים את העומסים שאינם נחוצים ל־Boot. VDDIO של ה־nPM1300 חייב להתאים לרמת הלוגיקה של המארח, ו־Nordic מציינת שמתחת ל־1.7 וולט תקשורת TWI עלולה ללכת לאיבוד. לכן הגדרת PMIC היא חלק מרצף ה־Boot של המוצר, לא פעולת שירות שעושים פעם במפעל.
בייצור כן יש פעולות חד־פעמיות, אבל הן שייכות למוצר ולא לזיכרון פנימי של ה־PMIC. צורבים את קושחת ה־MCU שמכילה את התצורה, מריצים בדיקת סוף קו שקוראת בחזרה רגיסטרים ומודדת את המסילות, בודקים טעינה עם עומס מדומה, ולבסוף מכניסים את המוצר ל־Ship mode דרך I²C כדי שלא ירוקן את הסוללה בקופסה. צריך גם להשאיר דרך אמינה לצאת מ־Ship mode, למשל כפתור או אות שמושך את SHPHLD נמוך למשך הזמן הנדרש.
מבחינת BOM, Nordic מפרסמת שלוש תצורות ייחוס. בתצורה מלאה עם שני Buck ושני LDO מופיעים שני סלילים, כמה קבלי 10 מיקרו־פרד, קבלי 1 ו־2.2 מיקרו־פרד, קבל 100 ננו־פרד, נגדי VSET ונגדי Pull‑up אופציונליים. בתצורה מינימלית של מטען ותקשורת אפשר לרדת לכמה קבלים בלבד. זה חיסכון אמיתי לעומת ארבעה או חמישה שבבים נפרדים, אך הוא אינו רישיון להעתיק רק את הסכימה ולפזר את הרכיבים על הלוח: לולאות הזרם של הממירים, מישור האדמה ומיקום הקבלים נשארים קריטיים.
Nordic ממליצה על לפחות שתי שכבות עם מישור אדמה, קווים קצרים וקבלי ניתוק צמודים לפינים, ומספקת קובצי ייחוס ל־QFN ול־WLCSP. למוצר ראשון הייתי מתחיל במארז QFN של 5 על 5 מילימטר, אלא אם הגודל מחייב WLCSP, משום שקל יותר לייצר ולחקור אותו. גם ב־QFN יש משטח תחתון שאיכות ההלחמה שלו חשובה. בדיווח ציבורי ב־DevZone, מדידות מתח ו־Fuel Gauge שגויות נפתרו לאחר שהתברר שמשטח האדמה התחתון לא הולחם היטב — תזכורת לכך שב־PMIC אדמה תרמית וחשמלית אינה פרט מכני.
היתרון הגדול מול השיטה הישנה אינו רק מספר הרכיבים. ניהול נתיב ההספק נותן עדיפות לעומס של המוצר ומקטין את זרם הטעינה כאשר מקור ה־USB מוגבל, כך שהמערכת יכולה לפעול גם עם סוללה מרוקנת. אותה יחידה גם יודעת למדוד את מה שקורה, להודיע על נפילת מתח ולהפריד בין מצב טעינה, עבודה מסוללה ומצב משלוח. במקום לתפור לוגיקה בין מטען, מייצבים ו־Supervisor נפרדים, מקבלים תמונת מצב אחת וממשק תוכנה אחד.
היתרון השני הוא שליטה מערכתית. אפשר להוריד מתח למיקרו־בקר בזמן מנוחה, לנתק חיישן שצורך זרם זליגה, להעביר Buck ל־PWM בזמן פעילות רדיו, להפעיל Watchdog שמבצע Power Cycle אם האתחול נכשל, ולהתעורר מ־Hibernate בעזרת טיימר. אלה דברים שאפשר לבנות גם מרכיבים נפרדים, אבל אז משלמים בעוד פינים, עוד רכיבים ולעיתים יותר זרם שקט. החלק המעניין פה הוא שה־PMIC הופך את צריכת החשמל מתוצאה של הסכימה למשהו שהקושחה יכולה לנהל לפי מצב המוצר.
מנגד, nPM1300 אינו פתרון לכל עץ הספק. הוא מיועד לתא נטען יחיד, שני ה־Buck מוגבלים ל־200 מיליאמפר כל אחד, וה־LDO והמתגים מיועדים לעומסים קטנים. אין בו Boost או Buck‑Boost, ולכן מסילת 3.3 וולט לא תישאר 3.3 וולט כאשר מתח הסוללה יורד קרוב מדי אליה. מודם סלולרי, מנוע, מסך גדול או מגבר עם זרמי שיא גבוהים עדיין יצטרכו מסילה חיצונית, ולעיתים עצם החיבור שלהם ל־VSYS דורש תכנון התנעה וזהירות מזרם כניסה.
גם המטען הוא ליניארי. זה פשוט ונקי יחסית, אבל ההספק שהוא צריך לפזר בקירוב הוא הפרש המתח כפול זרם הטעינה. ב־5 וולט מן ה־USB, תא שנמצא ב־3.0 וולט וטעינה של 800 מיליאמפר יוצרים סדר גודל של 1.6 ואט לפני שמתחשבים בעומס המוצר ובוויסות התרמי. ה־nPM1300 יודע לעצור או להקטין טעינה כאשר השבב מתחמם, אבל במארז קטן המשמעות יכולה להיות שזרם הכותרת של 800 מיליאמפר אינו זרם רציף מעשי. צריך למדוד את המוצר הסגור בטמפרטורת הסביבה הגרועה ביותר.
המחיר השלישי הוא תלות בתוכנה. ברכיב DC‑DC פשוט, נגד משוב קובע מתח גם אם הקושחה קורסת. כאן הרבה מן ההתנהגות — טעינה, NTC, מצבי LDO, הפרעות ומנגנוני התאוששות — תלויה ברגיסטרים ובדרייבר. Nordic תומכת ב־nRF Connect SDK וב־Zephyr ומציעה npmx ל־Bare‑metal, אך צריך לנעול גרסה ולבדוק אילו יכולות באמת קיימות ב־API. דיווח DevZone ישן מצא שדרייבר Zephyr לא טיפל נכון בתצורה ללא NTC, ודיווחים אחרים נגעו לאזהרות Devicetree וליכולות רגיסטר שלא נחשפו עדיין דרך ממשק הדרייבר.
יש גם Errata רשמי שצריך לקרוא לפי קוד הבנייה של הרכיב. ב־Revision 1, Nordic מתעדת בין השאר מצב שבו כתיבת אותו מתח שכבר נבחר ב־VSET יכולה להוסיף מיליאמפר שלם לזרם השקט, מעבר לא צפוי בין מצבי Buck, ומתח Buck שנמוך בממוצע בכ־50 מיליוולט במצב Hysteretic. יש גם אנומליה שבה סוגים מסוימים של מעגל הגנת סוללה אינם משתחררים אחרי פריקת יתר, ומצבים שבהם הפעלת LDO איטית או עלולה לגרום Reset ליד סף המתח. לחלק מן הסעיפים יש רצף כתיבה או הגדרה שעוקפים את הבעיה, ולחלקם אין מעקף; זו סיבה טובה להפוך את ה־Errata למסמך דרישות לקושחה ולבדיקות, לא לקריאה בסוף הפרויקט.
בדיווחים מן השטח לא מצאתי הוכחה לתקלה גורפת אחת שהופכת את nPM1300 לרכיב בעייתי, אבל כן חוזר דפוס אינטגרציה. לוחות שלא עלו באופן עקבי התגלו עם VSET צף או עם רצף אתחול שלא הוגדר היטב; מדידות שגויות הגיעו מהלחמת אדמה; ותקלות טעינה נקשרו ל־NTC, טיימר הבטיחות או Layout חלש של זרמי ההספק. צריך להתייחס לדיווחים האלה כאל סיפורי מקרה, לא כאל סטטיסטיקה. המסקנה המעשית היא לבדוק Cold Start בלי Debugger, חיבור מהיר מחדש כשהקבלים עדיין טעונים, סוללה חלשה, USB בלבד, סוללה בלבד, NTC פתוח וקצר, ותקשורת I²C תקועה.
אם הייתי מכניס את nPM1300 למוצר ראשון, הייתי מסדר את העבודה בארבע הוכחות. הראשונה היא הוכחת הספק: כל מסילה נמדדת בעומס קל, שיא ובמעבר. השנייה היא הוכחת טעינה: התא האמיתי עובר קור, חום, סוללה ריקה והגבלת USB. השלישית היא הוכחת Boot: המוצר עולה ללא מחשב מכל מקור מתח ומגדיר בחזרה את כל הרגיסטרים. הרביעית היא הוכחת ייצור: הלחמת ה־QFN, כניסה ויציאה מ־Ship mode ובדיקת סוף קו עובדות על אצווה ולא רק על לוח אחד.
למי שמגיע מרגולטורים וממירי DC‑DC גנריים, ה־nPM1300 הוא מעבר הגיוני כאשר המוצר קטן, נטען, צורך זרמים מתונים וצריך שליטה טובה בשינה, בטעינה ובהתאוששות. הוא חוסך רכיבים ומאפשר התנהגות מערכתית שקשה לקבל מאוסף בלוקים שאינם מדברים זה עם זה. אבל הוא גם מרכז סיכון: מגבלת זרם אחת, Layout אחד, רצף Boot אחד ודרייבר אחד יכולים להשבית כמה פונקציות יחד. לכן לא בוחרים PMIC רק מפני שה־BOM התקצר; בוחרים בו כאשר מוכנים לנהל את החשמל כחלק מן הארכיטקטורה של הקושחה ולבדוק אותו כמו מערכת, לא כמו רגולטור נוסף.
הזווית ההנדסית
למה זה מעניין
nPM1300 מראה למה PMIC הוא לא רק דרך לחסוך שני רגולטורים ומטען. הוא מעביר את ניהול הטעינה, המסילות, מצבי השינה וההתאוששות אל ממשק אחד שהקושחה יכולה לשלוט בו, ובכך מאפשר מוצר קטן וחכם יותר. באותה נשימה הוא יוצר תלות חדשה ברצף Boot, ב־I²C, בדרייבר, ב־Errata ובאיכות ה־Layout — ולכן הערך האמיתי שלו מופיע רק כאשר מתכננים ובודקים אותו כמערכת שלמה.
השיחה ממשיכה
תגובות
שאלות, תיקונים ורעיונות שאפשר לבנות מהם משהו.