Embedded Systems etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Embedded Systems etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

19 Mart 2024 Salı

CAN Bus Frame Tipleri

Yazıya başlamadan önce CAN Bus temelleri ve mesaj yapısının temellerini incelemek için bu linkte yer alan blog yazısını inceleyebilirisiniz.

CAN Bus hattında kullanılan 4 tip frame (çerçeve, yapı) vardır.

  • Data Frame: Data framei, temelde data/veri taşımak için kullanılan ana yapıdır. CAN Bus sistemleri arasında veri transferi için kullanılır. Tek bir data framei üzerinden minimum 1 maksimum 8 byte veri transferi tek seferde gerçekleştirilebilir.
  • Remote Frame: Remote frame, veri talep etme frameidir. Remote framede tanımlanan ID CAN Bus ağına basılır. İlgili mesaj paketini barındıran sistem bu ağa ilgili data frameini basar. Remote frame, bir sistemin, bir veriye özellikle ihtiyaç duyduğu zamanda kullanılır.
  • Error Frame: SOF ile CRC arasında 6 veya 12 bit boyunca aynı seviye (High/Low, Recessive/Dominant) veri gönderilmesiyle error framei tanımlanmış olur ve hattaki sistemler ilgili framei error frame olarak işaretler. Error frame istemli gönderilen bir frame değildir. Bir sistem bir paketi göndermeye başladıktan sonra bir hata tespit edilirse ilgili frame error frameine çevrilir.
  • Overload Frame: CAN Bus peripheralı meşgul olduğu durumlarda hattı meşgul tutmak için overload frame hatta basar. Bu bilgi hattın durdurulması için kullanılır. Günümüzde genellikle kod üzerinden kontrol edilmez. CAN Bus peripheralları bu durumu kendisi tespit eder ve gerektiği kadar hattı meşgulde tutar, sonrasında bırakır.



Kaynaklar
  1. https://medium.com/@mohammednumeir13/can-protocol-types-of-can-frames-51c8444176bb
  2. https://www.researchgate.net/publication/340883976_Cyberattacks_and_Countermeasures_For_In-Vehicle_Networks/figures?lo=1

6 Mart 2024 Çarşamba

POWERB Alkaline LR03 AAA 1.5 Volt Pil Değerlendirmesi @250mA

Bu yazıda testimizi 250 mA seviyesinde gerçekleştirdik. 250 mA sabit akımda voltaj grafiği 800 mV'u yaklaşık 2,4 saatte kesiyor. Bu durumda POWERB Alkaline LR03 AAA pilin kapasitesi 2,4 h*250 mA hesabından 600 mAh olarak bulunur.

Test düzeneği ve ölçüm ile ilgili konulara buradaki yazıdan ulaşabilirsiniz.









Label order: Row ID | Time Stamp (Millisecond) | Voltage (mV) | Current (mA) | Set Current (mA)

Veri seti

Pil Kıyaslama Yazıları

1 Mart 2024 Cuma

CAN Bus Fiziksel Katmanı

CAN (Controller Area Network) Bus CANH, CANL şeklinde isimlendirilen ikili hat üzerinden birden çok sistemin konuşabildiği, aynı anda tek bir sistemin konuştuğu (half-dublex), yüksek hızlı uygulamalara izin veren bir ağ yapısıdır.

Haberleşme yapılarında farklı seviye katmanlar ve uygulama tipleri vardır. Bu kapsamda CAN Bus'ın fiziksel katmanı üzerine detaylı bir inceleme gerçekleştirilmiştir.

Bu konuya giriş yaparken donanım seviyesinden işi ele alıp elektriksel seviyeye ilerlemek mantıklı olacaktır.

Öncelikle yazı  kapsamında kullanılacak tanımlardan bahsetmek gerekirse, sistem ifadesini CAN Bus hattına bağlanabilen ve haberleşebilen her şey olarak düşünebiliriz. Otomotiv üzerinden örnek verecek olursak VCU, BMS, Inverter gibi CAN Bus ile haberleşen yapılara sistem diyebiliriz.

Bir CAN Bus hattı CANH ve CANL hatlarının burulmuş çifti (twisted pair) ile birbirine bağlanır. Bu yapı ethernet kablolarında da benzer şekilde kullanılır. Bu bağlantı elektromanyetik yayılıma karşı hattın güçlü olmasını sağlar. Bu yapıda hat üzerinde indüklenen gürültü akımları her iki hatta neredeyse ortak seviyede etkileyeceği için CANH, CANL arasındaki fark neredeyse sabit kalır. 

Örnek bir burulmuş çift (twisted pair) görseli aşağıda görebilirsiniz.

CANH, CANL twisted pair kablo üzerinden iletildikten sonra elektronik devre üzerindeki yapılar ile karşılaşıyoruz. Burada temel yapıyı anlamak için CAN Bus dönüştürücüler ile anlatıma devam etmek faydalı olacaktır. Sektörde de sıklıkla kullanılan SN65HVD1050 entegresini örnek olarak ele alabiliriz. Bu yapılar mikrodenetleyicilerden çıkan CANTX, CANRX pinlerini CANH, CANL seviyesine dönüştürür. CAN Bus dönüştürücü entegrelerinin ana görevi budur. Tamamen analog yapılar bu dönüşüm için yeterlidir. Bununla birlikte hat ile ilgili temel elektriksel kontrolleri yapabilir. Entegre özelinde sıcaklık kontrolü ve koruması yapabilir. ESD korumaları sağlayabilir. Bublar zorunlu fonksiyonlar değildir.

SN65HVD1050'nin iç yapısı aşağıdaki gibidir.

CAN Bus dönüştürücüleri giriş tarafında CANH, CANL değerlerinin elektriksel farkına göre RXD ucuna 1/0 bilgisi gönderir. CANH, CANL aynı değerlerde ise lojik 1, aradaki fark 2.5 V ise lojik değer 0'dır.


