TEKNİK YAZI

EMPA Elektronik Texas Instruments Seminerleri

İşte sahalarda görmek istediğimiz hareketler bunlar.

EMPA Elektronik ve çok değerli mühendisleri Oğuzhan Demirci, Erem Irmak ve Mete Yasan, başlıklarını görebileceğiniz konularda Türkçe olarak webinar düzenlediler.

Gerçekten faydalı bilgiler edinebileceğiniz bu webinarları daha çok kişiye ulaştırmak için burada da yayınlamayı düşündük.

Buradan da yapılan bu çalışmanın tüm diğer firmalara örnek olmasını diliyoruz. Sektörün ihtiyacı olan şey bu.

 

-EMPA Elektronik TI Point of Load DC/DC çevirici çözümleri Türkçe Seminer 

 

-EMPA Elektronik Texas Instrument SimpleLink ürünleriyle kendi IoT tasarımınızı gerçekleştirin  

 

 -Empa Elektronik TI makes SENSE: What is new on TI sensing solutions 

 

 

 

 

Süperkapasitör ve Kablosuz Şarj , Çocukların Pil Derdine Son!!!

Kodlama, işlemciler, lojik entegreler, devreler vs hepsi enerji olmadan hepsi koca bir hiç, dimi 🙂

Yeni yazı girmeyeli epey bi zaman kusura bakmayın, yazacak şey çok ama vakit yok.

Yakın zamanda bunu çözüp buraları daha da hareketlendirmeye çalışacağız.

Enerji diyorduk, tek kaynak standart bataryalar değil. Alternatifler için de genel de hep batarya gibi davranmasını isteyip onun performansını beklediğimiz için bu alternatif olmaz, şu olmaz bu olmaz deyip kenara atıyoruz. Halbuki biraz daha geniş açıdan bakıp sistemi amaçlarını ihtiyaçlarını genel olarak değerlendirirsek farklı yapılarla alternatif çözümler üretmek mümkün.

Aşağıdaki videomuzda olduğu gibi.

Lafı fazla uzatmadan, amaç oyuncaklar için pil israfına son vermek. Bir çocuk oyuncağını 2 dk oynar bırakır, ya da oynamaya devam etmek istiyorsa da yaptığımız sistemdeki gibi gidip 20 sn şarj eder ve devam eder. Şarj ise tamamen kablosuz olduğundan dolayı çocuklar için hiçbir tehlikeli yanı yok.

Eli havya tutabilen herkesin yapabileceği sistemi, olabildiğince ayrıntılı ve basit şekilde anlatmaya çalıştık. Ayrıca makerlar içinde güzel bir uygulama olacağını düşündük. Uygun olabilecek herhangi bir sisteme de alıp direk uygulayabilirsiniz çünkü sistemde sadece bataryaya müdahale ediyorsunuz. Geri kalan sisteme hiç dokunmuyorsunuz.

Sorularınız varsa eğer videodaki veya buradaki yorum kısmından sorabilirsiniz.

Faydalı olması dileğiyle.

 

 

 

 

 

 

Altium Designer Anlatımları – Kütüphane Yönetimi/Oluşturma

Ülkemizde Altium gibi programları üretmemizi geçtim, bu tarz programları kullanabilmeyi öğrenmek isteyen kişiler için Türkçe kaynak yok denecek kadar az. Yabancı diliniz iyi olsa bile yapmak istediğinizi yapabilmek, tıkandığınız noktalarda çözüme gitmek için daha çok kaynağa, özellikle de kendi dilinizde anlatımlara ihtiyacınız oluyor.

Uzun süredir yazı yayınlayamıyorduk. Yazmak zor, gerçekten emek, birikim, tecrübe istiyor. Bir de video çekelim dedik. Yakında Tiva üzerine de farklı tarzda, çok güzel videolar yayınlayacağız inşaallah.

Bu videomuzda Altium için kütüphane kullanımını basitçe anlattım. Kendi elemanınızı oluşturmak, hazır elemanları kullanmak, hazır elemanları kendi kütüphanenize atmak, onlar üzerinde değişiklik yapmak gibi kütüphane yönetiminde temel olarak neye ihtiyacınız olabilecek herşeyi burada bulabilirsiniz.

İlk videom, biraz acemice olabilir, oldukça doğal birazda sohbet havasında anlatmaya çalıştım

 

TM4C129XL Launchpad Sonunda!!!

