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

24 Ağustos 2022 Çarşamba

Unit Step Response Grafiği Hakkında (Birim Adım Cevabı)

Bir sistemin unit step cevabı, ilgili sistemin girişine unit step fonksiyonu uygulandığında, sistem çıkışının davranışını ifade eder. Unit step fonksiyonu ise kısaca, t=0 anına kadar 0, t>=0 için 1 şeklinde kabul edilir.  


Bir sistemin unit step cevabı bize sistem ile ilgili bir çok bilgi verir. Bu bilgiler üzerinden sistem tanımlama yapılabileceği gibi sistemi kontrol etmek için nasıl bir kontrolcü gerektiği konusunda da fikir edinilebilir.

İkinci dereceden bir sistemin unit step 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

7 Nisan 2021 Çarşamba

ADC Nedir? Analog to Digital Çevrim İşleminde Karşılaşılan Hatalar Nelerdir?

 ADC (Analog-to-digital converter, Analogtan Dijitale Çevirici) analog verileri dijital verilere çeviren çevre birimleridir. ADC yapıları gerçek dünyadan dijital dünyaya veri almanın en bilinen yöntemidir. ADC yapıları sinyalleri tanımlanmış zaman aralıklarında alır ve ADC çözünürlüğü ölçüsünde quantize eder. Böylece ADC yapıları, dijital hesaplamalar için zamanda ve genlikte quantalanmış/ayrılmış veriler sağlar.



ADC işlemine örnek olarak ses verisinin dijitale çevrilmesi verilebilir. Ses sinyali ile mikrofon üzerindeki gerilim değişir. Bu gerilim değeri ADC tarafından okunarak ses sinyali dijitalleştirilmiş olur. İşlemciler üzerinde bu dijital veri işlenerek anlamlı bir bilgiye çevrilir.


ADC farklı tiplerde tasarlanabilir. Mikrodenetleyicilerde en yaygın kullanılan ADC tipleri SAR ve ΔΣ ADC tipleridir.

Farklı ADC çözünürlük ve ölçüm frekanslarına ait tablo aşağıdaki gibidir.ADC'nin çözünürlüğü Vcc/(2^bit) formülü ile bulunur. Örneğin 5 V ile çalışan 12 bitlik bir ADC'nin çözünürlüğü;

5 V/(2^12) = 5 V/4096 = 1,22 mV'dur.

Kısa bilgi olarak ADC'nin tersi yönde çalışan DAC yapıları da vardır. DAC yapıları işlemciler içerisindeki dijital verilerin analog verilere döndürülmesi için kullanılır. Bu iki yönlü dönüşüm aşağıdaki görselde verilmiştir.

ADC Hata Tipleri

ADC ölçümlerinde, ölçüm yapılan ADC yapısına göre çeşitli hata tipleri oluşabilir. Bu hatalar 3 ana başlıkta toplanabilir.

Doğrusallık Hatası

İdeal durumda ADC'nin normalde gerilime göre oransal bir çıkış vermesi gerekir. ADC'nin iç yapısına ve çevresel etkilere göre ADC üzerinde farklı aralıklarda farklı oranlar ortaya çıkabilir. Bu durumda doğrusallık hatası ortaya çıkar. Bu etkinin grafiksel gösterimi aşağıdaki gibidir.

Kazanç Hatası

ADC üzerinde kazanca bağlı değişen bir kazanç hatası ortaya çıkabilir. Bu ADC'nin o anki değerine göre oransal olarak artan bir hata tipidir. Bu durumda kazanç hatası ortaya çıkar. Bu etkinin grafiksel gösterimi aşağıdaki gibidir. Bunu kompanze etmek için ADC ölçümü bir katsayı ile çarpılabilir.

Dengeleme Hatası

ADC üzerinde belli bir dengeleme/ofset hatası ortaya çıkabilir. Bu ADC'nin herhangi bir andaki değerine göre sabit bir değer ekler. Bu durumda dengeleme hatası ortaya çıkar. Bu etkinin grafiksel gösterimi aşağıdaki gibidir. Bunu kompanze etmek için ADC değerine belli bir sabit değer eklenebilir.