Gönderici taraftan bakacak olursak TXD pini üzerinden bir sürücü kısım aktifleşir ve çıkış anahtarlarını sürer. Bu anahtarlar TXD lojik 0 iken aktif çalışır ve CANH, CANL hattını 2.5 V farka çeker. Aksi durumda aynı değerde tutar.

CAN Bus'ın özelliklerinden biri hattı sürerken aynı zamanda aktif olarak okumaya devam etmesi ve CAN mesaj paketi içerisinde belli bitleri takip ederek karşı alıcının mesajı sağlıklı bir şekilde alıp almadığını doğrulamasıdır. Bu sayede gönderilen mesajların en az bir alıcıya ulaşıp ulaşmadığından gönderici taraf emin olur.

Ek ve büyük bir katkısı da veri gönderirken okumaya devam etmesi sayesidne herhangi bir durumda önceliği yüksek bir mesaj paketi başka bir sistem üzerinden gönderilirse, hattı her sistem sürekli okuyarak çalışmaya devam ettiği için ilgili yüksek öncelikli mesaja diğer tüm sistemler izin/öncelik verir.

Kaynaklar:

  1. https://www.ti.com/lit/an/sloa101b/sloa101b.pdf

Duracell Alkaline LR14 1.5 Volt Pil Değerlendirmesi @250mA

Bu yazıda testimizi 250 mA seviyesinde gerçekleştirdik. 250 mA sabit akımda voltaj grafiği 800 mV'u yaklaşık 19,8 saatte kesiyor. Bu durumda Duracell Alkaline LR14 pilin kapasitesi 19,8 h*250 mA hesabından 4950 mAh olarak bulunur.

Test düzeneği ve ölçüm ile ilgili konulara buradaki yazıdan ulaşabilirsiniz.









Label order: Row ID | Time Stamp (Millisecond) | Voltage (mV) | Current (mA) | Set Current (mA)

Veri seti

Pil Kıyaslama Yazıları

26 Şubat 2024 Pazartesi

ESP32 ile Kristal veya Osilatör Kullanmadan RMII Üzerinden Ethernet Haberleşmesi ve İpuçları

İnternette gördüğüm ESP32 ve ethernet uygulamalarının çoğunda ethernet chipine kristal takarak uygulama çalıştırılmış. Bunun sinyal kalitesi açısından faydası olabilir ancak tek çözüm bu değil. ESP32 modüllerinden de ethernet için gerekli clock çıkışını alabilirsiniz.

Bunun için örnek devrede de gösterildiği gibi ESP32 ile ethernet chipinin clock uçlarını birleştirmek yeterli. Burada frekans 50 MHz mertebesinde olduğu için mümkün oldukça yakın olması önemli.

Benim yaptığım uygulamadan hat boyu yaklaşık 44 mm ve 2 adet via kullanılıyor. Buna rağmen sorunsuz bir şekilde sistemin çalıştığını gördüm.



ESP32 clock çıkışı için GPIO0, GPIO16, GPIO17 pinleri kullanılabilir.


Arduino arayüzünde varsayılan olarak clock ESP32'ye girecek şekilde tanımlanmıştır. Ethernet clock çıkışını tanımlamak için aşağıdaki satır kullanılabilir. Bu begin fonksiyonu üzerinden ethernet chipi, clock yönü ve pini seçilebilir.

ETH.begin(0,-1,23,18,ETH_PHY_LAN8720,ETH_CLOCK_GPIO17_OUT);

Kaynaklar;

  • https://docs.espressif.com/projects/esp-idf/en/release-v3.1/api-reference/ethernet/esp_eth.html
  • https://www.espressif.com/sites/default/files/documentation/esp32-wroom-32d_esp32-wroom-32u_datasheet_en.pdf

20 Şubat 2024 Salı

Panasonic General Purpose Zinc Carbon R6BE AA 1.5 Volt Pil Değerlendirmesi @250mA

Bu yazıda testimizi 250 mA seviyesinde gerçekleştirdik. 250 mA sabit akımda voltaj grafiği 800 mV'u yaklaşık 1,4 saatte kesiyor. Bu durumda Panasonic General Purpose Zinc Carbon R6BE AA pilin kapasitesi 1,4 h*250 mA hesabından 350 mAh olarak bulunur.

Test düzeneği ve ölçüm ile ilgili konulara buradaki yazıdan ulaşabilirsiniz.







Label order: Row ID | Time Stamp (Millisecond) | Voltage (mV) | Current (mA) | Set Current (mA)

Veri seti

Pil Kıyaslama Yazıları


10 Ocak 2024 Çarşamba

STM32F103 Mikrodenetleyici Çevre Birimlerinde Karşılaştığım Bir Problem #STM32Tips

Konunun hikayesinden başlamak gerekirse, STM32F0 ve STM32F1 serisi işlemcilerden oluşan ve CAN Bus üzerinden birbirleri ile haberleşen bir tasarım üzerine çalışıyordum. Her bir kart için CAN Bus bağlantısının yanında bilgisayar bağlantısını da kurmak için USB bağlantısını sisteme dahil etmiştim. Bu tasarım STM32F0 serisi işlemcide CAN Bus ve USB sorunsuz çalıştı.

STM32F1 serisi işlemciyi kullanırken aynı yazılıp mimarisi üzerinden devam ediyordum ancak bir sorun ile karşılaştım. Bir şekilde CAN Bus hattını kullanamıyordum. Problemi araştırmaya başladığımda USB ve CAN Bus'ın birlikte kullanımı ile ilgili başka problem yaşayanların da olduğunu gördüm. Sonrasında kullandığım işlemci olan STM32F103CB'nin datasheetini (Reference Manual RM0008 Rev 21) inceledim. CAN Bus kısmında aşağıdaki gibi bir not olduğunu gördüm.

"In low, medium-, high- and XL-density devices the USB and CAN share a dedicated 512-

