class Timer – שליטה בטיימרים פנימיים#

ניתן להשתמש בטיימרים למגוון רחב של משימות. כרגע ממומש רק המקרה הפשוט ביותר: קריאה לפונקציה באופן מחזורי.

כל טיימר מורכב ממונה הסופר כלפי מעלה בקצב מסוים. הקצב שבו הוא סופר הוא תדר שעון ההתקן ההיקפי (ב-Hz) חלקי ה-prescaler של הטיימר. כאשר המונה מגיע למחזור הטיימר הוא מפעיל אירוע, והמונה מתאפס בחזרה לאפס. באמצעות המתודה callback, אירוע הטיימר יכול לקרוא לפונקציית Python.

דוגמת שימוש להחלפת מצב של LED בתדר קבוע:

tim = pyb.Timer(4)              # create a timer object using timer 4
tim.init(freq=2)                # trigger at 2Hz
tim.callback(lambda t:pyb.LED(1).toggle())

דוגמה לשימוש בפונקציה בעלת שם עבור ה-callback:

def tick(timer):                # we will receive the timer object when being called
    print(timer.counter())      # show current timer's counter value
tim = pyb.Timer(4, freq=1)      # create a timer object using timer 4 - trigger at 1Hz
tim.callback(tick)              # set the callback to our tick function

דוגמאות נוספות:

tim = pyb.Timer(4, freq=100)    # freq in Hz
tim = pyb.Timer(4, prescaler=0, period=99)
tim.counter()                   # get counter (can also set)
tim.prescaler(2)                # set prescaler (can also get)
tim.period(199)                 # set period (can also get)
tim.callback(lambda t: ...)     # set callback for update interrupt (t=tim instance)
tim.callback(None)              # clear callback

הערה: Timer(1) משמש עבור המצלמה. באופן דומה, Timer(5) שולט במנוע השרבו, ו-Timer(6) משמש לקריאה/כתיבה מתוזמנת של ADC/DAC. מומלץ להשתמש בטיימרים האחרים בתוכניות שלכם.

הערה: לא ניתן להקצות זיכרון במהלך callback (פסיקה), ולכן חריגות שמועלות בתוך callback אינן מספקות מידע רב. ראו micropython.alloc_emergency_exception_buf() כיצד לעקוף מגבלה זו.

Constructors#

class pyb.Timer(id: int, *args, **kwargs)#

בונה אובייקט טיימר חדש עם המזהה הנתון. אם מסופקים ארגומנטים נוספים, הטיימר מאותחל באמצעות init(...). קבוצת ערכי ה-id התקפים תלויה ב-MCU מסוג STM32 שב-OpenMV Cam הנמצא בשימוש; עיינו במדריך העזר של STM32 עבור הטיימרים הזמינים לשימוש כללי ולבקרה מתקדמת.

Methods#

init(*, freq: int | float | None = None, prescaler: int | None = None, period: int | None = None, mode: int = Timer.UP, div: int = 1, callback: Callable[[Timer], None] | None = None, deadtime: int = 0, brk: int = Timer.BRK_OFF, hard: bool = True) None#

מאתחל את הטיימר. האתחול חייב להתבצע או באמצעות תדר (ב-Hz) או באמצעות prescaler ומחזור:

tim.init(freq=100)                  # set the timer to trigger at 100Hz
tim.init(prescaler=83, period=999)  # set the prescaler and period directly