İşlerimizin yoğunluğundan dolayı bir süredir teknik birşeyler paylaşamadık. Ancak biriktiriyoruz toparlayıp devam edeceğiz inşaallah.

Bu süreçte güzel gelişmeler oldu, Tiva C serisi işlemcilerin 129 serisi engineering sample sürecinden seri üretime geçiş yaptı ve gönül rahatlığıyla artık bu işlemcileri kullanabiliriz.

Asıl merakla beklediğimiz, twitter dan sürekli TI a bu konuda baskı yaptığımız 129 serisi için ethernet portlu bir launchpad dün itibariyle ön siparişe sunuldu. TI Launchpad geleneğini bozmayıp, bu ürün için      19 $ gibi çok uygun bir fiyat belirlemesi işin apayrı bir güzel tarafı.

ek-tm4c1294xl

ek-tm4c1294xl

 

Kitin linki burda:

http://www.ti.com/tool/ek-tm4c1294xl

Bu linkten sizde ön sipariş geçebilirsiniz.

Haberi alır almaz siparişimizi geçtik, kit elimize ulaştığında ilk izlenimlerimizi ve nasıl bir demo uygulama yazıldığını inceler sizinle paylaşırız.

 

 

 

ADC-Analog Digital Converter Kullanımı Üzerine

Bildiğiniz üzere tüm dünya analogtur. Bu yüzden ona ait herhangi bir şeyi dijital sistemlerimiz ile  ölçüp değerlendirmek, işlemek ve bu değerlere göre belli görevlerin komutlarını yaptırmak istersek  ADC ye yani Analog Digital Converter a ihtiyacımız vardır.

Nedir bu ADC?

adctodigit

ADC adından da anlaşılabileceği üzere analog sinyali bizim dijital sistemimizin algılayabileceği dijital veri haline dönüştürür. Piyasa da çok çeşitli ADC entegreleri bulunmakla birlikte teknolojinin gelişmesiyle bu ADC ler artık mikroişlemcilerin içerisine girmişlerdir. Mikroişlemcilerde bulunan ADC ler genel olarak 10-12 bit çözünürlüktedirler. Daha fazla çözünürlüğe ihtiyacımız varsa harici olarak entegre şeklinde 16 ve 24 bit olan modellerini de üreticilerden bulabiliriz.

ADC nin ne olduğuna daha fazla girmeden asıl konumuz olan ADC ile nasıl en iyi ölçümü yapabiliriz bundan bahsetmek istiyorum.  Fazla karmaşık ya da fazla madde olmamakla birlikte bunlara dikkat etmezseniz eğer çok saç baş yolacağınızı size garanti ederim. Anlatacağım püf noktalarının tamamını ayrıca kendi çalışmalarım da birebir tecrübe ettim. ADC kullanacaksanız bunlardan pek de kaçış yok.

Elektronikte tüm işlerde olduğu gibi ADC okumada da en büyük sıkıntı sinyal üzerindeki gürültülerdir. Bu gürültü ölçeceğimiz sinyal üzerinde olabileceği gibi kullandığımız ADC nin referans voltajında da olabilir. Referans voltajının gürültülü olması genelde gözardı edilir ve ölçtüğünüz sinyale donanımsal ve yazılımsal filtre ordusu kursanız bile ölçümünüz kararlı hale gelmez.

Bu şekilde laf lafı açıyor en iyisi madde madde ilerlemek.

1- REFERANS VOLTAJI:

Mikroişlemcide olsun harici ADC entegresinde olsun ADC ler her zaman bir referans voltajına ihtiyaç duyarlar. Genelde bu referans voltajın entegrenin ya da mikroişlemcinin besleme pininden direk olarak alınır. Öncelikle isterseniz referans voltajının ne olduğundan bahsedelim biraz.

ADC lerin 10 ,12, 16 24 vb…. bit çözünürlükte bulunduğundan bahsetmiştik. En yaygın kullanımda olan Microchip firmasının PIC mikroişlemcileri üzerinden konuşacak olursak. Pic mikroişlemcilerin ADC si 10 bit’tir. 10 bit 2^10=1024 . Tüm işlemcilerde olduğu gibi bu işlemcilerde de referans voltajı maksimum mikroişlemcinin besleme voltajı olan 5 V olarak kullanılır. Referans voltajımızı 5 V olarak belirlediğimizde, ADC modülü 1024 değerinin her birine bu voltajı eşit olarak dağıtır.  Yani ADC modülü okuduğumuzda 0 volt= 0,  5 V=1023 değeri ile bize döner. Her bir bit değerinin alacağı voltaj değerine bakarsak 5/1024=0.00488 volt olarak karşımıza çıkmaktadır. Yani diyelimki ADC modülden okuma yaptığımızda 500 değerini alıyor isek yazılımda 500*0.00488 işlemini yaparak ADC mizin girişindeki voltajın 2.44 volt olduğunu hesaplamış oluruz.