Referanslar:

[1] https://en.wikipedia.org/wiki/Analog-to-digital_converter

11 Mart 2021 Perşembe

Varyans, Standard Sapma, Kovaryans, Korelasyon Kavramları

 Çeşitli istatistik hesaplamalara dair aldığım notlar aşağıdaki gibidir. Bu fonksiyonların bir kısmının C dilinde gerçeklenmiş halleri de https://github.com/enginsubasi/esclib/blob/master/src/math/statistic.c adresindedir.



6 Şubat 2021 Cumartesi

Accuracy, Precision & Resolution Kavramları (Doğruluk, Hassasiyet, Çözünürlük)

Accuracy, Precision ve Resolution kavramları ölçüm sistemlerinde sıklıkla karşımıza çıkan ifadelerdendir. Aynı zamanda bu sistemler için kullanılan sensörlerde de benzer ifadelere rastlayabilirsiniz.

[1]


Bir ölçüm sisteminin performansı sistemin aynı şartlarda aynı sonucu vermesi ile ölçülebilir. Bu durumu başlıkta yer alan kavramlarla açıklayabiliriz.

Accuracy, doğru ölçüme ne kadar yakın olduğunuzu ifade eder.

Precision, arka arkaya alınan ölçümlerde ne kadar tutarlı olduğunu, aynı veya yakın değeri verdiğini ifade eder.

Resolution, ölçümün adım aralığıdır. Örnek olarak 3.3V bir sistemde 12 bit ölçüm alacaksanız çözünürlüğünüz (3.3/4095)V kadardır.

Bu kavramların anlatımını güçlendirmek için aşağıdaki görsel oldukça faydalıdır. Görselde hedefin orta noktası olması gereken ölçüm değeridir. Etrafındaki yıldızlar ise ölçüm değerleridir. Bu 4 görseli sınıflandıracak olursak;

  • Sol Üst: Yüksek accuracy, düşük precision. (Tolere edilebilir)
  • Sağ Üst: Yüksek accuracy, yüksek precision. (En iyi durum)
  • Sol Alt: Düşük accuracy, düşük precision. (En kötü durum)
  • Sağ Alt: Düşük accuracy, yüksek precision. (Tolere edilebilir)



Biz tasarladığımız ölçüm sistemlerinde yüksek accuracy ve precision bekleriz. Bu ölçüm sistemimizin performansını yüksek seviyede tutmamızı sağlar ancak bunun mümkün olmadığı durumlarda çeşitli tolerans metotları geliştirmek gerekir. Çünkü geliştirilecek uygulamaya uygun ölçüm sistemini tasarlamak için fiyat/performans kriterinden dolayı en iyi durumu oluşturacağınız sistemi oluşturamayabilirsiniz.

Bu durumda accuracy durumunu tolere etmek için sistem karakteristiğine uygun bir offset değeri veya dinamik bir sistem için offset fonksiyonu oluşturulur. Böylece ölçüm istenilen noktaya çekilebilir.

Precision konusunda bir iyileştirme yapmak için de dijital ve analog filtreler yardımı ile bu kriter arttırılabilir.

Resolution değeri sistemin karakteristiği ile direkt ilgilidir ve üzerinde herhangi bir işlem yapamayız. Precision iyileştirme için yapılacak filtreleme fonksiyonları resolutiondan oluşacak kayıpları da bir ölçüde iyileştirebilir.

Referanslar:
[1] https://keydifferences.com/difference-between-accuracy-and-precision.html

6 Ocak 2021 Çarşamba

Lineer/Proportional/Oransal Çıkışlı Bir Analog Sensörün Okunması, Sensör Okuma ile ilgili Temel Mantıklar

 Sensör verilerinin okunması ve anlamlandırılması kontrol sistemleri için en temel girdiyi oluşturur. Sensör bilgileri, sensörün tipine, iç yapısına, ölçtüğü fiziksel niteliğin davranışına göre farklılık gösterebilir. Sensör çıkışları lineer veya bir polinoma bağlı olabilir.