ארגומנטים של מילות מפתח:

  • freq — מציין את התדר המחזורי של הטיימר. ניתן גם להתייחס לכך כאל התדר שבו הטיימר עובר מחזור שלם אחד.

  • prescaler [0-0xffff] - מציין את הערך שייטען לאוגר ה-Prescaler של הטיימר (PSC). מקור שעון הטיימר מחולק ב-(prescaler + 1) כדי לגזור את שעון הטיימר. מקור השעון מגיע מאפיק ה-APB של הטיימר ותלוי ב-MCU. ב-STM32, טיימרים על APB1 משתעים בדרך כלל ב-2 * pclk1 וטיימרים על APB2 ב-2 * pclk2; קראו את תדרי האפיק הנוכחיים באמצעות pyb.freq() ועיינו במדריך העזר של STM32 עבור ה-MCU של ה-OpenMV Cam שלכם.

  • period [0-0xffff] עבור טיימרים 1, 3, 4 ו-6-15. [0-0x3fffffff] עבור טיימרים 2 ו-5. מציין את הערך שייטען לאוגר ה-AutoReload של הטיימר (ARR). זה קובע את מחזור הטיימר (כלומר מתי המונה משלים מחזור). מונה הטיימר יתגלגל לאחר period + 1 מחזורי שעון טיימר.

  • mode יכול להיות אחד מהבאים:

    • Timer.UP - מגדיר את הטיימר לספור מ-0 עד ARR (ברירת מחדל)

    • Timer.DOWN - מגדיר את הטיימר לספור מ-ARR כלפי מטה עד 0.

    • Timer.CENTER - מגדיר את הטיימר לספור מ-0 עד ARR ואז בחזרה כלפי מטה עד 0.

  • div יכול להיות 1, 2 או 4. מחלק את שעון הטיימר כדי לקבוע את שעון הדגימה המשמש את המסננים הדיגיטליים.

  • callback - כמו ב-Timer.callback()

  • deadtime - מציין את משך הזמן ה“מת“ או הלא-פעיל בין מעברים בערוצים משלימים (שני הערוצים יהיו לא-פעילים במשך זמן זה). deadtime יכול להיות מספר שלם בין 0 ל-1008, עם ההגבלות הבאות: 0-128 בצעדים של 1. 128-256 בצעדים של 2, 256-512 בצעדים של 8, ו-512-1008 בצעדים של 16. deadtime מודד טיקים של source_freq חלקי div טיקי שעון. deadtime זמין רק בטיימרים 1 ו-8.

  • brk - מציין אם מצב ה-break משמש להשבתת הפלט של ה-PWM כאשר קלט ה-BRK_IN מופעל. ערך ארגומנט זה קובע אם break מופעל ומהי הקוטביות, ויכול להיות אחד מ-Timer.BRK_OFF, Timer.BRK_LOW או Timer.BRK_HIGH. כדי לבחור את הפין BRK_IN בנו אובייקט Pin עם mode=Pin.ALT, alt=Pin.AFn_TIMx. תכונות הקלט של ה-GPIO של הפין זמינות במצב alt - pull= , value() ו-irq().

  • hard יכול להיות אחד מהבאים:

    • True - ה-callback יבוצע בהקשר של פסיקה קשיחה, מה שממזער את ההשהיה והרעד אך כפוף למגבלות המתוארות ב-כתיבת מטפלי פסיקה כולל חוסר היכולת להקצות בערימה.

    • False - ה-callback יתוזמן כפסיקה רכה, מה שמאפשר לו להקצות אך גם עשוי להכניס השהיות ורעד של איסוף אשפה.

    ערך ברירת המחדל של אפשרות זו הוא True.

עליכם לציין או freq או גם period וגם prescaler.

deinit() None#

מבטל את אתחול הטיימר.

משבית את ה-callback (ואת ה-irq המשויך).

משבית את כל ה-callbacks של הערוצים (ואת ה-irq המשויך). עוצר את הטיימר ומשבית את ההתקן ההיקפי של הטיימר.

callback(fun: Callable[[Timer], None] | None) None#

מגדיר את הפונקציה שתיקרא כאשר הטיימר מופעל. ל-fun מועבר ארגומנט אחד, אובייקט הטיימר. אם fun הוא None אז ה-callback יושבת.

channel(channel: int, mode: int | None = None, *args, **kwargs) TimerChannel | None#

אם מועבר רק מספר ערוץ, אז מוחזר אובייקט ערוץ שאותחל קודם לכן (או None אם אין ערוץ קודם).

אחרת, אובייקט TimerChannel מאותחל ומוחזר.

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

ארגומנטים של מילות מפתח:

  • mode יכול להיות אחד מהבאים:

    • Timer.PWM — מגדיר את הטיימר במצב PWM (פעיל גבוה).

    • Timer.PWM_INVERTED — מגדיר את הטיימר במצב PWM (פעיל נמוך).

    • Timer.OC_TIMING — מציין שאף פין אינו מונע.

    • Timer.OC_ACTIVE — הפין יהפוך לפעיל כאשר מתרחשת התאמת השוואה (פעיל נקבע לפי הקוטביות)

    • Timer.OC_INACTIVE — הפין יהפוך ללא-פעיל כאשר מתרחשת התאמת השוואה.

    • Timer.OC_TOGGLE — מצב הפין יוחלף כאשר מתרחשת התאמת השוואה.

    • Timer.OC_FORCED_ACTIVE — הפין נכפה לפעיל (התאמת ההשוואה מתעלמת).

    • Timer.OC_FORCED_INACTIVE — הפין נכפה ללא-פעיל (התאמת ההשוואה מתעלמת).

    • Timer.IC — מגדיר את הטיימר במצב לכידת קלט (Input Capture).

    • Timer.ENC_A — מגדיר את הטיימר במצב Encoder. המונה משתנה רק כאשר CH1 משתנה.

    • Timer.ENC_B — מגדיר את הטיימר במצב Encoder. המונה משתנה רק כאשר CH2 משתנה.

    • Timer.ENC_AB — מגדיר את הטיימר במצב Encoder. המונה משתנה כאשר CH1 או CH2 משתנים.

  • callback - כמו ב-TimerChannel.callback()

  • pin None (ברירת המחדל) או אובייקט Pin. אם צוין (ואינו None) זה יגרום לתצורת הפונקציה החלופית של הפין המצוין עבור ערוץ טיימר זה. תועלה שגיאה אם הפין אינו תומך בפונקציות חלופיות כלשהן עבור ערוץ טיימר זה.