byte SRAM memory for data transmission and reception, and so they cannot be used concurrently (the shared SRAM is accessed through CAN and USB exclusively). The USB and CAN can be used in the same application but not at the same time."

Buradan anladığımız CAN Bus ve USB işlemci üzerinde aynı SRAM alanlarını kullanıyor ve bu yüzden her iki çevre birimi birlikte kullanılamıyor. USB'yi kapatıp CAN Bus'ı çalıştırmak veya tam tersi mümkün ancak her ikisi aynı anda asla çalıştırılamıyor. Bu yüzden örnek vermek gerekirse CAN Bus üzerinden alınan bir veriyi USB üzerinden gerçek zamanlı alıp işlemek mümkün değil.

Ek olarak STM32F0 serisi ile bir çok uygulama yapmıştım ve bu yüzden USPDP, USPDM hatlarını direkt konnektöre bağlamıştım. STM32F103CB işlemci kullanırken USBDP hattına 3.3 V'a 1.5 kR pull-up resistor gerekiyormuş.

STM32 USB kullanılan uygulamalarda donanım tasarımı hakkında aşağıdaki doküman yayınlamış. Donanım tarafında yapılması gereken işler tek bir dokümanda bütün işlemci ailesi için verilmiş. Gelecek tasarımlar için işe yarar gibi görünüyor.


Link: https://www.st.com/resource/en/application_note/an4879-introduction-to-usb-hardware-and-pcb-guidelines-using-stm32-mcus-stmicroelectronics.pdf (10.01.2024)

3 Ocak 2024 Çarşamba

Panasonic Alkaline Power LR6 AA 1.5 Volt Pil Değerlendirmesi @500mA

Bu yazıda testimizi 500 mA seviyesinde gerçekleştirdik. 250 mA standardına göre yapılmadığı için katalog değeri olan kapasite değeri değildir ancak 500 mA sabit akımda Panasonic Alkaline Power LR6 AA pilin kapasitesi 1050 mAh'dir. 250 mA için daha yüksek olması gerekmektedir. İlgili grafikler ve veri setleri aşağıdadır.

Test düzeneği ve ölçüm ile ilgili konulara buradaki yazıdan ulaşabilirsiniz.




Label order: Row ID | Time Stamp (Millisecond) | Voltage (mV) | Current (mA) | Set Current (mA)

Veri seti

Pil Kıyaslama Yazıları



31 Aralık 2023 Pazar

CAN Bus Temel Özellikler, Avantajları ve Dezavantajları

Temel Özellikler

  • Bükümlü çift yapısında iki kablo
  • Hat baş ve sonra 2 direnç ile sonlandırılır
  • ~40 metre kablo için 1 Mbps veri iletim hızı vardır
  • Bir mesaj paketinde azami 8 byte veri gönderilir
  • Mesaj gönderme alma prosedürü hatalara dirençli (robust) bir şekilde çalışır
  • Mesaj ID'sine göre önceliklendirme yapısı vardır
  • İki sistem aynı anda mesaj paketi iletmek istese bile ID önceliklendirme yapısı hatayı engeller
  • Mesajlar hat üzerindeki tüm sistemlere iletilir
  • Mesaj iletilmeme durumunda yeniden gönderme yapısı CAN kontrolcüsü üzerinde gerçekleştirilir
  • Sabit/Sürekli bir hata durumunda CAN kontrolcüsü kendini belli durumlarda durdurur

Avantajlar

  • Düşük kablolama karmaşıklığı
  • Araç kablolama işlemlerinde kolaylık
  • Hatta yeni bir sistem eklemek veya hattan bir sistemi kaldırmakta kolaylık
  • Kapalı bir sistem hattı etkilemez
  • Çoklu yönetici, her bir sistem hatta veri basabilir ve hat üzerinde bulunan veriyi okuyabilir
  • Elektromanyetik yayılımdan etkilenmesi halinde emniyetlidir
  • Hata tespit yapıları vardır
  • Arıza durumunda teşhis ve bakım kolaylıkla yapılır
Dezavantajlar
  • Veri iletişim hızı ~1Mbps hızında sınırlıdır
  • Basit protokollere göre uygulaması daha maliyetlidir
  • Siber ataklara karşı açıktır. Kolaylıkla hatta erişilip veriler manipüle edilebilir




23 Aralık 2023 Cumartesi

CAN Bus Temelleri ve Bir Mesajının Yapısı

CAN (Controller Area Network) Bus Robert Bosch GmbH tarafından oluşturulmuştur. 1986'da RB GmbH tarafından SAE'de yayınlanmıştır. Takip eden yıllarda CAN Bus'ın farklı versiyonları yayınlanmıştır ve ISO tarafından standardize edilmiştir. CAN Bus günümüzde içten yanmalı ve elektrikli bir çok araç tipinde aktif olarak kullanılan ve temel kontrol yetenekleri dolayısı ile sıklıkla tercih edilen bir haberleşme protokolüdür.

CAN Bus, mesaj tabanlı bir haberleşme protokolüdür. Hat üzerinde bulunan bütün noktalar hatta veri basabilir ve veriyi okuyabilir. Fiziksel olarak CANH, CANL şeklinde isimlendirilen iki fiziksel hat üzerinden iletilir. Fiziksel hat üzerinde bulunan voltaj farkı üzerinden çalışır.

CAN Bus ile haberleşen bir ağın fiziksel bağlantısı aşağıdaki gibidir. Bir hat boyunca bir çok sistem bağlanabilir. Her bir sistem ağa mesaj gönderebilir ve okuyabilir.

CAN Bus'a bağlantı için transreceiver yapılarına ihtiyaç duyulur. Mikrodenetleyiciler ile CANH, CANL hatları arasında aşağıdaki gibi transreceiver yapıları kullanılır. Mikrodenetleyiciler tarafında Rx, Tx hatları ile iletişim kurulur.