Bu yazı kapsamında lineer çıkışlı sensörler hakkında detaylı bir açıklama yaptıktan sonra polinomsal çıkışlı bir sensör hakkında da kısa bir yorum yapıp bitireceğim.

Lineer çıkışlı analog bir sensöre örnek olarak SS495B ve LM35 üzerinden ilerleyeceğiz. Aşağıda gördüğünüz görselde SS495B'nin gauss/çıkış voltaj grafiği verilmiştir. Bu sensörün ölçüm yaptığı fiziksel nitelik ile çıkış voltajının lineer olduğu grafikten bellidir. Çıkış gerilimi gauss değerine göre lineer olarak artıp azalır.

SS495B Çıkış Karakteristiği
Bu şekilde çıkış veren sensörler çok basit bir matematiksel formülle tanımlanır. ADC değerini okuyup voltaja çevirdikten sonra, gerilim değerinden ilgili fiziksel değere geçilir. Bu örnekte o değer gauss'tur.

Grafikten görüldüğü gibi sensör 0.5V-4.5V arasıda tanımlıdır. Aralık dışıda bir değer okunması halinde uygulamanın çeşidine göre bir senaryo planlanır. Bu aralıkta da direkt bir eğik doğru formülü ile tanımlanır. Bu formül;

Gauss = ( Vout - 2.5 ) * ( 640 / 4.5 )

şeklindedir. Bu formüldeki ( 640 / 4.5 ) ifadesi grafiğin eğimidir. Bu değer sayısal olarak sadeleştirilip sadece bir çarpım ifadesi şeklinde de yazılabilir.

LM35 sensörü de sıcaklığa bağlı lineer çıkış veren bir sensördür. Bu sensörün datasheetinde çıkış aşağıdaki şekilde ifade edilmiştir. Sensör 2°C-150°C aralığında her bir derece için 10mV çıkış verir.
LM35 Çıkış Karakteristiği

Bu bilgilerden hareketle bu sensörün çıkışını santigrat derece şeklinde ifade etmek için aşağıdaki formül kullanılır.

Temperature = 2 + ( Vout / 0.01 ) = 2 + ( Vout * 100 )

İki ayrı sensör değerinin nasıl dijital veriye çevrildiğini bu iki örnekle özetlemiş olduk. Bir de polinomsal çıkış veren sensörler vardır. Bunlar için en yaygın örnekler NTC tipi sıcaklık sensörleri olabilir. Bu sensörlerin direnç değerleri sıcaklığa bağlı değişir ve en basit şekilde başka bir direnç ile seri bağlanarak orta noktanın gerilimi üzerinden bir dönüşüm yapılır. Burada ilk olarak basit gerilim bölücü mantığından sıcaklık sensörünün direnç değeri bulunur ve bu direnç değeri -nispeten- kopleks bir matematik denkleminden geçerek sıcaklık elde edilir. Bu denklem "Steinhart and Hart Equation" olarak adlandırılır. Burada yer alan A, B ve C sabitleri ilgili sensörün datasheetinde verilir. R değeri ise NTC'nin o anki direnç değeridir.


Bir NTC'nin direnç değerinin sıcaklığa bağlı değişimini gösteren grafikte aşağıdaki gibidir. Grafikte görünen PTC, NTC ile ters çalışan ama aynı amaçla kullanılan bir sensör türüdür.




Bu yazı kapsamında sensör okuma ve okunan değerleri fiziksel değere çevirme hakkında genel bilgiler vermeye çalıştım. Umarım faydalı olur. Çalışmalarınızda başarılar.



7 Aralık 2020 Pazartesi

Cooperative Multitasking

 Bu yazıda cooperative multitasking (CM olarak anılacak) kavramı üzerine bildiklerimi ve gömülü sistemler üzerinde bu yapıya benzer bir çalışma metodolojisi ile nasıl geliştirme yaptığımdan bahsedeceğim.