Ancak genelde bu hesaplama tutmaz. Tuttuğu tek yer proteusdaki simulasyon ortamıdır. Neden?

– Öncelikle mikroşlemcimizin besleme voltajını kontrol etmemiz gerekli. Mikroişlemcinizin besleme voltajını ölçün ve voltaj hesaplamak için gerekli çarpan olan 0.00488 değerini ona göre revize edin. Mikroişlemciyi beslemek için 5 volt adaptör olsun regüle entegresi kullanmış olsun, hiçbiri ideal olamayacağı için tüm bunların çıkışları birbirinden farklıdır. 5 volt yerine 4.90 volt ise beslemeniz çarpım değeriniz 0.00478 olmalıdır.

– Bu kadar küçük değerler benim ölçümümü nasıl etkiler ki?

Eğer 5 V ölçüyorsanız ve size 1 Voltluk bir çözünürlük yetiyor ise hiç problem değil referansı 5 V olarak varsayıp işlem yapabilirsiniz. Ancak diyelim ki 100 Volt DC voltaj ölçümü yapacaksınız ve bu voltajı ölçmek için gerilim bölücü ile 100 voltu 5 V değerine oranladınız.  Ölçüm sonucunun hatalı çıktığını görebilirsiniz. Uygulama alanına göre projenizde ihtiyacınız olan hassasiyet oranına göre bunu göz önünde bulundurmanız gerekmekte.

Referans gerilimimizi besleme voltajından almıştık. Ölçtük ve multimetremizin ekranında besleme değerini 5 V olarak görüyoruz. Her şey yolunda gibi ancak gerçekler malesef öyle değil. Kullandığımız multimetreler ölçtükleri voltajın RMS değerini bize gösterirler. Yani aslında sinyalimizde gürültüler mevcut ve biz bunları ancak osiloskop ile görebiliriz. Besleme kaynağımız kötü ise halihazırda multimetre RMS ölçmesine rağmen besleme değerimizin 4,90 ile 5 V arasında değiştiğini görebiliriz. Eğer bir ölçü aletiniz yoksa ya da kaynağınızdaki oynamaları net olarak görmek isterseniz, besleme voltajınızı gerilim bölücü ile ikiye bölüp direk olarak okuma yapacağınız pine bağlayıp görebilirsiniz.

– Besleme gerilimim uygulamam için yeterince düzgün ancak devreyi çalıştırırken arada ölçüm sonuçları kararsız bir yapıda oynamalar gösteriyor vb… Neden?

Eğer devremiz analog okuma ile birlikte bir ldc ekran çalıştırıyor, röleler açıp kapatıyor, buzzerlar ledler vb elemanları kontrol ediyorsa çalışma esnasında ADC yi takip ederseniz bu elemanların her bir hareketinde voltajınızda meydana gelebilecek dalgalanmalar nedeniyle ölçüm sonuçlarınız da dalgalanacaktır. Hele ki çok zayıf, çıkış akımı çok düşük bir beslemeniz varsa eğer örneğin seri porttan bir veri basarken bile voltajınızda oynamalar olabilir.

Çözüm: İlk olarak devrenizin voltaj girişinden başlamak üzere, mikroişlemcinizin besleme pinlerinin en yakınına ve anlık olarak mikroişlemciye göre yüksek akım çeken elemanların beslemelerine birer kondansatör koymalısınız. Bu kondansatör değerini abartıp kule gibi kondansatörler takmamanızı rica ediyorum.

Gördüğünüz gibi referans voltajını dahili beslemeden aldığımızda başlıca karşımıza çıkabilecek sorunlar bunlar olmakla birlikte uygulamanıza göre karşınıza çok daha farklı durumlar çıkabilir. Peki çözüm?

Referans voltajını referans pininden sağlayınız. Bu demek değildir ki mikroişlemcinin beslemesini direk getirip referans pinine bağlayayım. Bu şekilde yapıldığında değişen bişey olmayacaktır.

 

En basit şekilde 4.5 voltluk bir zener ile referans voltajını 4.5 volta çekip bu zener diyotu bir de kapasitör ile desteklerseniz yukarıda bahsettiğimiz sorunların %90 ını çözmüş olursunuz.

 lpf