Aşağıda verilen görselde CANH, CANL hatlarındaki değişim ve bu değişimin CAN Rx ucundaki karşılığını gözlemleyebilirsiniz. CANH, CANL aynı seviyede iken CAN Rx 1'dir. Aksi durumda CAN Rx 0 olur. 0 değeri CAN Bus için baskın bit olarak ifade edilir.

Bir önceki görsel üzerinden CAN Bus mesajını inceleyecek olursak;

  • Start of frame: Bir CAN Bus mesajı 0 biti ile başlar.
  • ID-Arbitration: Takip eden bitler mesaj ID sini ifade eder. Mesaj ID'si aynı zamanda paketin önceliğini de ifade eder. Örneğin aynı anda iki sistem hatta veri basmak isterse CAN Bus'ın önceliklendirme yapısına göre değerlendirilir. Çok basitçe ifade etmek gerekirse Veri gönderimi başladığı anda bir mesajın ID'si ne kadar 0 ile başlarsa o kadar baskındır. Görseldeki sıraya göre "00001xx" ve "00100xx" başlayan iki mesaj paketi gelirken birinci paket önceliklendirilir ve ikinci paketi gönderen sistem gönderimi durdurur.
  • RTR: Remote transmission request olarak geçer. Bir mesaj paketini başka bir sistemden talep etmek için kullanılır.
  • Control: Bu kısımda mesaj ile ilgili ek bilgiler yer alır.
    • IDE: ID Extend olarak geçer. 1 olması durumunda 18 bitlik daha ID kısmı aktif olur. Mesaj paketi toplamda 29 bitle ifade edilir.
    • DLC: Data length code olarak geçer. Mesaj paketinin kaç byte olduğunu ifade eder.
  • Data: Veri aktarma kısmıdır. Kullanıcının iletmek istediği veri tam olarak buradadır.
  • CRC: Veri paketinin doğruluğunu teyit etmek için kullanılır.
  • ACK: Gönderilen paketin en azından bir sistem tarafından alındığını ifade eder. Bu kısım Herhangi bir alıcı sistem üzerinden sürülür. Eğer CAN Bus üzerinde başka bir sistem yoksa bu bit 0 olmaz ve gönderici mesajın iletilemediğini anlar.
  • End of frame: Mesaj paketi sonunda 7 bit 1 gönderilir.

16 Aralık 2023 Cumartesi

Batarya Test Düzeneği ve Meganit LR6 AA alkalin 1.5 Volt Pil Değerlendirmesi @250mA

Çeşitli veri toplama işleri için tasarladığım esdaq ve elektronik yük olarak kullandığım Pratic Load Bank kartlarını kullanarak batarya değerlendirmesi yapabilmek adına bir düzenek ve LabVIEW ortamında demo bir program oluşturdum. Demo programına buradaki link üzerinden erişebilirsiniz (Özel bir amaca tasarlanmadığı için düzen problemleri vardır). Kullandığım pil yuvası da 3D yazıcıdan çıkartılmış bir yuvadır. Düzeneğin bir görseli aşağıda verilmiştir.


Oluşturulan yapının şema gösterimi de aşağıda verilmiştir.


Bu çalışmadaki amaç bataryaların farklı durumlarda gösterdiği davranışı kayıt altına almak ve SoC, SoH gibi hesaplamalar için girdi vermeyi sağlayabilmek.

Öğrendiğim kadarıyla kalem pil diye adlandırdığımız AA boyutta 1.5 V piller 250 mA sabit akımda 0.8 V a kadar geldiği süre üzerinden standard kapasite ölçümü yapılır. Bu şekilde bakınca örneğin 250 mA sabit akıma ayarlanmış bir pil 10 saat boyunca 250 mA akımı sağlarsa 10*250 hesabı üzerinden 2500 mAh kapasiteye sabittir denir.

Aşağıda verilerini paylaştığım pil testinde sabit 250 mA akım altında yaklaşık 6 saatlik bir deney gerçekleştirilmiştir. Pil gerilimi ~6. saatte 800 mV a gelmiştir. Bu verilerin ışığında pilin kapasitesini 6 h*250 mA=1500 mAh olarak hesaplayabiliriz. Bu hesap çekilen akım değerine göre değişecektir. Örneğin testi 500 mA ile yaparsak kapasite <1500 mAh olacaktır. Test 100 mA ile gerçekleştirilirse de kapasite >1500 mAh olacaktır.



İlerleyen süreçlerde farklı pillerin farklı akım değerlerinde testlerini girmeye çalışacağım. Yine de belki işe yarar diye yaptığım testin tüm verisini ham olarak aşağıdaki link üzerinden paylaşıyorum.

Label order: Row ID | Time Stamp (Millisecond) | Voltage (mV) | Current (mA) | Set Current (mA)

Veri seti

12 Aralık 2023 Salı

STM32 Serisi İşlemcilerde Timer/Sayaç Modülünü Interrupt/Kesme Modunda Başlatma #STM32Tips

STM32F ve STM32G serisi mikrodenetleyicilerde Device Configurator Tool ve HAL kütüphanesi ile oluşturulan yazılımlarda timer modülleri için gereken ayarlar yapılır. Bu kapsamda timerların prescaler ve counter period gibi seçenekleri ayarlanır. Bunlarla beraber timer interruptları enable edilir.

Bu şekilde konfigürasyon yapıldıktan sonra kod oluşturulur.

Oluşturulan kodda timer başlatılmamış şekilde bir yapı kullanıcıya sunulur. İlgili timerları interrupt modunda başlatmak için aşağıdaki fonksiyon kullanılır. Bu fonksiyonda altı çizili htimX ilgili timerı ifade eder ve X yerine timer numarası yazılır.

HAL_TIM_Base_Start_IT ( &htimX );

Timerlar için yapılan konfigürasyona göre bu fonksiyonun çağrılma yapısı değişiklik gösterir. Auto-Reload edilmiş bir timer için bu fonksiyonu bir defa çalıştırmak yeterlidir.