CM kavramı non-preemptive multitasking olarakta bilinir. Temel olarak görevi taskları sıralı bir şekilde işletmektir. Bilinen modern multitasking yapılarından farkı ise önceliğe göre aktif bir task switching yapmamasıdır. CM yapısında, işlemci aynı anda bir task ile ilgilenir ve o task tamamlanana kadar diğer taskların çalışmasına izin vermez. Bu yapı Windows 3.1x'te kullanılmıştır.[1]

CM yapısı ile çalışacak bir sistemde taskların zamanları önemlidir. Bu yüzden yazılacak taskların süreleri ve gereksinim durumu iyi analiz edilmelidir. Vakit alan bir task önemli bir taskı engellerse bu sistemi verimsiz/anlamsız/zararlı hale getirebilir.

CM kavramını görselleştirmek için aşağıdaki görseli kullanalım. Burada örnek olarak Task A 20ms de bir çalışır ve task aktif olduktan sonra 3 ms boyunca iş yapar. Diğer tasklarda da benzer şekilde çalışma periyotları ve çalışma süreleri tanımlanmıştır.

İlk ve en basit kural çalışma süresi, çalışma periyodundan büyük olmalıdır. Bu ikisi arasındaki fark ne kadar yüksek olursa ilgili taskın işlemciye yükü o kadar düşük olur.



Görselde CM metodu içe çalışan bir yapı verilmiş ve Task A, B, C tanımlanmıştır. Her bir taskın çalışma sürelerine göre işlemler grafikteki gibi verilir. Burada zamanları tek tek inceleyeceğiz.
  • @10. ms Task C çalışır ve 11. ms'de biter.
  • @15. ms Task B çalışır ve 17. ms'de biter.
  • @20. ms Task A çalışır ve 23. ms'de biter. Bu esnada Task A'nın da çalışma periyodu gelir ancak Task A bitmediği için sırasını bekler. Task A biter bitmez 23. ms'de Task C başlar. 24. ms'de biter. Bu kaymadan dolayı Task C'nin bir sonraki başlama zamanı kayar ve Task C 33. ms'de çalışır.
  • @30. ms Task B çalışır ve 32. ms'de biter.
  • @33. ms Task C çalışır ve 34. ms'de biter.
  • @40. ms Task A çalışır ve 43. ms'de biter.
  • @43. ms Task C çalışır ve 44. ms'de biter.
  • @45. ms Task B çalışır ve 47. ms'de biter.
Bu yapıda en önemli konu 20. ms'de yaşanan kaymaların olabileceğidir. Bu yüzden doğru bir düzen içerisinde tasarlanmalıdır. Çok daha uzun sürecek tasklar da olabilir. Bu durumda diğer taskların kritik görevlerinin olmaması önemlidir.

Bu yapıyı kurarken genelde tüm tasklar tek bir zaman sayacı üzerine kurulur ve ilgili zaman sayacını referans alark her bir task çalışma başlangıcını belirler.

Gömülü sistemlerde çalışırken, RTOS kullanmadan geliştirilecek uygulamlarda oldukça faydalı bir yöntemdir. RTOS'lara göre eksik kaldığı bir nokta normalde delay koyarak geliştirilebilecek basit akış diyagramlarını oluşturmak için switch case yapılarının gerekmesi olabilir ancak alışkanlık sağladığınızda fazlasıyla kolaylık sağlayacaktır.

Bu yazı kapsamında interruptsız bir program üzerine konuyu anlattım. Ek ve özet bilgi olarak bu yapılar çalışırken çalıştıracağınız interruptlar ile de tam gerçek zamanlı tasklar çalıştırabilirsiniz. Kurgulanacak bu yapıda yukarıda verilen tasklar interruptlar tarafından bölünür ve sizin hem interrupt yapınız hem de ana döngü yapınız sağlıklı bir şekilde çalışabilir.

Ana döngü içerisinde yavaş toplanacak veriler, haberleşme değerlendirme algoritmaları, dosya okuma/yazma yapıları vs. geliştirilebilir. Interruptlar içerisinde ise hızlı tepki verilmesi gereken giriş/çıkış yapıları, kontrol algoritmaları, periyoda bağımlı algoritmalar vs. çalıştırılabilir.