Ancak hassas ölçüm yapmanız gereken bir proje ile karşı karşıya iseniz, bu çözüm sizin için yeterli olmayabilir. Bunun için üreticiler voltaj referans entegreleri üretmişlerdir. Piyasada çeşitli firmaların ürünlerine rastlayabilirsiniz. Kullanım içinde mutlaka veri sayfasında belirtilen kriterlere dikkat ederek kullanınız. Ben en çok Texas Instruments firmasının ürünlerinden memnun kaldım ve kullanıyorum. Bu entegreler ile yüksek çözünürlüklerde dahi son derece temiz bir referans geriliminiz olacağını rahatlıkla söyleyebilirim.

Referans gerilimi mevzusunun bu kadar uzamasının nedeni yukarda da bahsettiğim gibi ADC sonuçlarında görülen kararsızlıkların düzeltilmesi için analog sinyale müdahaleler yapılır yazılımda ekstra filtreler konulur ancak yeterince kararlı bir yapı elde edilemez. Referans voltajına gereken önem verilmez genelde. Özellikle de devremiz SMPS bir beslemeden SMPS regüle entegresinden besleniyor ise kararsızlık çok daha ciddi şekilde karşımıza çıkacaktır. SMPS ler verimli olmasına verimlidir ancak aynı zamanda bir numaralı gürültü kaynaklarıdırlar.

2- FİLTRE:

Referans gerilimi olayını çözdük. Geldik sinyalimizi ölçmeye.

İki çeşit filtreleme tipi mevcuttur. Yazılımsal filtreleme ve donanımsal filtreleme.

Donanımsal filtreleme de çeşitli filtre tipleri bulunmakla birlikte ADC ölçümünde yaygın olarak alçak geçiren filtre kullanılmaktadır. Bir direnç ve bir kapasitör gibi basit elemanlarla oluşturulabilmesinin yanı sıra bir o kadar da etkilidir.

lpf1

Alçak geçiren filtrelerle ilgili en güzel kaynak olarak Fatih Erdem in yazısını okuyabilirsiniz.

http://www.fatiherdem.net/r-ve-c-elemanlariyla-alcak-geciren-filtrelow-pass-filter-tasarlayalim/

Sinyalinizde oluşabilecek gürültülerin genellikle yüksek frekanslarda olacağını ve eğer spektrum analyzer gibi sönümlemeniz gereken sinyallerin değerlerini direk olarak göremiyorsanız benim gibi kompanent değerlerini çoğu zaman deneyerek bulacaksanız eğer kesim frekansını hesaplarken 1 Khz gibi frekanslardan başlayarak R ve C değerlerini denemenizi öneririm. Tabi bu ölçtüğünüz sinyalin frekansına göre yine değişiklik gösterecektir. DC gerilim ölçtüğünüzü ya da 50 Hz bir AC sinyal ölçtüğünüzü varsayarak 1 Khz i belirttim.

Alçak geçiren filtrede dikkat edilmesi gereken ise eğer yüksek bir direnç değeri seçerseniz ölçeceğiniz gerilimin düşeceğidir. Hesaplamalarınızda buna dikkat ederek hareket etmenizi tavsiye ederim.

Mikroişlemcilerde ADC okuma ile birlikte başka birçok işlemler yapıldığından, kesmeler meydana geldiğinden, farklı yerlere dallanmalar olabileceğinden dolayı  ADC okuma da işi olabildiğince donanım tarafında bitirip mikroişlemciye en temiz sinyali ulaştırmaya gayret edin. En basit yazılımsal filtreleme yöntemi olan belli bir sayıda örnek alıp bunların ortalamasını alma yönteminde bile bu işlemler belli bir zaman almaktadır. Örnek alırken programınız örneğin bir seri port kesmesine gidebilir ve ölçüm sonuçlarınızın yanlış olmasına neden olabilir. Son olarak bu ortalama alma tekniğinden de bahsedip yazımızı sonlandıralım. Bu filtreleme de uygulamanızda belli periyotlarda belli sayılarda örnek alıp bu örnekleri toplayıp sonra da örnek sayısına bölmek yeterli olacaktır. Uygulamanıza göre bu örnek alma sıklığını örnek alma sayısını değiştirebilirsiniz. Mikroişlemciler 2 lik sistemde çalıştıklarından dolayı alacağınız örnek sayısı da 2 nin katları şeklinde olursa daha sağlıklı bir bölme yapılmış olacaktır. Tavsiyem 64 veya 128 örnek almanız. Eğer Ti ın Tiva serisi gibi gelişmiş bir işlemci ile çalışıyorsanız buna hiç gerek kalmayacaktır. Çünkü tiva nın ADC modülünde bahsettiğimiz ortalama alma işlemi donanımsal bir modül ile yapılıp size ADC sonucu olarak direk bu ortalama değer verilmektedir.