Belli bir duruma göze özellikle tetiklenecek bir yapı var ise bu fonksiyon her tetiklemede tekrar çağrılır. Şart değil ancak bu modda genellikle auto-reload disable edilmiştir.



31 Mart 2023 Cuma

Pointer Kavramı | C

Pointer, bir değişkenin bellekteki adresini işaret eden bir C programlama dilindeki özel bir veri türüdür. Başka bir değişkenin bellekteki adresini işaret eden bir pointer tanımlamak, bellekteki verilere erişimi ve değiştirilmesini mümkün kılar. Bu, özellikle büyük ve karmaşık veri yapılarıyla çalışırken çok yararlı olabilir.

Örneğin, bir dizideki elemanları değiştirmek istiyorsak, her elemana ayrı ayrı erişmek zorunda kalmayız. Bunun yerine, dizinin ilk elemanının adresini işaret eden bir pointer kullanabiliriz. Bu şekilde, pointer aracılığıyla bellekteki diğer elemanlara erişebilir ve değiştirebiliriz.

Pointer'ın syntax'ı ise şu şekildedir:

Bu kod parçasında, "veri_tipi" pointer tarafından işaret edilen veri tipini belirtirken, "pointer_ismi" ise pointer'ın kendisi için bir isimdir. Örneğin, bir integer tipinde bir pointer tanımlamak istiyorsak şu şekilde yapabiliriz:


Bu kod parçasında, "ptr" bir integer tipinde bir pointer olarak tanımlanır. Bu pointer, bellekteki bir integer değişkenin adresini işaret edebilir. Pointer'lar, işaret ettikleri bellek adresindeki veriye erişmek için dereference (yıldız) operatörü (*) kullanılır. Bu işlem, pointer'ın adresini izleyen bellek bölgesindeki veriyi gösterir. Örneğin, şöyle bir kod yazabiliriz:

Bu kod parçasında, "x" adlı bir integer değişken tanımlarız ve değer olarak "10" veririz. Daha sonra, "ptr" adlı bir integer pointer tanımlarız ve "x" değişkeninin bellekteki adresini işaret ederiz. Son olarak, "printf" fonksiyonunu kullanarak "ptr" pointer'ının işaret ettiği bellek adresindeki veriyi yazdırırız. Bu durumda, "10" çıktısı verir. Pointer'lar, dinamik bellek yönetimi, fonksiyon parametre geçişi ve işaretçi aritmetiği gibi daha ileri seviye programlama konularında da çok önemlidir. Ancak, temel kullanımlarını anladıktan sonra, bu konulara geçmek daha kolay olacaktır.

Basit bir gösterin olarak aşağıdaki görseli ele alalım. Burada tanımlanan pointer belleğin 2047 numaralı adresindedir. Pointer içerisinde 1001 değerini tutar. Bu noktada bir "ptr" ifadesine "*" operatörü ile eriştiğimizde "*ptr" geri dönüş değeri olarak 50 değerine ulaşırız.



24 Ağustos 2022 Çarşamba

Unit Step Response (Birim Adım Cevabı)

Birim adım cevabı (step response), kontrol sistemlerinin dinamik performansını analiz etmek için önemli bir araçtır. Bu cevap, bir kontrol sistemi için birim adım girdisi (step input) uygulandığında, çıkışın nasıl davrandığını tanımlar. Birim adım girdisi, zamanda sıfır olan bir girdi sinyalidir ve zaman sıfırından sonra aniden bir değer alır. Bu nedenle, birim adım cevabı, kontrol sistemi çıkışının zamana bağlı olarak nasıl değiştiğini gösterir.

Birim adım cevabı, bir kontrol sistemi tasarlarken veya bir kontrol sistemi için performans değerlendirmesi yaparken çok önemlidir. Birim adım cevabı, kontrol sistemi çıkışının kararlılık, hız ve doğruluk gibi özelliklerini analiz etmek için kullanılır.

Birim adım cevabının analizi, bir dizi anahtar kelimeyi içerir. Bunlar arasında, kararlılık (stability), hız (speed), doğruluk (accuracy), yükselme zamanı (rise time), kararlı durum hatası (steady-state error), durulma süresi (settling time), aşım (overshoot) ve zirve zamanı (peak time) yer alır.

Kararlılık, bir kontrol sisteminin istikrarlı olup olmadığını ifade eder. Birim adım cevabı, bir kontrol sisteminin kararlılık özelliğini analiz etmek için kullanılır. Eğer birim adım cevabı kararlı bir çıkış sağlıyorsa, kontrol sistemi kararlıdır.

Hız, bir kontrol sisteminin ne kadar hızlı cevap verdiğini ifade eder. Birim adım cevabı, bir kontrol sisteminin hız özelliğini analiz etmek için kullanılır. Yükselme zamanı, bir kontrol sisteminin belirli bir yüzde değerindeki çıkışa ne kadar sürede ulaştığını ifade eder. Birim adım cevabı, yükselme zamanını belirlemek için kullanılır.

Doğruluk, bir kontrol sisteminin ne kadar doğru çalıştığını ifade eder. Birim adım cevabı, bir kontrol sisteminin doğruluk özelliğini analiz etmek için kullanılır. Kararlı durum hatası, bir kontrol sisteminin belirli bir yüzde değerindeki istenen çıkışa ulaşamama derecesini ifade eder. Birim adım cevabı, kararlı durum hatasını belirlemek için kullanılır.

Durulma süresi, bir kontrol sisteminin belirli bir yüzde değerindeki çıkışın istenen değere ulaşması için ne kadar süre gerektiğini ifade eder. Birim adım cevabı, durulma süresini belirlemek için kullanılır.

Aşım, bir kontrol sisteminin istenendeğerden fazla çıkmasıdır. Aşım, birim adım cevabı grafiği üzerinde zirve zamanı ve zirve değeri ile belirtilir.