Umarım faydalı olur.

Referanslar

[1]. https://en.wikipedia.org/wiki/Cooperative_multitasking

30 Temmuz 2020 Perşembe

RS-232, RS-485, RS-422 Nedir? Temel Kavramlar, Açıklamalar ve Karşılaştırmalar

Bir haberleşme yapısı farklı seviyede katmanlardan oluşur. Bu yazıda bahsedeceğim RS-232, RS-485 ve RS-422 katmanları fiziksel katman seviyesinde çalışırlar. Fiziksel katman haberleşme yapılarının en alt noktasıdır.

Aşağıdaki görsellerde haberleşme yapılarının yüksek seviyeden düşük seviyeye giden genel yapısı verilmiştir. İlk görsel genel bir gösterimdir. İkinci görselde ise RS-232 ve RS-485 özelinde fiziksel katmandan uygulama katmanına giden yapı gösterilmiştir. Transfer edilecek veriye her bir katmanda çeşitli eklemeler yapılır. Bunun yapılıp yapılmayacağı ve boyutu yapıya göre değişkenlik gösterir.




Giriş


İlgili standartlar mikrodenetleyici tarafındaki seri haberleşme (Genellikle UART olarka anılır.) yapısını dış dünyaya açabilmek için kullanılır. Pratikte verinin cihaz veya sistem dışına, daha uzun mesafelere gönderilmesi için kullanılır. Bununla birlikte UART birimi alıcı-verici çifti ile iki yapı arası haberleşmeye imkan sağlar. RS-485, RS-422 gibi yapılarda çoklu haberleşme topolojileri kurulabilir.

RS-232 genellikle iki cihaz arası kısa haberleşmelerde tercih edilir.

RS-485 ve RS-422 üzerine bir çok endüstriyel haberleşme standardı inşa edilmiştir. Özellikle RS-485 yüksek hız ve sadece 2 kablo gereksinimi dolayısı ile bir çok sektör ve alanda tercih edilir. MODBUS, Profibus, BACnet gibi otomasyon standardları fiziksel katmanda RS-485'i kullanır.

RS-232


  • Single-ended. Veri GND referansına göre gönderilir.
  • RX, TX ve GND bağlantıları ile haberleşir. Hat üzerinde 2 cihaz olabilir.
  • Azami uzunluk: 15 Metre 19.2 kbps
  • Azami hız: 1 MBPS 15 Metre

RS-485


  • Differential. Veri AB arasındaki voltaj farkına göre iletilir. GND gereksinimi duymaz.
  • AB hattı üzerinden 32 alıcı/verici cihazı destekler. Bu değer kullanılan transreceiver ve sonlandırma direncine göre farklılıklar gösterebilir.
  • Azami uzunluk:1.2 KM 100 kbps
  • Azami hız: 10 MBPS 15 Metre


RS-422


  • Differential. Veri AB arasındaki voltaj farkına göre iletilir. GND gereksinimi duymaz.
  • RX+,RX-,TX+,TX- hatları üzerinden 1 gönderici 10 adet alıcıya kadar destekler.
  • Azami uzunluk:1.2 KM 100 kbps
  • Azami hız: 10 MBPS 15 Metre


Teknik Karşılaştırma Tablosu






Görsel Kaynakları:
  • https://www.omega.com/en-us/resources/rs422-rs485-rs232
  • https://iebmedia.com/ethernet.php?id=4582&parentid=74&themeid=255&hft=23&showdetail=true&bb=1
  • https://hvac-talk.com/vbb/attachment.php?attachmentid=643921&d=1447971918
  • http://www.rs485.com/rs485spec.html
  • ti.com

I2C Nedir?

Giriş


