class Timer – dahili zamanlayıcıları kontrol etme

Zamanlayıcılar çok çeşitli görevler için kullanılabilir. Şu anda yalnızca en basit durum uygulanmıştır: bir fonksiyonu periyodik olarak çağırmak.

Her zamanlayıcı, belirli bir hızda yukarı doğru sayan bir sayaçtan oluşur. Saydığı hız, çevre birimi saat frekansının (Hz cinsinden) zamanlayıcı ön ölçekleyicisine (prescaler) bölünmesiyle elde edilir. Sayaç, zamanlayıcı periyoduna ulaştığında bir olay tetikler ve sayaç sıfıra geri sıfırlanır. Geri çağırma (callback) yöntemi kullanılarak, zamanlayıcı olayı bir Python fonksiyonunu çağırabilir.

Bir LED’i sabit bir frekansta açıp kapatmak için örnek kullanım:

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())

Geri çağırma (callback) için adlandırılmış fonksiyon kullanan örnek:

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

Diğer örnekler:

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

Not: Timer(1) kamera için kullanılır. Benzer şekilde, Timer(5) servo sürücüsünü kontrol eder ve Timer(6) zamanlanmış ADC/DAC okuma/yazma işlemleri için kullanılır. Programlarınızda diğer zamanlayıcıları kullanmanız önerilir.

Not: Bir geri çağırma (kesme) sırasında bellek ayrılamaz ve bu nedenle bir geri çağırma içinde ortaya çıkan istisnalar fazla bilgi vermez. Bu sınırlamayı aşmanın yolu için micropython.alloc_emergency_exception_buf() bölümüne bakın.

Kurucular

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

Verilen id’ye sahip yeni bir zamanlayıcı nesnesi oluşturur. Ek argümanlar verilirse, zamanlayıcı init(...) ile başlatılır. Geçerli id değerleri kümesi, kullanılan OpenMV Cam üzerindeki STM32 MCU’ya bağlıdır; mevcut genel amaçlı ve gelişmiş kontrol zamanlayıcıları için STM32 referans kılavuzuna başvurun.

Metotlar

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

Zamanlayıcıyı başlatır. Başlatma ya frekans (Hz cinsinden) ile ya da ön ölçekleyici (prescaler) ve periyot ile yapılmalıdır:

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

Anahtar kelime argümanları:

  • freq — zamanlayıcının periyodik frekansını belirtir. Bunu, zamanlayıcının bir tam döngüyü tamamlama frekansı olarak da düşünebilirsiniz.

  • prescaler [0-0xffff] - zamanlayıcının Ön Ölçekleyici Yazmacına (PSC) yüklenecek değeri belirtir. Zamanlayıcı saati elde etmek için zamanlayıcı saat kaynağı (prescaler + 1) değerine bölünür. Saat kaynağı zamanlayıcının üst APB veri yolundan gelir ve MCU’ya bağlıdır. STM32’de APB1 üzerindeki zamanlayıcılar tipik olarak 2 * pclk1 hızında ve APB2 üzerindeki zamanlayıcılar 2 * pclk2 hızında çalışır; geçerli veri yolu frekanslarını pyb.freq() ile okuyun ve OpenMV Cam’inizin MCU’su için STM32 referans kılavuzuna başvurun.

  • 1, 3, 4 ve 6-15 zamanlayıcıları için period [0-0xffff]. 2 ve 5 zamanlayıcıları için [0-0x3fffffff]. Zamanlayıcının Otomatik Yeniden Yükleme Yazmacına (ARR) yüklenecek değeri belirtir. Bu, zamanlayıcının periyodunu belirler (yani sayacın ne zaman döngü tamamlayacağını). Zamanlayıcı sayacı period + 1 zamanlayıcı saat döngüsünden sonra başa döner.

  • mode şunlardan biri olabilir:

    • Timer.UP - zamanlayıcıyı 0’dan ARR’a kadar saymak üzere yapılandırır (varsayılan)

    • Timer.DOWN - zamanlayıcıyı ARR’dan 0’a kadar geriye saymak üzere yapılandırır.

    • Timer.CENTER - zamanlayıcıyı 0’dan ARR’a ve ardından tekrar 0’a kadar saymak üzere yapılandırır.

  • div 1, 2 veya 4’ten biri olabilir. Dijital filtreler tarafından kullanılan örnekleme saatini belirlemek için zamanlayıcı saatini böler.

  • callback - Timer.callback() ile aynı şekilde

  • deadtime - tamamlayıcı (complementary) kanallardaki geçişler arasındaki “ölü” veya etkin olmayan sürenin miktarını belirtir (her iki kanal da bu süre boyunca etkin olmayacaktır). deadtime 0 ile 1008 arasında bir tam sayı olabilir; şu kısıtlamalarla: 1’lik adımlarla 0-128, 2’lik adımlarla 128-256, 8’lik adımlarla 256-512 ve 16’lık adımlarla 512-1008. deadtime source_freq değerinin div saat tiklerine bölünmesiyle elde edilen tikleri ölçer. deadtime yalnızca 1 ve 8 zamanlayıcılarında kullanılabilir.

  • brk - BRK_IN girişi etkinleştirildiğinde PWM çıkışını sonlandırmak için kesme (break) modunun kullanılıp kullanılmadığını belirtir. Bu argümanın değeri kesmenin etkin olup olmadığını ve polaritesinin ne olduğunu belirler ve Timer.BRK_OFF, Timer.BRK_LOW veya Timer.BRK_HIGH değerlerinden biri olabilir. BRK_IN pinini seçmek için mode=Pin.ALT, alt=Pin.AFn_TIMx ile bir Pin nesnesi oluşturun. Pinin GPIO giriş özellikleri alt modunda kullanılabilir - pull= , value() ve irq().

  • hard şunlardan biri olabilir:

    • True - Geri çağırma, gecikme ve titreşimi (jitter) en aza indiren ancak yığında (heap) ayırma yapamamak dahil Kesme işleyicileri yazma bölümünde açıklanan sınırlamalara tabi olan donanım kesme bağlamında yürütülecektir.

    • False - Geri çağırma yazılım kesmesi olarak zamanlanacaktır; bu, ayırma yapmasına izin verir ancak muhtemelen çöp toplama (garbage-collection) gecikmeleri ve titreşim (jitter) de getirir.

    Bu seçeneğin varsayılan değeri True’dur.