Daha yazılabilecek çok şey var ancak yazıyı uzatıp fazla da sıkmayalım. Belki bir ikinci yazı ile devam ederiz.

Sizlerinde ADC üzerine tecrübeleriniz bildiğiniz püf noktalar var ise yorum olarak bırakırsanız hepsini bu yazıya ekleyelim.

Hepinize gürültüsüz beslemeler, kararlı ADC sonuçları diliyorum.

Selametle.

ACS712 Allegro Akım Sensörü İncelemesi

ACS712-Product-Image

Piyasada çeşitli akım ölçme çözümleri bulunmaktadır.  Çalışmalarım boyunca bir çok sensör tipini deneme fırsatım oldu. Diğer sensör tiplerine ayrıntılı girmeden dezavantajlarını özetlemek gerekirse, simetrik beslemeler, büyük akım trafoları, hassas opamp devreleri, sıcaklık ile ölçtüğü değerlerde oynamalar gibi şeklinde birçok madde sıralanabilir.

Tabi bu saydıklarımız= maliyet+cihazın gittikçe büyümesi demek oluyor.

Gelelim bizim burda incelemesini yapacağımız Allegro firmasının üretmiş olduğu ACS serisi sensörlerden olan ACS712 ye. Öncelikle henüz diğer ACS serisi ürünlerini incelemediğimi ve üzerinde çalışıp testler yapmadığımı belirtmek isterim. Serideki diğer ürünler daha üstün özelliklere sahip olabilir.  ACS712-05B ile çalışmamın nedeni ise elimde bu modelden olması. Türkiye de modül olarak fiyatları 20-30 TL arası değişen bu sensörleri ebay den eğer aceleniz yoksa ki 40 günde falan geliyor 2.5$ a alabilirsiniz.

0-50_Static

İnceleyeceğimiz sensörün yukarıda bahsettiğimiz dezavantajlara karşılık avantajlarını sıralayacak olursak;

1- Küçük boyut:

ACS712 nin 30 A lik modeli bile SOIC8 kılıfta bulunabiliyor. Bu da akım ölçümü yapılacak devrede, sistemde çok büyük bir yer avantajı demek. Ayrıca diğer modellerini incelerseniz eğer 200 A akım ölçebilen bir modelinin boyutuna şaşıracağınızı ve o seviyede bir akım ölçümü için başka hiçbirşeye gerek bırakmadığını söyleyebilirim. 200 A lik versiyonun kılıfı aşağıdaki gibidir.

acs756

2- Aşırı kolay kullanım:

Sanırım Allegro firması yıllardır bizim gibi bu akım ölçme işinde çile çekmiş insanları duymuş olacak ki kullanımı son derece kolay bir sensör geliştirmiş. Aşağıdaki temsili şemasından da görülebileceği üzere akımı 1-4 bacaklarından geçirip diğer tarafındaki 5-8 nolu bacaklara 5V-GND ve fitre kapasitörünü ekleyip direk olarak akımla lineer orantılı şekilde Vout pininden gerilimi okuyarak akım değerini elde edebiliyoruz.

 

712sema

3- Çift yönlü akım ölçümü için ekstra bişey gerektirmemesi:

Körün istediği bir göz Allah verdi iki göz. Sensörümüz DC akımda her iki yönde de akım ölçebiliyor. Bu özelliği sayesinde AC akımı da rahatlıkla ölçme özelliğine sahip.

 

Ayrıca veri sayfasında sensörün genel özellikleri aşağıdaki gibi sıralanmıştır:

acsspecs

Dikkat edilmesi gereken noktalar ve ayarlar olmakla birlikte eğer hassas okumaya ihtiyacımız yok ise bize bu kadarı yeterli. Sensörün Vout pinini kullanacağımız mikroişlemcinin ADC modülüne direk olarak girebiliriz.

 

Vout Pininden nasıl bir çıkış alırım?

Sensörün veri sayfasını incelerseniz eğer size kullandığınız sensör modelinin akım başına size sağlayacağı voltaj değerini görebilirsiniz.