Inter-Integrated Circuit (Entegre Devreler Arası Haberleşme) genel olarak devre üzeri haberleşme yapılarında kullanılır. Sensör, işlemciler arası haberleşme veya çeşitli haberleşme arayüz entegreleri ile I2C hattı üzerinden iletişim kurulabilir. Bir master birden fazla slavein bulunduğu hattı sürebilir. Böylece master tarafında 2 pin ile bir çok çevresel birim kontrol edilebilir. Bununla birlikte tasarlanacak topolojiye göre aynı hatta birden çok master da bulunabilir.

Kıyaslayacak olursak genelde alternatifi olarak görülen SPI’a göre yavaştır. Daha az pin kullandığı için avantajlıdır. Düşük hızlarda yönetilecek çevre birimleri için mikrodenetleyicinin pin kullanımını optimize etmek için idealdir.

Örnek bağlantı yapısı aşağıdaki gibidir.


Temeller


Temel yapı olarak birimler arasında I2C hattı SDA ve SCL pinlerinden oluşur. Her iki pin normalde HIGH konumundadır. SDA Data hattının LOW a düşmesi ile haberleşme hattı iletime başlar. Yapılar SCL clock sinyali ile senkron olarak çalışır.
  • SDA: Data. Verinin o anki yönüne göre Master’dan Slave’e veya tam tersi olabilir.
  • SCL: Clock. Her zaman Master’dan Slave’lere doğrudur.


I2C hattı ile birlikte hat üzerindeki çiplerin de -özel bir izolasyon vs. yoksa- ground hatları birleştirilmelidir.

SCL sinyaline göre öncelikle masterdan hatta konuşacağı enterenin adres bilgisi ve yazma/okuma modu hatta basılır. Sonrasında ilgili çiptemn gelecek acknowlage sinyaline göre haberleşme devam ettirilir.Konuşulacak entegrenin I2C protokol yapısına göre haberleşme half duplex olarak devam eder.



I2C hattında hız değerine göre genellikle 2.2KR-10KR aralığında pull-up direnç kullanılır. Bu değere, kullanılan işlemci ve entegrelerin datasheet dokümanlarında verilen bilgilere göre karar verilir.


Kavramlar


  • Master: I2C hattını süren ana yapıdır. Genellikle miroişlemci/mikrodenetleyicidir.
  • Slave: I2C hattında bulunan slave entegrelerdir. Bir çok alternatif IC vardır. EEPROM, DAC, ADC, sensör, ekran sürücü, motor sürücü gibi çevre birimleri, CAN, Ethernet, Wifi gibi haberleşme arayüzü sağlayan entegreler I2C hattı ile çalıştırılır.
  • Başlatma Koşulu: SCL hattı HIGH’dan LOW’a geçmeden önce SDA hattı HIGH’dan LOW’a geçer.
  • Durdurma Koşulu: SCL hattı LOW’dan HIGH’a değiştikten sonra SDA hattı LOW’dan HIGH’a geçer.
  • Adres Paketi: Her bir SLAVE’e özgü, MASTER ile konuşmak istediğinde SLAVE’i tanımlayan 7 veya 10 bitlik bir veri.
  • Okuma / Yazma Biti: MASTER’ın SLAVE’e (LOW) veri gönderip göndermediğini veya ondan veri istediğini (HIGH) belirten tek bir bit.
  • ACK / NACK Bit: Mesajdaki her byteı bir onaylama/onaylama biti izler. Bir adres paketi veya veri paketi başarıyla alındıysa, alıcı cihazdan gönderene bir ACK biti döndürülür.



Görsel Kaynakları:
  • https://en.wikipedia.org/wiki/I%C2%B2C
  • https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/

SPI Nedir?

Giriş


Serial Peripheral Interface (Seri Çevresel Arayüz) genel olarak devre üzeri haberleşme yapılarında kullanılır. Sensör, işlemciler arası haberleşme veya çeşitli haberleşme arayüz entegreleri ile SPI hattı üzerinden iletişim kurulabilir.

Temeller