Ya freq’i ya da hem period hem de prescaler’ı belirtmelisiniz.

deinit() None

Zamanlayıcının başlatmasını geri alır (deinitialise).

Geri çağırmayı (ve ilişkili irq’yu) devre dışı bırakır.

Herhangi bir kanal geri çağırmasını (ve ilişkili irq’yu) devre dışı bırakır. Zamanlayıcıyı durdurur ve zamanlayıcı çevre birimini devre dışı bırakır.

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

Zamanlayıcı tetiklendiğinde çağrılacak fonksiyonu ayarlar. fun fonksiyonuna 1 argüman, zamanlayıcı nesnesi geçirilir. fun None ise geri çağırma devre dışı bırakılır.

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

Yalnızca bir kanal numarası geçirilirse, daha önce başlatılmış bir kanal nesnesi döndürülür (veya önceki bir kanal yoksa None).

Aksi takdirde, bir TimerChannel nesnesi başlatılır ve döndürülür.

Her kanal pwm, çıkış karşılaştırma (output compare) veya giriş yakalama (input capture) gerçekleştirecek şekilde yapılandırılabilir. Tüm kanallar aynı temel zamanlayıcıyı paylaşır, bu da aynı zamanlayıcı saatini paylaştıkları anlamına gelir.

Anahtar kelime argümanları:

  • mode şunlardan biri olabilir:

    • Timer.PWM — zamanlayıcıyı PWM modunda (aktif yüksek) yapılandırır.

    • Timer.PWM_INVERTED — zamanlayıcıyı PWM modunda (aktif düşük) yapılandırır.

    • Timer.OC_TIMING — hiçbir pinin sürülmediğini belirtir.

    • Timer.OC_ACTIVE — bir karşılaştırma eşleşmesi oluştuğunda pin aktif hale getirilir (aktiflik polariteye göre belirlenir)

    • Timer.OC_INACTIVE — bir karşılaştırma eşleşmesi oluştuğunda pin etkin olmayan hale getirilir.

    • Timer.OC_TOGGLE — bir karşılaştırma eşleşmesi oluştuğunda pin açılıp kapatılır (toggle).

    • Timer.OC_FORCED_ACTIVE — pin zorla aktif hale getirilir (karşılaştırma eşleşmesi yok sayılır).

    • Timer.OC_FORCED_INACTIVE — pin zorla etkin olmayan hale getirilir (karşılaştırma eşleşmesi yok sayılır).

    • Timer.IC — zamanlayıcıyı Giriş Yakalama (Input Capture) modunda yapılandırır.

    • Timer.ENC_A — zamanlayıcıyı Enkoder (Encoder) modunda yapılandırır. Sayaç yalnızca CH1 değiştiğinde değişir.

    • Timer.ENC_B — zamanlayıcıyı Enkoder (Encoder) modunda yapılandırır. Sayaç yalnızca CH2 değiştiğinde değişir.

    • Timer.ENC_AB — zamanlayıcıyı Enkoder (Encoder) modunda yapılandırır. Sayaç CH1 veya CH2 değiştiğinde değişir.

  • callback - TimerChannel.callback() ile aynı şekilde

  • pin None (varsayılan) veya bir Pin nesnesi. Belirtilirse (ve None değilse) bu, belirtilen pinin alternatif fonksiyonunun bu zamanlayıcı kanalı için yapılandırılmasına neden olur. Pin bu zamanlayıcı kanalı için herhangi bir alternatif fonksiyonu desteklemiyorsa bir hata ortaya çıkar.