ארגומנטים של מילות מפתח עבור מצבי Timer.PWM:

  • pulse_width - קובע את ערך רוחב הפולס ההתחלתי לשימוש.

  • pulse_width_percent - קובע את אחוז רוחב הפולס ההתחלתי לשימוש.

ארגומנטים של מילות מפתח עבור מצבי Timer.OC:

  • compare - קובע את הערך ההתחלתי של אוגר ההשוואה.

  • polarity יכול להיות אחד מהבאים:

    • Timer.HIGH - הפלט פעיל גבוה

    • Timer.LOW - הפלט פעיל נמוך

ארגומנטים אופציונליים של מילות מפתח עבור מצבי Timer.IC:

  • polarity יכול להיות אחד מהבאים:

    • Timer.RISING - לוכד בקצה עולה.

    • Timer.FALLING - לוכד בקצה יורד.

    • Timer.BOTH - לוכד בשני הקצוות.

שימו לב שלכידה עובדת רק בערוץ הראשי, ולא בערוצים המשלימים.

הערות עבור מצבי Timer.ENC:

  • דורש 2 פינים, ולכן אחד מהפינים או שניהם יצטרכו להיות מוגדרים לשימוש ב-AF המתאים של הטיימר באמצעות Pin API.

  • קראו את ערך ה-encoder באמצעות המתודה timer.counter().

  • עובד רק על CH1 ו-CH2 (ולא על CH1N או CH2N)

  • מספר הערוץ מתעלם בעת הגדרת מצב ה-encoder.

דוגמת PWM – בכל OpenMV Cam מסוג STM32 הערוצים 1 ו-2 של TIM4 מנותבים לפיני הכותרת P7 ו-P8 בהתאמה:

timer = pyb.Timer(4, freq=1000)
ch1 = timer.channel(1, pyb.Timer.PWM, pin=pyb.Pin.board.P7,
                    pulse_width=8000)
ch2 = timer.channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.P8,
                    pulse_width=16000)
counter(value: int | None = None) int | None#

קבל או הגדר את מונה הטיימר.

freq(value: int | float | None = None) int | float | None#

קבל או הגדר את התדר עבור הטיימר (משנה את ה-prescaler ואת המחזור אם מוגדר).

period(value: int | None = None) int | None#

קבל או הגדר את מחזור הטיימר.

prescaler(value: int | None = None) int | None#

קבל או הגדר את ה-prescaler עבור הטיימר.

source_freq() int#

קבל את התדר של מקור הטיימר.

Constants#

קבועי מצב-מונה (ארגומנט mode של init()):

UP: int#

ספור מ-0 כלפי מעלה עד ARR (מצב ברירת המחדל).

DOWN: int#

ספור מ-ARR כלפי מטה עד 0.

CENTER: int#

ספור מ-0 כלפי מעלה עד ARR ואז בחזרה כלפי מטה עד 0.

קבועי מצב-break (ארגומנט brk של init()):

BRK_OFF: int#

קלט ה-break מושבת.

BRK_LOW: int#

קלט ה-break פעיל-נמוך.

BRK_HIGH: int#

קלט ה-break פעיל-גבוה.

קבועי מצב-ערוץ (ארגומנט mode של channel()):

PWM: int#

הגדר את הערוץ לפלט PWM (פעיל גבוה).

PWM_INVERTED: int#

הגדר את הערוץ לפלט PWM (פעיל נמוך).

OC_TIMING: int#

מצב תזמון השוואת-פלט; אף פין אינו מונע.

OC_ACTIVE: int#

מצב פעיל של השוואת-פלט; הפין הופך לפעיל בהתאמת השוואה.

OC_INACTIVE: int#

מצב לא-פעיל של השוואת-פלט; הפין הופך ללא-פעיל בהתאמת השוואה.

OC_TOGGLE: int#

מצב החלפה של השוואת-פלט; מצב הפין מתחלף בהתאמת השוואה.

OC_FORCED_ACTIVE: int#

מצב פעיל-כפוי של השוואת-פלט; הפין נכפה לפעיל והתאמת ההשוואה מתעלמת.

OC_FORCED_INACTIVE: int#

מצב לא-פעיל-כפוי של השוואת-פלט; הפין נכפה ללא-פעיל והתאמת ההשוואה מתעלמת.

IC: int#

הגדר את הערוץ למצב לכידת-קלט.

ENC_A: int#

מצב Encoder: המונה משתנה רק כאשר CH1 משתנה.

ENC_B: int#

מצב Encoder: המונה משתנה רק כאשר CH2 משתנה.

ENC_AB: int#

מצב Encoder: המונה משתנה בכל פעם ש-CH1 או CH2 משתנים.

קוטביות השוואת-פלט (ארגומנט polarity של channel() במצבי OC):

HIGH: int#

הפלט פעיל-גבוה.

LOW: int#

הפלט פעיל-נמוך.

קוטביות לכידת-קלט (ארגומנט polarity של channel() במצב IC):

RISING: int#

לכוד בקצה העולה.

FALLING: int#

לכוד בקצה היורד.

BOTH: int#

לכוד בכל אחד מהקצוות.