acstypes

Tablodan da görülebileceği üzere ACS712-05B sensörü üzerinden geçen 1 Ampere karşılık 185 mV voltaj üretiyor.

Peki sensörü aldım ve 5 v beslemesini verdim sensör çıkışını Vout pinini ölçtüğümde 2.5 volt görüyorum, neden?

Yine tablodan bakarsak sensörümüz +- 5A ölçebiliyor. + ve – akım yönlerinin Vout pininden ölçülebilmesi için 2.5 V offset değeri olarak belirlenmiş. Akım yönü IP+ pinlerinden IP- pinlerine doğru olduğunda 2.5 V un üzerinde, tam tersi olduğunda ise 2.5 v un altında voltaj değişimini rahatlıkla görebilirsiniz.

acszerovolt

Sensörün kullanımında bir kaç püf noktaya değinelim:

Fitre kapasitörü:

Şematikten de görülebileceği üzere sensörümüzün bir bacağına filtre kondansatörümüzü bağlıyoruz. Bu filtre kondansatörü önceki modellerinde yoktu ancak yeni modellerinde bu özelliği dışarıya vermişler. Bu sayede filtre kondansatöründe değişiklik yapıp kullanacağımız yere göre sensörümüzü optimize edebiliriz.

acsfcap

Tablo üzerinden konuşacak olursak, sensörümüzün çıkışında her zaman bir gürültü mevcut olduğu görülebilir. Bu gürültü değerini azaltmak için filtre kapasitörümüzü arttırabiliriz bu sensörümüzün çözünürlük değerini de arttırıyor ancak BW değerimiz ciddi şekilde azalıyor. Cf nin değerini arttırdığımızda sensörün ölçebileceği frekans değerinin doğal olarak düşmesi, bu bir manaya response time ın da düşeceği anlamına geliyor. Allegro veri sayfasında bu durumdan bir grafikle bahsetmiş.

fcapgraf

Peki tabloda belirtilen kapasitör değerlerinden daha yükseklerini takarsak gürültü oranı aynı oranda düşecek midir?

Ben burada Cf değerini 470 nF olarak değiştirerek yaptığım testlerde gürültü oranının ciddi şekilde azaldığını gördüm. Bu şekilde gerçekten iyi bir çözünürlük elde edilebilir ancak üstte soldaki grafikten de görülebileceği üzere sensörün response time süresi ciddi şekilde artmakta. 470 nF değerinde bir kondansatörle 1.120 ms response time değerimiz oluyor. Örneğin 220  V 50 Hz lik alternatif akımla çalışan bir yükü ölçmek istiyor isek bu değer bizim hassaslığımızı ciddi şekilde düşürecektir. Response time bizim için çok problem değil ise DC bir akımın ölçümünü yapacak ise Cf i rahatlıkla arttırabilirsiniz. Hem gürültü oranı düşecek hem de çözünürlüğünüz artacaktır. Yani özetle ölçüm yapacağınız sistemi bütün olarak ele alıp çözünürlük-response time-bant genişliği üçgeninde sensörünüzün kullanım şeklini optimize etmeniz gerekecek. Ayrıca sensör çıkışındaki gürültünün sadece sensöre bağımlı olmadığını ilk başta sensörümüzü beslediğimiz 5 V un ripple değerinin minimumda olması gerektiğini belirtmek isterim. Bu konuya dediğim gibi ayrı bir ADC konusunda değineceğim.

acstemp

Son olarak sıcaklığın sensör üzerindeki etkisine de bakacak olursak veri sayfasında offset gerilimi ve ölçüm sonuçlarına sıcaklık değerinin etkisi de grafiksel olarak verilmiş durumda. Eğer sistemimiz farklı iklim koşullarında çalışacak ise mutlaka bu değerleri göz önüne almamız gerekli.

 

Tiva Not-6 : Tiva C Serisi TM4C123G LaunchPad – ADC Kullanımı ve Grafik Arayüz

Herkese tekrardan merhabalar;

Tiva C serisi için yazılarımıza devam ediyoruz. Bu yazımızda çoğumuzun devamlı olarak kullandığı ADC modülünün kullanımına değineceğiz. Alışılagelmiş ADC yapısından biraz farklı bir yapıya sahip olan Tiva işlemcilerde gerekli ayarları yapıp daha sonra belirlediğimiz bir protokolle PC’ye gönderip orada oluşturmuş olduğumuz grafik arayüzüyle değerlerimizi göreceğiz.

