מודול SMT למדידת אותות במיקרו-בקר PIC: הסבר והדגמה

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

מערכת עם חיישן מרחק אולטרסוני
הפעלת חיישן מרחק בעזרת מודול SMT, (כמעט) ללא השקעה של המעבד

בין המודולים ב-Datasheet של ה-PIC18F57Q43, הבחנתי פתאום באחד שלא שמתי לב אליו קודם: SMT, ראשי תיבות של Signal Measurement Timer (אין קשר ל"טכנולוגיית ההשמה המשטחית", Surface Mount Technology). הדבר הראשון שהבנתי בקשר אליו, זה שאפשר להשתמש בו כטיימר פשוט – והוא יכול לספור עד 2-בחזקת-24, כלומר ניתן להפיק בעזרתו גל ריבועי בטווח תדרים וברזולוציה טובים לפחות כמו מודול ה-NCO!

הערת שוליים חשובה בנושא זה: שאלתי בפורום מקצועי מה היתרון של NCO לעומת טיימר רגיל, בהינתן ה-Jitter המשמעותי שלו (קיראו את הפוסט שבלינק אם אתם לא זוכרים). מישהו ענה שב-PIC אפשר לחבר את פלט ה-NCO ישירות לפין, ואילו בטיימרים חייבים לעשות את זה דרך קוד של פונקציית פסיקה, ואז יש Jitter מהתוכנה. זה נכון – חלקית. אמנם פסיקה עלולה בהחלט ליצור Jitter (אם למשל היא מתעכבת בגלל פסיקה אחרת שרצה באותו זמן), אבל אפשר לנתב את פלט הטיימר לפין דרך מודול חומרה אחר (כגון CLC), בלי התערבות של שום תוכנה בדרך. אותו הדבר נכון לגבי הטיימר SMT.

מצב טיימר

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

בהנחה שלא התעסקנו עם הרגיסטרים של SMT מוקדם יותר בקוד שלנו, רובם כבר מאוכלסים מראש בדיוק בערכים שהכי נוחים לנו. ארבעת הביטים CSEL ברגיסטר SMT1CLK, שבוחרים את מקור השעון עבור הטיימר, מכוונים כברירת מחדל ל-0000, שזה שעון הפעולות הרגיל (=שעון המערכת חלקי 4). אנחנו צריכים רק:

  1. לתת ערך לרגיסטר SMT1PR (שימו לב שיש בו 24 ביטים – זה ה-Period, המספר שאליו הטיימר יספור כל פעם)
  2. לכתוב 1 לביט EN ברגיסטר SMT1CON0 כדי להפעיל את מודול ה-SMT
  3. לכתוב 1 לביט SMT1GO ברגיסטר SMT1CON1 כדי שהוא ירוץ.

כמובן, יהיה נחמד אם נוכל גם לראות בעיניים איזושהי תוצאה של פעולת הטיימר… אז נוסיף את פונקציית הפסיקה המתאימה, שתדליק ותכבה לנו לד – כיוון שאני עובד עם לוח ההערכה Curiosity Nano, זה יהיה הלד המובנה שמחובר לפין RF3. הקוד כולו, חוץ מהגדרות הקונפיגורציה השגרתיות והמשעממות, נראה כך:

קוד להבהוב לד עם מודול SMT במצב טיימר
קוד להבהוב לד עם מודול SMT במצב טיימר (לחצו להגדלה)

ותצטרכו להאמין לי שכאשר שעון המערכת הוא 64MHz (שעון פעולות 16Hz), הקוד הזה גורם ללד המובנה להידלק ולכבות שוב ושוב, פעם בשנייה. פגז.

מדידת משך פולסים (Period and Duty Cycle)

למודול ה-SMT יש כאמור מספר צורות פעולה מורכבות יותר. כאן בחרתי באחת שנראית לי שימושית באופן כללי, ומספיק נוחה וברורה להדגמה.

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

חישוב קצר, לפני שניגש לקוד. אחרי שהחיישן מקבל אות הפעלה ("Trig", שחייב להימשך לפחות 10 מיליוניות השנייה), הוא מוציא בפלט (ה-"Echo") פולס HIGH שנמשך כ-59 מיליוניות השנייה לכל סנטימטר בין החיישן למטרה. אם מודדים את הפולס הזה לפי שעון של 16MHz, זה יוצא 944 "תקתוקי שעון" לכל סנטימטר, ולמרחק של 30 ס"מ זה 28,320. בפסיקה שה-SMT יעורר בסוף הפולס נוכל לבדוק את המספר שאליו הוא הגיע, ואם הוא יהיה קטן מ-28,320 נדע שהמטרה קרובה מ-30 ס"מ ונדליק את הלד שלנו להתראה. כמו מערכת לריחוק חברתי, בקטנה.

כדי להפעיל את ה-SMT בצורת הפעולה הזו, צריך לכתוב "0010" לביטים MODE שברגיסטר SMT1CON1, ובשביל מצב חוזר לכתוב 1 לביט REPEAT באותו רגיסטר. מקור הסיגנל הנמדד שלנו יהיה פין חיצוני, ואת זה אנחנו בוחרים קודם כל באמצעות הביטים SSEL של הרגיסטר SMT1SIG. הערך "000000", שהוא לשמחתנו גם ברירת המחדל, מחפש את הסיגנל במודול בחירת הפינים (PPS). ניגש לטבלאות של ה-PPS ב-Datasheet ונראה שכברירת מחדל, הקלט הזה מגיע מפין RC1. אפשר לשנות אבל אין צורך, נסתדר איתו.

בפונקציית הפסיקה, צריך לשים לב שהספירה מועתקת לרגיסטר SMT1CPW, ושהפסיקה עצמה היא לא זו שראינו קודם אלא אחרת, בעלת השם הקליט SMT1PRW. אגב, צורת הפעולה הזו של ה-SMT יכולה להפעיל פסיקה נוספת, שאיתה נוכל למדוד גם את משך ה-LOW ולהסיק את ה-Duty cycle, אבל זה לא מעניין אותנו במקרה של מדידת המרחק. מה שכן מעניין אותנו זה שגם אם ה-SMT ימדוד אוטומטית את ה-Echo, אנחנו עדיין צריכים לתפעל את Trig. צופפתי קצת את הקוד כדי שייכנס בתמונה אחת, אבל ביומיום אני משתדל לכתוב ברור ומרווח יותר, ומציע גם לכם לעשות זאת…

קוד מאולתר למדידת משך פולס עם SMT
קוד מאולתר למדידת משך פולס עם SMT (לחצו להגדלה)

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

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

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