Temel yapı olarak birimler arasında SPI hattı MOSI, MISO, SCK ve CS pininden oluşur. Full duplex olan bir haberleşmede pinler aşağıdaki gibi tanımlanır. SPI hattı bir master tarafından sürülür ve aynı hatta birden fazla slave olabilir. Her bir slave e özel CS pini bulunur. Bu koşulda master tarafında harcanan pin sayısı 3+(hattaki chip sayısı) kadardır. CS hattı genelde LOW aktiftir ancak bazı entegrelerde HIGH aktif CS olabilir.

  • MOSI: Master Out Serial Input. Veri akışı Master’dan Slave’e doğrudur.
  • MISO: Master Input Serial Output. Veri akışı Slave’den Master’a doğrudur.
  • CLK: Clock. Her zaman Master’dan Slave’lere doğrudur.
  • CS veya SS: Chip select. Her zaman Master’dan Slave’e doğrudur.



SPI hattı ile birlikte hat üzerindeki çiplerin de -özel bir izolasyon vs. yoksa- ground hatları birleştirilmelidir.

SPI’ın genel veri/frame yapısı aşağıdaki gibidir. Her bir clock darbesi ile bir bit veri transferi gerçekleşir. SPI yapısı senkron bir yapısı olduğu için megabit seviyesinde sorunsuz haberleşme imkanı sağlar. Bazı durumlarda, genellikle slave datasheetlerine göre pull-up direnç kullanmak gerekebilir. Pull-up dirençler sinyal zamanlamalarının doğru bir şekilde çalışmasını sağlar.



Kavramlar


  • Master: SPI hattını süren ana yapıdır. Genellikle miroişlemci/mikrodenetleyicidir.
  • Slave: SPI hattında bulunan slave entegrelerdir. Bir çok alternatif IC vardır. EEPROM, DAC, ADC, sensör, ekran sürücü, motor sürücü gibi çevre birimleri, CAN, Ethernet, Wifi gibi haberleşme arayüzü sağlayan entegreler SPI hattı ile çalıştırılır.


Görsel Kaynakları:
  • https://www.allaboutcircuits.com/technical-articles/spi-serial-peripheral-interface/
  • https://tr.wikipedia.org/wiki/Serial_Peripheral_Interface

UART Nedir?

Giriş


Universal Asynchronous Receiver Transmitter (Evrensel Asenkron Alıcı/Verici) kelimelerinin baş harflerinden oluşur. Adından anlaşılabileceği gibi iki ayrı birim arasında asenkron olarak gerçekleştirilen haberleşme protokolüdür. Temel prensip olarak iki tarafın haberleşme hızını bildikleri, başlangıcı, sonu belli haberleşme yapısıdır. Arada senkronlayıcı bir sinyal olmadığı için asenkron olarak isimlendirilir. Mikrodenetleyiciler veya mikroişlemciler üzerinde gerçekleştirilen uygulamalarda sıklıkla kullanılır. Arduino gibi low-level veya Raspberry Pi gibi high-level geliştirme kartlarında muhakkak karşınıza çıkar. Anlaması, uygulaması ve geliştirilmesi basit bir yapı olduğu için bir çok uygulamanın ve sistemin temelini oluşturur. Devre içi haberleşmede kullanıldığı gibi uzak mesafelere kablolu iletimde de temeli oluşturur. RS232, RS485, RS422 gibi fiziksel katmanlara da imkan verdiği için otomasyon, kontrol, ve robotik gibi bir çok alanda kullanımı vardır. Bu katmanlar ile veri kilometrelerce uzağa iletilebilir ve bir hat üzerine ikiden fazla cihaz bağlanabilir.


Temeller


Temel yapı olarak iki birim arasında Rx ve Tx çiftineden oluşur. Karşılıklı veri alış-verişi yapabilmek için RxTx çifti TxRx çifti ile eşleşerek çalışır. Full-duplex bir UART yapısında Rx, Tx bağımsız birer modül gibi çalışır.

Aşağıdaki gibi ara bir fiziksel bağlantı olmadan direkt UART haberleşmesi kullanılacaksa ground lar birleştirilmelidir. Veri Tx hattından Rx’e gider. Pinler fiziksel olarak Tx çıkış, Rx giriş modundadır.


