Bölüm – III
STM32F407VGT6 kartında 14 adet timer bulunmakta. Bunlar ile ilgili detaya bu mcunun kataloğundan ulaşabilmeniz mümkün. Biz basit uygulamalar yapacağımız için, bunların detayına girmek istemiyorum. Yeri geldikçe elimden geldiğince açıklamaya çalışacağım.
Timer, hem pyb modülü, hem de machine modülü içerisinde tanımlanmıştır. Bizim konumuz, pyb metodu içerisindeki Timer metodudur.
Timer metodu şu şekilde tanımlanmıştır:
Timer.init(*, freq, prescaler, period, mode=Timer.UP, div=1, callback=None, deadtime=0, brk=Timer.BRK_OFF)
Konsolda:
tim1 = pyb.Timer(1, freq=2)
tim1.callback(lambda t:pyb.LED(1).toggle())
yazıp görelim. 1 saniyelik periyod ile kırmızı led yanıp sönmeye başlayacaktır. 500mS yanık, 500mS sönük olacaktır. Artık sadece tim1.freq(X)
ile frekansı değiştirebiliriz. Yine konsola tim1
yazarak; Timer1 ayrıntılarına erişebiliriz.
Durdurmak için tim1.deinit()
yazabiliriz. Basit bir kod yazalım:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#-------------------------------------------- import pyb tim1 = pyb.Timer(1, freq=2) tim1.callback(lambda t:pyb.LED(1).toggle()) try: while True: pass except KeyboardInterrupt: tim1.deinit() pyb.Pin(pyb.Pin("LED_RED"), pyb.Pin.OUT_PP) pyb.LED(1).off() |
Timer, deinit yapıldığında; kontrol edilen led o an yanık kalabilir. pyb.LED(1).off()
ile ledi söndürebiliriz.
Farklı ledleri ve frekansları siz de deneyebilirsiniz.
Timer.callback konusuna bir örnek daha yapalım:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
#-------------------------------------------- import pyb import micropython #LED(1) - > Kırmızı #LED(2) - > Yeşil #LED(3) - > Turuncu #LED(4) - > Mavi micropython.alloc_emergency_exception_buf(100) def redBlink(tim1): pyb.LED(1).toggle() def greenBlink(tim2): pyb.LED(2).toggle() def orangeBlink(tim3): pyb.LED(3).toggle() def blueBlink(tim4): pyb.LED(4).toggle() print("\nDurdurmak için 'Ctrl + C' ye basınız.\n") tim1 = pyb.Timer(1, freq=1.2) tim2 = pyb.Timer(2, freq=3.4) tim3 = pyb.Timer(3, freq=5.6) tim4 = pyb.Timer(4, freq=7.8) tim1.callback(redBlink) tim2.callback(greenBlink) tim3.callback(orangeBlink) tim4.callback(blueBlink) try: while True: pass except KeyboardInterrupt: tim1.callback(None) tim2.callback(None) tim3.callback(None) tim4.callback(None) tim1.deinit() tim2.deinit() tim3.deinit() tim4.deinit() #birinci şık #pyb.Pin(pyb.Pin("LED_RED"), pyb.Pin.OUT_PP) #ikinci şık pyb.Pin(pyb.Pin("LED_RED"), mode=pyb.Pin.OUT) pyb.Pin(pyb.Pin("LED_GREEN"), mode=pyb.Pin.OUT) pyb.Pin(pyb.Pin("LED_ORANGE"), mode=pyb.Pin.OUT) pyb.Pin(pyb.Pin("LED_BLUE"), mode=pyb.Pin.OUT) pyb.LED(1).off() pyb.LED(2).off() pyb.LED(3).off() pyb.LED(4).off() print("\nKlavye kesmesi tespit edildi.\nProgram sonlandırıldı.\n") |
Üstteki kodun daha sadeleştirilmiş hali aşağıda:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#-------------------------------------------- import pyb import micropython #LED(1) kırmızı #LED(2) yeşil #LED(3) turuncu #LED(4) mavi micropython.alloc_emergency_exception_buf(100) class LedSec(object): def __init__(self, timer, led): self.led = led timer.callback(self.blink) def blink(self, tim): self.led.toggle() red = LedSec(pyb.Timer(1, freq=1.9), pyb.LED(1)) green = LedSec(pyb.Timer(2, freq=2.7), pyb.LED(2)) orange = LedSec(pyb.Timer(3, freq=3.3), pyb.LED(3)) blue = LedSec(pyb.Timer(4, freq=4.9), pyb.LED(4)) print("\nDurdurmak için 'Ctrl + C' ye basınız.\n") try: while True: pass except KeyboardInterrupt: print("\nKlavye kesmesi tespit edildi.\nProgram sonlandırıldı.\n") pyb.delay(500) machine.soft_reset() |
Timer konusu bitmiyor, çokça kullanacağız. Bağlantılı konu olan pwm kısmına giriş yapalım.
Kullandığımız Discovery kartında bulunan bazı Timer birimleri, belirli pinler ile ilişkilidir. Bununla ilgili ayrıntılı bilgiler STM32F407 belgelerinde mevcuttur.
Bu Discovery kart üzerinde bulunan dört adet led, Timer4 altındaki kanallara bağlanmıştır. Daha önceki yazımızda bu ledleri ve ilgili pinleri kullanmıştık. Zamanlamasını kendimiz verdik ya da başka bir Timer birimi ile ilişkilendirdik.
Şimdi bu pwm birimini nasıl yapılandıracağız ona bakalım. Ledlerin bağlı olduğu pinleri biliyorduk, bunlar; PD12 -> Yeşil, PD13 -> Turuncu, PD14 -> Kırmızı, PD15 -> Mavi olmaktadır.
Timer4 altında TIM4_CH1, TIM4_CH2, TIM4_CH3, TIM4_CH4, olmak üzere dört birim bulunmakta ve bunlarda sıra ile PD12, PD13, PD14 ve PD15 numaralı pinler ile mcu donanımı içinde ilişkilendirilmiştir. Bu pinler de kart üzerindeki ledlere bağlanmıştır. [Şema]