Timer.PWM modları için anahtar kelime argümanları:

  • pulse_width - kullanılacak başlangıç darbe genişliği değerini belirler.

  • pulse_width_percent - kullanılacak başlangıç darbe genişliği yüzdesini belirler.

Timer.OC modları için anahtar kelime argümanları:

  • compare - karşılaştırma yazmacının başlangıç değerini belirler.

  • polarity şunlardan biri olabilir:

    • Timer.HIGH - çıkış aktif yüksektir

    • Timer.LOW - çıkış aktif düşüktür

Timer.IC modları için isteğe bağlı anahtar kelime argümanları:

  • polarity şunlardan biri olabilir:

    • Timer.RISING - yükselen kenarda yakalar.

    • Timer.FALLING - düşen kenarda yakalar.

    • Timer.BOTH - her iki kenarda yakalar.

Yakalamanın yalnızca birincil kanalda çalıştığını, tamamlayıcı (complementary) kanallarda çalışmadığını unutmayın.

Timer.ENC modları için notlar:

  • 2 pin gerektirir, bu nedenle Pin API’si kullanılarak bir veya her iki pinin uygun zamanlayıcı AF’sini kullanacak şekilde yapılandırılması gerekir.

  • Enkoder değerini timer.counter() metodunu kullanarak okuyun.

  • Yalnızca CH1 ve CH2’de çalışır (CH1N veya CH2N’de çalışmaz)

  • Enkoder modu ayarlanırken kanal numarası yok sayılır.

PWM örneği – her STM32 OpenMV Cam’de TIM4 kanalları 1 ve 2 sırasıyla P7 ve P8 başlık pinlerine yönlendirilir:

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

Zamanlayıcı sayacını alır veya ayarlar.

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

Zamanlayıcının frekansını alır veya ayarlar (ayarlanırsa ön ölçekleyiciyi ve periyodu değiştirir).

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

Zamanlayıcının periyodunu alır veya ayarlar.

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

Zamanlayıcının ön ölçekleyicisini (prescaler) alır veya ayarlar.

source_freq() int

Zamanlayıcının kaynağının frekansını alır.

Sabitler

Sayaç modu sabitleri (init() fonksiyonunun mode argümanı):

UP: int

0 değerinden ARR’a kadar yukarı doğru say (varsayılan mod).

DOWN: int

ARR’dan 0 değerine kadar aşağı doğru say.

CENTER: int

0 değerinden ARR’a ve ardından tekrar 0 değerine kadar say.

Kesme modu sabitleri (init() fonksiyonunun brk argümanı):

BRK_OFF: int

Kesme girişi devre dışıdır.

BRK_LOW: int

Kesme girişi aktif düşüktür.

BRK_HIGH: int

Kesme girişi aktif yüksektir.

Kanal modu sabitleri (channel() metodunun mode argümanı):

PWM: int

Kanalı PWM çıkışı için yapılandır (aktif yüksek).

PWM_INVERTED: int

Kanalı PWM çıkışı için yapılandır (aktif düşük).

OC_TIMING: int

Çıkış karşılaştırma zamanlama modu; hiçbir pin sürülmez.

OC_ACTIVE: int

Çıkış karşılaştırma aktif modu; karşılaştırma eşleşmesinde pin aktif hale getirilir.

OC_INACTIVE: int

Çıkış karşılaştırma etkin olmayan modu; karşılaştırma eşleşmesinde pin etkin olmayan hale getirilir.

OC_TOGGLE: int

Çıkış karşılaştırma açma/kapama (toggle) modu; karşılaştırma eşleşmesinde pin açılıp kapanır.

OC_FORCED_ACTIVE: int

Çıkış karşılaştırma zorla aktif modu; pin zorla aktif hale getirilir ve karşılaştırma eşleşmesi yok sayılır.

OC_FORCED_INACTIVE: int

Çıkış karşılaştırma zorla etkin olmayan modu; pin zorla etkin olmayan hale getirilir ve karşılaştırma eşleşmesi yok sayılır.

IC: int

Kanalı giriş yakalama (input-capture) modu için yapılandır.

ENC_A: int

Enkoder modu: sayaç yalnızca CH1 değiştiğinde değişir.

ENC_B: int

Enkoder modu: sayaç yalnızca CH2 değiştiğinde değişir.

ENC_AB: int

Enkoder modu: sayaç CH1 veya CH2 her değiştiğinde değişir.

Çıkış karşılaştırma polaritesi (OC modlarında channel() metodunun polarity argümanı):

HIGH: int

Çıkış aktif yüksektir.

LOW: int

Çıkış aktif düşüktür.

Giriş yakalama polaritesi (IC modunda channel() metodunun polarity argümanı):

RISING: int

Yükselen kenarda yakala.

FALLING: int

Düşen kenarda yakala.

BOTH: int

Her iki kenarda da yakala.