Tiva Launcpad üzerinde bulunan TM4C123GH6PM mikrodenetleyici 12 bitlik çözünürlüğe sahip 12 girişe sahiptir. Aynı zamanda modül içerisinde bir adet sıcaklık sensör modülü içermektedir.

adc

Her bir adc modülü 4 adet Sequencer modül içermektedir ve bu modüller sayesinde bir anda bir veya birden fazla ADC girişinden örnek alabilirsiniz. Sequencer modüller alınan örnekleri fifo kapasitelerine göre depolarlar.

adc2

Yukarıdaki tabloda gördülüğü gibi 1 ila 8 arasında depoya sahip olan sequencer modüller yer almaktadır. Eğer ki biz tek ADC girişinden örnek almak istiyorsak SS3 (Sample Sequencer 3) bizim işimizi görecektir. Biz örneğimizde 4 girişten örnekler alacağız o sebeple SS1’i kullanacağız.

adc3

Şimdi koda gelelim. Kod üzerinde gerekli tüm açıklamalar yapılmıştır.

#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_gpio.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "driverlib/adc.h"
 
void UARTAyarla(void)
{
	SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); //UART modülünü aktif hale getiriyoruz.
 
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); //UART için A0 ve A1 pinlerini kullanacağımız için A portunu aktif hale getiriyoruz.
 
	UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE)); // UART'ı 115200 hızına ayarlıyoruz.
 
	GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); //PA0 - U0RX, PA1 = U0TX
 
	UARTFIFOEnable(UART0_BASE); // UART FIFO Aktif hale getiriyoruz.
 
	UARTEnable(UART0_BASE); // UART Aktif hale getiriyoruz
}
 
void ADCAyarla(void)
{
	SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); //ADC0 Modülünü aktif hale getiriyoruz.
 
	ADCHardwareOversampleConfigure(ADC0_BASE, 64); // Daha iyi çözünürlük için, donanımsal olarak 
																								 // 64 tane örneğin ortalamasını alıp bize o sonucu dönmesini sağlıyoruz
 
	ADCSequenceDisable(ADC0_BASE, 1); //Sample Sequencer 1 ile işlem yapacağımız için öncelikle kapatıyoruz.
 
	ADCSequenceConfigure(ADC0_BASE, 1, ADC_TRIGGER_PROCESSOR, 0); // Sample Sequencer 1 için kullanılacak olan 
																															  // interrupt'ın değerini 0 yaparak en yüksek önceliği veriyoruz.
 
	//Belirttiğimiz gibi SS1 4 tane fifoya sahiptir ve şimdi bu fifoya gelecek değerleri ayarlayacağız.
 
	ADCSequenceStepConfigure(ADC0_BASE, 1, 0, ADC_CTL_CH0); //Sequencer Adım 0 : PE3
	ADCSequenceStepConfigure(ADC0_BASE, 1, 1, ADC_CTL_CH1); //Sequencer Adım 1 : PE2
	ADCSequenceStepConfigure(ADC0_BASE, 1, 2, ADC_CTL_CH2); //Sequencer Adım 2 : PE1
	ADCSequenceStepConfigure(ADC0_BASE, 1, 3, ADC_CTL_TS | ADC_CTL_IE | ADC_CTL_END); //Sequencer Adım 3 : Sıcaklık sensörünün değeri ve 
																																									//interrupt'ın açılarak konfigürasyonun tamamlanması
 
	ADCSequenceEnable(ADC0_BASE, 1); //Sample Sequencer 1'i tekrar açıyoruz.
}
 