Alttaki kodu Thonny terminali üzerine yazalım.
1 2 3 4 5 6 7 8 |
#----------------------------------- import pyb p = pyb.Pin('LED_BLUE') tim = pyb.Timer(4, freq=1000) ch = tim.channel(4, pyb.Timer.PWM, pin=p) ch.pulse_width_percent(20) # Yüzde cinsinden duty oranı |
Mavi led (PD15, TIM4_CH4), frekansı 1KHz ve %20 duty oranı ile yanmış oldu. Uygulamalarımızda yüzdesel oranı kullanmamız bizim için çok uygun olacaktır. Zira ilgili Timer özelliklerinde bulunan; freq, prescaler, period ve div değişkenleri farklılıklar gösterecektir. Aslında period bizim duty oranı değerimizdir. Ancak frekansı değiştirdiğimizde bu da değişecektir. Bu değeri öğrenip kodumuzda kullanmak yerine, yüzde değeri olarak kullanmamız daha uygun olacaktır.
Alttaki kodu deneyebiliriz:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#-------------------------------------------- import pyb p = pyb.Pin('LED_BLUE') tim = pyb.Timer(4, freq=1000) ch = tim.channel(4, pyb.Timer.PWM, pin=p) ch.pulse_width_percent(0) zaman = 15 while(True): for(i) in (range(1,100)): ch.pulse_width_percent(i) pyb.delay(zaman) for(i) in (range(100, -1, -1)): ch.pulse_width_percent(i) pyb.delay(zaman) |
Mavi ledin yumuşak bir şekilde yanıp-söndüğünü gözlemledik. Programı Ctrl-C ile kestiğimizde; led duty oranı, o anda en son değerde kalacak ve değişmeyecektir. Timer deinit ile sonlandırılabilir. Ancak ilgili pin pwm modundan çıkmayacaktır. İlgili ledin pin metodu olan on(), off() çalışmayacaktır.
Bu moddan kurtarmak için;pyb.Pin(pyb.Pin("LED_BLUE", mode=pyb.Pin.OUT)
)
yazmamız gerekmektedir. Böylece pin normal çıkış moduna geri dönecektir.
Eğer hassas değerler gerekirse ch.pulse_width() kullanabiliriz, zaman gecikmesi için de time.sleep_us() kullanabiliriz. tim.period() dan alacağımız period değeri döngü sayacımız olacaktır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#-------------------------------------------- import pyb import time p = pyb.Pin('LED_BLUE') tim = pyb.Timer(4, freq=1000) ch = tim.channel(4, pyb.Timer.PWM, pin=p) ch.pulse_width(0) zaman = 10 max_duty = tim.period() while(True): for(i) in (range(1, max_duty, 1)): ch.pulse_width(i) time.sleep_us(zaman) for(i) in (range(max_duty, -1, -1)): ch.pulse_width(i) time.sleep_us(zaman) |
Dört ledi de içeren bir uygulama yazalım:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#----------------------------------------------- import pyb greenLed = pyb.Pin('LED_GREEN') #"PD12" de yazılabilir. orangeLed = pyb.Pin('LED_ORANGE') redLed = pyb.Pin('LED_RED') blueLed = pyb.Pin('LED_BLUE') tim = pyb.Timer(4, freq=1000) ch1 = tim.channel(1, pyb.Timer.PWM, pin=greenLed) ch2 = tim.channel(2, pyb.Timer.PWM, pin=orangeLed) ch3 = tim.channel(3, pyb.Timer.PWM, pin=redLed) ch4 = tim.channel(4, pyb.Timer.PWM, pin=blueLed) ch1.pulse_width_percent(0) ch2.pulse_width_percent(0) ch3.pulse_width_percent(0) ch4.pulse_width_percent(0) zaman = 3 print("\nDört ledli animasyon başlıyor...") try: while(True): for(i) in (range(1,100)): ch1.pulse_width_percent(i) pyb.delay(zaman) for(i) in (range(100, -1, -1)): ch1.pulse_width_percent(i) pyb.delay(zaman) for(i) in (range(1,100)): ch2.pulse_width_percent(i) pyb.delay(zaman) for(i) in (range(100, -1, -1)): ch2.pulse_width_percent(i) pyb.delay(zaman) for(i) in (range(1,100)): ch3.pulse_width_percent(i) pyb.delay(zaman) for(i) in (range(100, -1, -1)): ch3.pulse_width_percent(i) pyb.delay(zaman) for(i) in (range(1,100)): ch4.pulse_width_percent(i) pyb.delay(zaman) for(i) in (range(100, -1, -1)): ch4.pulse_width_percent(i) pyb.delay(zaman) except KeyboardInterrupt: ch1.pulse_width_percent(0) ch2.pulse_width_percent(0) ch3.pulse_width_percent(0) ch4.pulse_width_percent(0) tim.deinit() pyb.Pin("PD12", mode=pyb.Pin.OUT) pyb.Pin("PD13", mode=pyb.Pin.OUT) pyb.Pin("PD14", mode=pyb.Pin.OUT) pyb.Pin("PD15", mode=pyb.Pin.OUT) print("Klavye kesmesi tespit edildi.\nProgram durduruldu.\n") |
Bu günlük bu kadar. Umarım eğlenceli uygulamalar yapmışızdır. Aklınıza takılanlar olursa cevaplamaya gayret edeceğim. “Hakkımda” alanından ulaşabilirsiniz. Hem Python ‘u, hem micropython ‘u, hem de konumuz olan STM32F4-Discovery kartını tanımaya ve çeşitli uygulamalar yapmaya devam edeceğiz. Kart üzerinde ve haricen bağlanabilecek modülleri işlemeye devam edeceğiz…
7 segment 7segment 12F675 12F683 ADC Arduino AVR AvrDude BUTON button Code Composer Studio Direnç esp esp8266 G2552 GLCD itoa led LIS3DSH LIS302DL micropython MPLABX MSP430 ortanca filtre pendulum PIC PIC18F452 port PWM PySimpleGUI python pyttsx3 seven segment STM32 STM32F-Discovery STM32F4-DISCO STM32F4-Discovery STM32F407 Thonny Timer0 usb Voltmetre XC8 Zener test cihazı İvme Sensörü