Zirve zamanı, bir kontrol sistemi çıkışının en yüksek değere ne kadar sürede ulaştığını ifade eder. Birim adım cevabı grafiği üzerinde, zirve zamanı aşımın gerçekleştiği zamana denk gelir.

Birim adım cevabı, bir kontrol sistemi tasarlarken veya performansını değerlendirirken kullanılan bir araçtır. Birim adım girdisi uygulandığında, çıkışın nasıl değiştiğini gösterir ve kararlılık, hız ve doğruluk gibi özellikleri analiz etmek için kullanılır.

Kontrol sistemleri tasarımında ve performans analizinde kullanılan diğer anahtar kelimeler arasında frekans cevabı (frequency response), kök-ünite çevrimi (root locus), kutup-günüm gösterimi (pole-zero plot) ve Bode diyagramı yer alır.

Frekans cevabı, bir kontrol sistemi için girdiye verilen belirli bir frekansta çıkışın nasıl tepki verdiğini ifade eder. Frekans cevabı analizi, bir kontrol sisteminin frekans aralığında nasıl davrandığını analiz etmek için kullanılır.

Kök-ünite çevrimi, bir kontrol sisteminin kararlılık özelliğini analiz etmek için kullanılan bir yöntemdir. Kök-ünite çevrimi, köklerin (poles) ve kutupların (zeros) birim çember üzerinde nasıl yerleştiğini analiz eder.

Kutup-günüm gösterimi, bir kontrol sisteminin transfer fonksiyonunu kutuplar ve sıfırların yerlerini kullanarak gösteren bir yöntemdir. Kutup-günüm gösterimi, bir kontrol sisteminin kararlılık ve performans özelliklerini analiz etmek için kullanılır.

Bode diyagramı, bir kontrol sistemi için frekans cevabının bir grafiksel gösterimidir. Bode diyagramı, bir kontrol sisteminin frekans tepkisini analiz etmek için kullanılır.

Sonuç olarak, birim adım cevabı, kontrol sistemleri tasarımı ve performans analizinde önemli bir araçtır. Kararlılık, hız ve doğruluk gibi kontrol sistemleri özelliklerinin analizi için kullanılan bir dizi anahtar kelimeyi içerir. Frekans cevabı, kök-ünite çevrimi, kutup-günüm gösterimi ve Bode diyagramı gibi diğer yöntemler de kontrol sistemleri analizinde kullanılan önemli araçlardır.

İkinci dereceden bir sistemin birim adım cevabı aşağıdaki grafiğe benzer şekilde davranır. Bu grafik bir underdamped sisteme aittir. İkinci dereceden olan sistemler undamped, underdamped, critically dapmed ve overdamped şeklinde dört ayrı sınıfa ayrılabilir.



Bu grafikte işaretlenen ifadeler;
  • Max. Overshoot: Sistem çıkışının çıktığı maximum değer.
  • Rise Time: Sisteme step input uygulandıktan sonra, sistem çıkışının %10 dan %90 a kadar ulaşması için geçen süre. Burada ifade edilen yüzde değeri set pointi %100 kabul ederek hesaplanır.
  • Peak Time: Sisteme step input uygulandıktan sonra, sistemin max. overshoot noktasına ulaşma süresi.
  • Settling Time: Sisteme step input uygulandıktan sonra, sistemin set pointe +-%2 hata ile ulaşma süresi. %2 değeri genel kabuldur. Farklı bir değer de kabul edilebilir.
  • Steady State Error: Sistemin osilasyona girdiği, set pointe yakınsadığı alanda % kaç hata ile salındığını ifade eder. Örnek olarak sıcaklık 50 dereceye ayarlanmış olsun ve sistem çıkışı 45-55 derece arasında salınırsa steady state error +-%10 olarak ifade edilir.

Referanslar

  • https://lpsa.swarthmore.edu/Transient/TransInputs/TransStep.html
  • https://www.researchgate.net/figure/Unit-step-response-of-the-2nd-order-system_fig2_221347190

11 Ağustos 2022 Perşembe

Circular Buffer (Dairesel Buffer)

Gömülü sistemlerde veri toplama, kaydetme veya depolama için çeşitli veri yapıları kullanmak gerekir. Bu uygulamanın tipine göre farklılık gösterebilir. Özellikle gateway ve benzeri projelerde circular buffer tercih edilebilir. RAM kaynağı sınırlı olduğu için en verimli yöntem ile bu kaynağı kullanmak gerekir. FIFO, LIFO şeklinde davranış gösteren farklı veri yapıları vardır. Bu yazı, circular buffer nedir, nasıl çalışır, hangi durumlarda kullanılmalı gibi konular üzerine olacak.

Circular buffer adından da anlaşılacağı gibi hafızayı dairesel bir formatta kabul ederek/soyutlaştırarak hafıza alanını kullanmaya imkan sunan bir veri yapısıdır. Dairesel bufferın özelliklerinden biri veri yazma ile veri okuma indexlerinin bağımsız kontrolüdür. Tüm bufferın boyutu sabittir.

Görsel üzerindeki end()/item n yazma pointerını ifade eder. begin()/item 1 okuma pointerını ifade eder. Okuma ve yazma pointerları birbirine eşit olduğunda buffer empty flagi set olur. Bu bufferın tamamen boş olduğunu ifade eder. Yazma pointerı okuma pointerının bir eksiğine eşit olduğunda ise buffer full flagı set olur. Bu bufferın tamamen dolu olduğunu ifade eder. Bu yapının kullanıldığı yerin gereksinimlerine göre half full gibi farklı seviyeler için de flag tanımlanabilir.

Circular buffer rutin bir çalışma durumunda full durumuna gelmeyecek şekilde kurgulanmalıdır. Bunun için okuma hızı/sıklığı her zaman yazma okuma hızı/sıklığından daha yüksek olmalıdır. Böylece bufferda saklanan verinin belli bir değeri geçmeyeceği garanti edilir. Yine de beklenmedik durumlar ortaya çıkabilir. Bu durumlarda circular bufferlarda farklı stratejiler uygulanabilir. Birincisi üzerine yazma, ikincisi ise bloklama yaklaşımıdır.