UART’ın genel veri/frame yapısı aşağıdaki gibidir. Tx pini normal durumda HIGH konumunda bekler. LOW’a düştüğü anda frame transferi başlar. Bu noktadan sonra UART yapısı 8 biti kendi register ı üzerine kayıt eder. Eğer stop bitini de doğru şekilde alırsa bir byte alındığına dair bir flag set eder veya ilgili interrupta girer. Tx tarafında ise Tx modülü busy flag’i düşer veya ready flag’i kalkar veya complete interruptına girebilir.


Kavramlar

  • Data Frame: Aktarılan asıl veridir. 5–9 arası değişebilir/ayarlanabilir. Bazı işlemcilerde sabitte olabilir.
  • Baud rate/Bit rate: Bir bitin gönderilme frekansı. (1/baud rate) Bir bitin iletilme süresi. 1-bit start 1-bit stop bitten oluşan bir paketin gönderilme süresi (10/baud rate) kadar sürer.
  • Start Bit: Başlangıç bitidir. Standard bir yapıda (1/baud rate) kadar sürer ve LOW seviyedir.
  • Stop Bit: Sonlandırma bitidir. Standard bir yapıda (1/baud rate) kadar sürer ve HIGH seviyedir. Bir hatadan dolayı LOW olarak okunursa ilgili paket hatalı olarak sınıflandırılır.
  • Parity Bit: Doğrulama bitidir. Genelde opsiyonel olarak kullanılır. Bir paket içerisindeki bitlere göre hesaplanır. Even veya Odd seçilir. Bu koşula göre hesaplanan bit pakete uygunsa paket sağlamdır. Değilse paket içerisinde hatalı bir bit vardır.

Lojik Seviye


Bu kısımda yer alan bilgiler lojik tasarım ile ilgilenen kişilerin ilgisini çekebilir. FPGA, CPLD gibi yapılarda UART modülü aşağıdaki mantıklar çerçevesinde tasarlanır. Modüllerin giriş çıkışları kullanılacak yapılara göre farklı şekillerde genişletilebilir. Örnek olarak hiç bir veriyi kaçırmamak için UART RX modülünün arkasına bir FIFO yapısı bağlanır ve ana kontrol modülü verileri FIFO üzerinden çeker. Bu durumda RX modülü ile FIFO’nun senkron çalışması için -varsa- gereken kontrol pinleri eklenir.

Bu kısımda genellikle modüllerin RTL gösterimi yer alacaktır. RTL lojik tasarımlarda register-transfer level gösterimidir.

RX Bloğu


Alıcı yapı, belirlenen UART hızının birkaç katı hızla çalışır. Örnek olarak STM32 işlemcilerde 8 veya 16 örneklem alır. Bunun sebebi alınan frame i doğrulamaktır. Bir bit gelecek zamanda farklı değerler okunursa o frame hatalı kabul edilir.

rx hattından yeni bir veri gelip iletim tamamlandığında Data_ready çıkışı HIGH olur ve ana kontrol yapısı Data_output üzerinden register a yazılan veri okunur.

TX Bloğu


Gönderici yapı alıcı yapıya göre daha basittir. Kendi içerisindeki paralel veriyi txTrigger sinyali ile UART baud rate hızında seri hattan gönderir. Genellikle ek bir doğrulama veya kontrol gerekmez.

Data_input hattındaki veri start pininin tetiklemesiyle iletime başlar ve frame yapısına uygun olarak(start bit, stop bit, parity) veri tx pini üzerinden aktarılır. Parity hesabının nasıl yapıldığı aşağıdaki şekilde de gösterilmiştir.



Görsel Kaynakları:
  • https://www.slideshare.net/n380/uart-vhdl-rtl-design-tutorial
  • https://www.allaboutcircuits.com/technical-articles/back-to-basics-the-universal-asynchronous-receiver-transmitter-uart/


Unit Step Response Grafiği Hakkında (Birim Adım Cevabı)

Bir sistemin unit step cevabı, ilgili sistemin girişine unit step fonksiyonu uygulandığında, sistem çıkışının davranışını ifade eder. Unit s...