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

3 Ağustos 2022 Çarşamba

Otomotivde ECU Nedir?

Electronic Control Unit/Elektronik Kontrol Ünitesi (ECU) araçlar üzerindeki çeşitli görevleri/fonksiyonları gerçekleştirmek üzere geliştirilmiş sistemlerdir. ECU genel bir isimlendirmedir. VCU, BMS, BCM gibi ünitelerin elektronik kontrol birimleri de ECU olarak anılır.

Araç üzerindeki ECU'lar görevlerine göre farklı tip, özellik ve boyutlarda olabilir. Örneğin bir VCU genel olarak yatay ve ince bir metal yuvaya sığarken, EDS/MCU/Inverter gibi güç süren sistemler daha hacimli ve geniş soğutucu bloklu yuvalara ihtiyaç duyar.

Örnek Bir VCU Görseli


Örnek Bir EDS/MCU/Inverter Görseli


Günümüzde araçlar 100 civarında farklı ECU içerebilir. Örneğin 4 kapı camı elektrikli bir araçta sadece bu camların aç/kapa fonksiyonundan sorumlu 4 farklı motor ve bu motorları süren ECU'lar vardır. Bu ECU'lar tek bir ana fonksiyonu (cam aç/kapat) gerçekleştirse bile araç networkü ile haberleşen akıllı sistemlerdir. Araç networkü üzerinde bir fonksiyon bir veya birden fazla elemanın entegrasyonu ile gerçekleşebilir. İlgili sistemler her zaman birbiri ile konuşarak senkron bir şekilde çalışacak topolojide tasarlanır.

Her ECU genel olarak kendisinden sorumlu bir işlemci barındırır. Bu işlemciler çoğunlukla otomotiv sektörü için özelleşmiş, kendi üzerinde 12 V regülatörü, haberleşme alıcı/vericileri gibi önemli yapıları entegre edilmiş bir şekilde barındırırlar. Böylece birim maliyet, yer kaplama, hata yapma gibi konularda avantaj sağlanır.

Referanslar:

  1.  https://www.aptiv.com/en/insights/article/what-is-an-electronic-control-unit
  2. https://www.bosch-mobility-solutions.com/en/solutions/vehicle-computer/vehicle-control-unit/
  3. https://automotivepowertraintechnologyinternational.com/news/electric-powertrain-technologies/mclaren-applied-targets-automotive-with-800v-sic-inverter.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.



26 Haziran 2022 Pazar

Kapasitör Dolum Eğrisi ve Ölçüm Metodu

Kondansatör (capacitor) üzerinde elektrik depolayabilen bir pasif elektronik elemandır. Kondansatörün kapasite değeri Farad birimi üzerinden değerlendirilir.

Kondansatörün dolum eğrisi aşağıdaki gibidir. Kontansatör herhangi bir t anında bir R1 direnci üzerinden enerjilendirildiğinde (step input) üzerindeki voltaj değişimi Vout gibi davranır. Vout'un herhangi bir andaki değerini hesaplamak için aşağıdaki görselde verilen ilk formül kullanılır. Bu formülde belli bir zamandaki voltajı hesaplarken Vin, e, R, C ve t sait olacağı için ilgili zamandaki voltaj değeri bulunabilir.

Aynı formülde t ifadesini çekerek kutu içerisindeki ifade elde edilir. Bu ifade bize şunu söyler. R, Vin sabit ve Vout belirlenen bir değer ise, dolum eğrisinin Vout değerine ne kadar sürede geldiğini ölçebilirsek gömülü bir sistem üzerinde kapasitör ölçümü yapılabilir. Vout değeri Vin/2 veya Vin/e seçilebilir. Çok yüksek veya düşük Vin değerleri ölçüm açısından sağlıklı olmayabilir.


Osiloskop üzerinden alınmış bir kapasitör dolum görseli aşağıdaki gibidir. Bu görselde;

  • Sarı: Kapasitör dolumunu tetikleyen sinyal.
  • Turkuaz: Kapasitör dolum voltaj grafiği.
  • Pembe: Kapasitör ile 1.65 V luk sabit bir değer üzerinden kurulan karşılaştırıcı devresinin çıkışı.
Algoritma tarafında tetikleme sinyalini verdikten sonra karşılaştırıcının düşen kenarına kadar geçen süre bize kapasitör değerini hesaplamak için gereken zaman bilgisini verir. Aşağıda görseli verilen testte R=1kOhm, C=470nF seçilmiştir. Bu durumda kapasitör voltajının 1.65 V'a gelmesi 325us sürecektir. Aynı süreyi osiloskop görselinden de görebilirsiniz. (Cursorlar ile işaretlememek eksiklik olmuş)


Son söz olarak, kondansatör ölçümü için daha farklı ölçüm yöntemleri de mevcuttur. Bu yöntemlere örnek olarak kondansatörlere belirli frekans değerlerinde sinyal uygulanır. Bu sinyallerin değişimi üzerinden kondansatör değerine karar verilir. Ölçüm yöntemlerinin tamamında zaman tabanlı işlemler olduğu için kondansatör ölçümü zamana bağımlıdır ve direnç ölçümüne nispeten uzun sürer.

Kaynaklar:

  • https://www.elektrikde.com/kondansator-ve-cesitleri-nelerdir/

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.







STM32 HAL Kütüphanesinde Başlangıçtan Sonra IO Pinin Yönünü/Direction Değiştirme #STM32Tips

STM32 HAL kütüphanesinde, başlangıç sonrasında bir GPIO pininin yönünü kolayca değiştirebilecek bir fonksiyon doğrudan sağlanmamaktadır. Bu ...