int main(void) 
{
	uint32_t ulADC0Value[8]; // Sample Sequencer 1 için fifo değerlerinin saklanacağı dizi
 
	char a[4],b[4],c[4],d[4]; //Datalarımızı UART üzerinden gönderirken kullanacağımız dizi
 
	SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ); // islemcimizi 40 Mhz'e ayarlıyoruz.
 
	UARTAyarla();
 
	ADCAyarla();
 
	while(1)
	{
		ADCIntClear(ADC0_BASE, 1); // ADC interrupt flag'ini temizliyoruz.
		ADCProcessorTrigger(ADC0_BASE, 1); // ADC'yi tetikliyoruz.
 
		while(!ADCIntStatus(ADC0_BASE, 1, false)) //ADC'nin interrupt flag'ini kontrol ediyoruz ve data almasını bekliyoruz.
		{
		}
 
		ADCSequenceDataGet(ADC0_BASE, 1, ulADC0Value); //Alınan dataları fifoya yerleştiriyoruz.
 
		UARTCharPutNonBlocking(UART0_BASE, '@'); // Başlangıç karakterini gönderiyoruz.
		UARTCharPutNonBlocking(UART0_BASE, ','); // Ayraç
 
		//Datalarımızı basamaklarına ayırarak gönderiyoruz. 
 
		a[3] = ulADC0Value[0]%10 + 48;
		ulADC0Value[0] = ulADC0Value[0]/10 ;
		a[2] = ulADC0Value[0]%10 + 48;
		ulADC0Value[0] = ulADC0Value[0]/10 ;
		a[1] = ulADC0Value[0]%10 + 48;
		a[0] = ulADC0Value[0]/10 + 48;
 
		b[3] = ulADC0Value[1]%10 + 48;
		ulADC0Value[1] = ulADC0Value[1]/10 ;
		b[2] = ulADC0Value[1]%10 + 48;
		ulADC0Value[1] = ulADC0Value[1]/10 ;
		b[1] = ulADC0Value[1]%10 + 48;
		b[0] = ulADC0Value[1]/10 + 48;
 
		c[3] = ulADC0Value[2]%10 + 48;
		ulADC0Value[2] = ulADC0Value[2]/10 ;
		c[2] = ulADC0Value[2]%10 + 48;
		ulADC0Value[2] = ulADC0Value[2]/10 ;
		c[1] = ulADC0Value[2]%10 + 48;
		c[0] = ulADC0Value[2]/10 + 48;
 
		d[3] = ulADC0Value[3]%10 + 48;
		ulADC0Value[3] = ulADC0Value[3]/10 ;
		d[2] = ulADC0Value[3]%10 + 48;
		ulADC0Value[3] = ulADC0Value[3]/10 ;
		d[1] = ulADC0Value[3]%10 + 48;
		d[0] = ulADC0Value[3]/10 + 48;
 
		UARTCharPutNonBlocking(UART0_BASE, a[0]); // Karakterleri UART üzerinden tek tek gönderiyoruz.
		UARTCharPutNonBlocking(UART0_BASE, a[1]);
		UARTCharPutNonBlocking(UART0_BASE, a[2]);
		UARTCharPutNonBlocking(UART0_BASE, a[3]);
 
		UARTCharPutNonBlocking(UART0_BASE, ','); // Ayraç
 
		SysCtlDelay(5000);
 
		UARTCharPutNonBlocking(UART0_BASE, b[0]); 
		UARTCharPutNonBlocking(UART0_BASE, b[1]);
		UARTCharPutNonBlocking(UART0_BASE, b[2]);
		UARTCharPutNonBlocking(UART0_BASE, b[3]);
 
		UARTCharPutNonBlocking(UART0_BASE, ','); // Ayraç
 
		SysCtlDelay(5000);
 
		UARTCharPutNonBlocking(UART0_BASE, c[0]); 
		UARTCharPutNonBlocking(UART0_BASE, c[1]);
		UARTCharPutNonBlocking(UART0_BASE, c[2]);
		UARTCharPutNonBlocking(UART0_BASE, c[3]);
 
		UARTCharPutNonBlocking(UART0_BASE, ','); // Ayraç
 
		SysCtlDelay(5000);
 
		UARTCharPutNonBlocking(UART0_BASE, d[0]);
		UARTCharPutNonBlocking(UART0_BASE, d[1]);
		UARTCharPutNonBlocking(UART0_BASE, d[2]);
		UARTCharPutNonBlocking(UART0_BASE, d[3]);
 
		SysCtlDelay(5000);
 
		UARTCharPutNonBlocking(UART0_BASE, '\n'); // Bitiş karakterini gönderiyoruz.
 
		SysCtlDelay(1000000); // Örneklemeler arası bekleme
	}
}

Arayüzümüz üzerinde görünüm:

adc4

NOT 1: Herhangi bir mikrodenetleyiciden seriport ile beraber @,DEĞER1,DEĞER2,DEĞER3,DEĞER4\n ( Örneğin: @,5896,4568,2354,0000\n ) şeklinde veri gönderdiğinizde program üzerinde grafiğini görebilirsiniz. Programı hızlıca yazdım. Eğer ki ekleme istekleri ve hatalar varsa , söylerseniz düzeltebilirim.

NOT 2: Programı kullanabilmeniz için bilgisayarınızda .NET Framework 4.0 kurulu olması gerekmektedir.

Programın Linki : teknikyazi.com_DataGrapher

12