Üzerine yazma yaklaşımında circular buffer full olsa bile yeni gelen veri bir sonraki yazma adresine yazılır. Bu durumda bir önceki data kayıp olmuş olur.

İkinci yöntem olan bloklama yaklaşımında da eğer circular buffer full ise yeni gelen veri olsa bile en sondaki veri okunmadan yeni bir yazmaya geçilmez.

Örnek bir repository olarak https://github.com/Roen-Ro/CircularBuffer incelenebilir.

Referanslar:

  1. https://www.boost.org/doc/libs/1_78_0/doc/html/circular_buffer.html

15 Temmuz 2022 Cuma

HAL Library Bir Milisaniyelik Sayaç #STM32Tips

STM32 HAL Library ile bir proje derlendiği zaman System tick timer üzerinden çalıştırılan, varsayılan olarak bir milisaniye çözünürlükte bir sayaç başlatır. Bu sayaç değerine HAL_GetTick fonksiyonu ile ulaşabiliriz. Bu fonksiyon 32 bit işaretsiz tamsayı (uint32_t) tipinde bir değer döndürür. Siz bu değeri yazdığınız programın herhangi bir yerinde zaman tutmak için kullanabilirsiniz.

Bu sayaç SysTick_Handler interruptı içerisinde HAL_IncTick fonksiyonu ile her bir interrupta girişte bir arttırılır. Sistem arka planda uwTick global değişkenini kullanır.

HAL_GetTick fonksiyonunun arka planda tuttuğu uwTick değişkeni 32 bitlik olduğu için 1 milisaniyede 1 artarak tam olarak 32 bitlik sayıyı doldurması 49,7 gün sürecektir. Bu süre, çok özel bir proje olmadığı sürece bir çok uygulama için zaman tutma, işlemleri sıralama, timeout tutma gibi işlemler için fazlası ile yeterlidir.

Örnek olarak ana döngü içerisinde bir veya bir kaç fonksiyonu periyodik olarak çalıştırmak istersek aşağıdaki gibi bir kod parçası işimizi görecektir. Aşağıda görünen kod parçası 1 saniyede 1 defa çalışır. 999 olan değer 99 olursa 100 milisaniyede bir çalışır.

if ( ( HAL_GetTick ( ) - timeStamp ) > 999 )
{
    timeStamp = HAL_GetTick ( );

    fnc1 ( );
    fnc2 ( );
}

Bu yapıda timeStamp = HAL_GetTick ( ); satırı if bloğunun başında olursa her 1 saniyede 1 defa bu koşul işletilir. Eğer bu ifade if bloğunun en sonuna konursa bu sefer fnc1 fonksiyonu 1 sn+fnc1+fnc2 kadar sürede bir tekrar çağrılır. Bu yaklaşım fonksiyon dallanmalarına göre değişkenlik göstereceği için tercih edilmez.

İkinci bir örnek olarak RTCsi olmayan bir işlemcide gerçek zaman bir haberleşme kanalı üzerinden alınır ve işlemci içerisindeki HAL_GetTick ( ); ile eşleştirilir. Böylece işlemci kapanıp açılana kadar işlemci kristali ile gerçek zamanı tutabilirsiniz.

Bu zaman referansı başka bir çok noktada işinize yarayabilir.



25 Haziran 2022 Cumartesi

STM32F Mikrodenetleyicilerinde İşlemci Benzersiz ID Değerini Okuma #STM32Tips

STM32F mikrodeneyleyicileri içerisinde 96 bit benzersiz bir ID vardır. Bu bilgi her bir işlemciye özeldir. Bu değer aşağıdaki üç fonksiyon ile okunur. Bu fonksiyonlar sırasıyla benzersiz ID'yi oluşturan 32 bitlik grupları bize verir.







23 Nisan 2022 Cumartesi

Gömülü Sistemlerde RAM Organizasyonu

Günümüzde gelişmiş işlemcilerde farklı tipte RAM organizasyonları bulunsa da genel ve yaygın olan yaklaşıma göre bu yazı hazırlanmıştır.

Gömülü sistemlerde RAM organizasyonunda 3 temel alan bulunur. Bunlar statik, stack ve heap alanlarıdır.

24 Ocak 2022 Pazartesi

C dilinde, İyi Yazılmış, Taşınabilir Bir Sensör Sürücü Paketi İncelemesi

Bu yazıda gömülü sistemlere düşük seviyede sürücü geliştiren kişilere referans niteliğinde olan, BOSCH'un  sıcaklık, nem ve basınç sensörü BME280 için geliştirdiği, github üzerinden yayınladığı açık kaynak kütüphaneyi [1] inceleyeceğiz. Başlıkta da belirttiğim gibi kütüphane gerçekten çok modüler bir şekilde oluşturulmuş. Geliştirilen kütüphane platform-bağımsız olduğu için herhangi bir altyapıya adapte edilebilir. Bu yapıyı herhangi bir mikrodenetleyicide veya OS ile çalışan bir gömülü yapıya entegre edebilirsiniz.



Kütüphane geliştirilirken low-coupling, high-coherence kavramlarını başarılı bir şekilde uygulamış. Kütüphane içerisinde herhangi bir dış bağımlılık olmadığı gibi kendi içerisindeki fonksiyon ve veri setleri de tam olarak amaca yöneliktir.

Öncelikle kütüphanenin güzel bir README.md dosyası var. İçerisinde bu kütüphanenin nasıl kullanılabileceği detaylı bir şekilde anlatılmıştır.

Bu yazıda, ilgili kütüphaneyi SPI üzerinden nasıl kendi sisteminize entegre edeceğinizi yine README.md deki örnek üzerinden ele alacağız.

Kütüphane bme280_dev structure'ı üzerinden çalışıyor. Bu yapı aşağıda verilmiştir.

