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çerliiddeğ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 olarak2 * pclk1hızında ve APB2 üzerindeki zamanlayıcılar2 * pclk2hı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 + 1zamanlayı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.
div1, 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ı şekildedeadtime- 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).deadtime0 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.deadtimesource_freqdeğerinindivsaat tiklerine bölünmesiyle elde edilen tikleri ölçer.deadtimeyalnızca 1 ve 8 zamanlayıcılarında kullanılabilir.brk-BRK_INgiriş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 veTimer.BRK_OFF,Timer.BRK_LOWveyaTimer.BRK_HIGHdeğerlerinden biri olabilir.BRK_INpinini seçmek içinmode=Pin.ALT, alt=Pin.AFn_TIMxile bir Pin nesnesi oluşturun. Pinin GPIO giriş özellikleri alt modunda kullanılabilir -pull=,value()veirq().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.
funfonksiyonuna 1 argüman, zamanlayıcı nesnesi geçirilir.funNoneise 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ı şekildepinNone (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üksektirTimer.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
TIM4kanalları 1 ve 2 sırasıylaP7veP8baş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)
- 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).
Sabitler¶
Sayaç modu sabitleri (
init()fonksiyonununmodeargümanı):Kesme modu sabitleri (
init()fonksiyonununbrkargümanı):Kanal modu sabitleri (
channel()metodununmodeargümanı):- 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.
Çıkış karşılaştırma polaritesi (OC modlarında
channel()metodununpolarityargümanı):Giriş yakalama polaritesi (IC modunda
channel()metodununpolarityargümanı):