Bu yapıda öncelikle ilgili sensörün hangi arayüz ile hangi modda kullanılacağı çeşitli değişkenlerle seçilir. Bu seçimler değişken isimleri ve gerekli yorumlarla desteklenmiş ve açık bir şekilde belirtilmiştir.

Bunun haricinde taşınabilirlik açısında bizim en çok işimize yarayan kısım fonksiyon pointer yapılarıdır. SPI örneği üzerinden devam edecek olursak bme280_dev yapısı içerisinde okuma yazma fonksiyonları için dev.read ve dev.write fonksiyon pointerlarına ilgili platforma ait SPI yazma okuma fonksiyonları atanır. SPI okuma ve yazma fonksiyonları kendi içerisinde CS operasyonunu gerçekleştirmelidir. Fonksiyonel olarak yazılmış sensör sürücüsü soyutlanmış okuma, yazma fonksiyonları üzerinden çalışır. Bu iki fonksiyona ek olarak kütüphane içerisinde kullanmak üzere 1 ms çözünürlüklü bir delay fonksiyonunun da pointerı structure'a atanır.

Bu noktada önemli bir parantez olarak ilgili fonksiyon pointerları mevcut altyapınızla birebir uyumlu olmayabilir. Hatta muhtemelen farklıdır. Bu noktada sizin altyapınız ile kütüphane arasına bir adaptör katmanı yazmanız gerekebilir. Örnek olarak aşağıdaki fonksiyon incelenebilir. myusleep fonksiyonu platform tabanlı bir fonksiyondur. Örnek olarak ms gecikmesi için STM32 altyapısında HAL_Delay fonksiyonunu düşünebilirsiniz. Arduino altyapısında buna delay fonksiyonu karşılık gelir. Biz her iki platformda da mevcut fonksiyonun adresini aşağıdaki gibi bir adaptör vasıtasıyla bme280_dev yapısına atanır. Böylece kütüphane fonksiyonları platform bağımsız çalışır.

Bu kütüphane kullanılarak oluşturulmuş tam bir örneğe aşağıdaki linkten erişebilirsiniz. En başta da ifade ettiğim gibi gömülü sistemlerde sürücü seviyesinde yazılım geliştiriyorsanız bu kütüphaneleri hiç bir zaman başka bir platformda kullanmayacaksanız bile bu yaklaşımla geliştirmenizi öneririm. Kodun okunabilirliği, güncellenebilirliği ve bakım yapılabilirşliği açısından da oldukça faydalı olacaktır.

https://github.com/BoschSensortec/BME280_driver/blob/master/examples/bsd_userspace.c

Referanslar

[1] https://github.com/BoschSensortec/BME280_driver/

5 Ekim 2021 Salı

Coupling ve Cohesion Kavramları

Yaızlım geliştirme süreçlerinde belli bir metedoloji veya tekniği takip etmediğiniz zaman işin sonunda veri yapıları ve fonksiyonların fazlaca birbirine girmesi kaçınılmaz bir durumdur. Özellikle OOP odaklı olmayan C gibi dillerde bu konu daha bariz şekilde kendini göstermektedir. C++ gibi OOP odaklı bir dilde mecburen de olsa bazı düzenlemeler doğal olarak kendiliğinden gelişiyor ancak C gibi dillerde özellikle planlanmadığı zaman gerçekten düzenli ve sistematik kod yazmak zor oluyor.

Bu yazıda, yazılımda genel kavramlardan olan coupling ve cohesion kavramları hakkında temel bilgileri paylaşacağım. Bu kavramları zihninizde canlandırmak için aşağıdaki görsel iyi bir örnektir. Burada birbirine benzer yapıların bir grup şeklinde durduğunu ve bu gruplar arası geçişlerin basit birkaç yol/arayüz vasıtası ile olduğunu görüyoruz.


Öncelikle coupling ve cohesion kavramlarının genel tanımını yapalım.

Coupling, modüller arasındaki karşılıklı bağımlılık derecesinin ölçüsüdür. Couplingin düşük olması kodun taşınabilirliğini arttırır. Platformlar arası geçiş rahatlıkla sağlanır.

İyi bir yazılımda bu ölçü düşük olmalıdır. [2]

Cohesion, modül öğelerinin işlevsel olarak ilişkili olma derecesinin bir ölçüsüdür. Bunu OOP bir dilde class olarak, C dilinde ise bir *.c ve *.h dosya çifti olarak düşünebilirsiniz. Tek bir görevi yerine getirmeye yönelik tüm unsurların bileşende yer alma derecesidir. Temel olarak cohesion, modülü bir arada tutan içsel ilişkidir. 

İyi bir yazılım tasarımı, yüksek bir bütünlüğe sahip olacaktır. 

Örnek olarak inputlara göre bir hesabı gerçekleştiren fonksiyon sadece o işi yapmalıdır. Bu fonksiyonun içerisine bir de print fonksiyonu eklemek veya gömülü yazılım tarafında kullanılan bir haberleşme protokolü üzerinden göndermek cohesion açısından olumsuz bir örnektir.

İkinci bir örnek verecek olursak, örneğin bir arayüz tasarımı yapıyorsanız ve arka planda çeşitli hesaplar yapılıyorsa bu hesaplar arayüz fonksiyonları içerisinde yer almamalıdır. Bu tarz hatalı kurulmuş düzenler uzun vadede yazılımı kontrol edilebilirlikten çıkartan etkenlerdir.

Referanslar:

[1] https://enterprisecraftsmanship.com/posts/cohesion-coupling-difference/
[2] https://www.geeksforgeeks.org/software-engineering-coupling-and-cohesion/
[3] https://stackoverflow.com/questions/3085285/difference-between-cohesion-and-coupling

CAN Bus Frame Tipleri

Yazıya başlamadan önce CAN Bus temelleri ve mesaj yapısının temellerini incelemek için bu linkte yer alan blog yazısını inceleyebilirisiniz ...