Mikroişlemciler Final Sınavı Çözümleri – Soru : 3

Şöyle bir sorulara baktığımda pratikte ya da Proteus’ta denemek için oldukça uğraştırıcı veya hızlılar. Bu yüzden yazacağım kodların ve kuracağım devrelerin çalışması hakkında bir garanti veremiyorum. Ancak bu kodlar ve devreler bana oldukça mantıklı geliyor. Belki gerçek hayatta denense ufak tefek problemleri olacaktır, ama çalışacaklarını düşünüyorum.

Anlatım tamamen ideal şartlar için ve belki bazı gecikmelerin ihmal edildiği düşünülerek yazılacak. Ancak en azından nasıl bir çözüm yolu izlenebileceği hakkında fikir vereceğini düşünüyorum. Sınavın ilk 3 sorusu hakkında yazacağım. Zira son soruyu hala anlayabilmiş değilim. 🙂 Üçüncü sorudan başlayalım.

Soru : MSP430 ve 8-bitlik bir DAC’den oluşan bir sistemin çıkışında 1kHz frekansında 0 ile
2V arasında değerlere sahip üçgen bir dalga şekli üretilmek isteniyor. Gerekli programı assembly veya C
dili ile yazınız.

Bu devreyi elimde osiloskop olmadığı için Proteus’ta denemeye çalıştım. Ancak simüle edilebilen DAC’ları tam olarak kullanamamam ve DAC’ın yeterince hızlı dönüşüm yapamamasından dolayı net bir üçgen dalga göremedim. Fakat elde ettiğim işarete uzaktan bakınca biraz üçgen dalgaya benziyor. 🙂

İlk önce nasıl bir devre kuracağımdan bahsedeyim. Aslında devre oldukça basit olacak. Bir MSP430, bunun Port1 çıkışına da 8 bitlik bir DAC bağlayacağım. Üretmek istediğim işaret 0 – 2 V arasında salınacağı için referans gerilimlerini Vref+ = 2V, Vref- = 0V olarak belirleyeceğim. Devrem şu:

Devre şeması

Devre şeması

Şimdi üretmemiz gereken işaret hakkında biraz düşünelim. Frekansı 1 kHz olarak verilmiş. Bu durumda periyot, T = 1 / f formülünden 1 ms çıkar. Periyodum 1 ms ise, benim yapmam gereken 0,5 ms’de 0’dan 2V’a çıkan, daha sonra 0,5 ms’de tekrar 2V’dan 0’a inen bir işaret üretmek. Bu durumda DAC’ın girişlerine şöyle bir şey uygulamalıyım: 0,5 ms’de 00000000’dan 11111111’e, ardından tekrar 0,5 ms’de 11111111’den 00000000’a doğru birer artarak ilerleyen sayılar.

Üretilecek işaret

Üretilecek işaret

Bunun için timer’ı kullanabilirim. Hem de tam işime yarayacak up – down mod var. Şimdi 11111111 = 255’tir. Ben 1 ms’de 0 – 255 – 0 sayacak şekilde up – down modda timerımı ayarlarsam, ardından da sonsuz bir döngünün içinde TAR registerındaki değeri P1OUT registerına atarsam, istediğim işareti çıkışta elde edebilirim.

Timer’ın sayma hızı hakkında bir hesap yapalım. 0 – 255 – 0 demek, elimdeki değerin yaklaşık 500 kere değişmesi demek. 500 değişimi, benim 1 ms’de yapmam gerekiyor. O zaman bir değişim için geçmesi gereken süre 2 us’dir. Benim SMCLK kaynağım 1 MHz frekansında çalışıyor. Bu demektir ki 1 us’de bir pals üretiyor. Ben timer için bu kaynağı kullansam ve bölücü değerini 2 olarak ayarlasam, timer’ım 2 us’de bir artacak. Bu da benim istediğim değer.

Olayın mantığını oluşturduk ve gerekli bütün hesapları yaptık. Şimdi göreceğiniz gibi benim çalışacağına inandığım kodum oldukça kısa. Şöyle ki;

#include "io430.h"

void main( void )
{
  WDTCTL = WDTPW + WDTHOLD;   // WDT kapatıldı.

  P1DIR = 0xFF;               // Port 1 komple çıkış olarak ayarlandı.
  TACCR0 = 255;               // "11111111" = 255
  TACTL = TASSEL_2 + ID_1 + TACLR + MC_3;   // Up - down mod, SMCLK, Div = 2.

  while(1)
  {
    P1OUT = TAR;              // TAR değerini P1OUT'a at.
  }
}

Başta da belirttiğim gibi deneme imkanım yok. Her ne kadar çalışacağını düşünsem de çalışıp çalışmayacağı hakkında kesin bilgim yok. Umarım çalışır. 🙂

Share
  1. tar değerini nasıl oluyor bir registıra taıyoruz anlamadım

    • Timer sayıyor. O an hangi sayıda olduğu TAR registerında tutuluyor. Sonuçta oradaki sayı da binary’ye çevrildiğinde 1’lerden 0’lardan oluşan bir sayı. Nasıl ki TAR’ı bir değişkene atabiliyorsak, ya da P1OUT’a nasıl bir değer atayabiliyorsak, aynı şekilde TAR’daki değeri de P1OUT’a atabileceğimizi düşünüyorum.

  2. Iyi gunler…
    bu mantikla sinusun sekli nasil elde edilebilir acaba?saygilar…

    • Merhaba,
      Timer doğrusal bir şekilde sayıyor. Bu yüzden üçgen dalga için direkt olarak kullanabiliyoruz. Sinüzoidal bir işaret içinse porta bastığımız değerin artış miktarının sabit olmaması gerekiyor. Bu yüzden bence timer’ı sinüzoidal işaret üretmek için doğrudan kullanamayız. Muhtemelen main fonksiyonu içinde, artış miktarını değiştirerek bir şeyler yapılabilir.
      Kolay gelsin…

  3. öncelikle çok iyi düşünmüşsün kodun kısalığı açısından fakat while’ın bir kere dönmesi 9 clock alıyor.bu yüzden üçgenin artan ve azalan kenarları zamanda 2 mikro saniye uzunluğunda ve genlikte 256 farklı genlik değerinde olmayacağını düşünüyorum.

    • Yazının başında da belirttiğim gibi ideal şartlarda ve bazı gecikmeleri ihmal ederek yazdım. Dediğiniz doğrudur. İşarete detaylı bakıldığında bir basamak yukarı çıkması 2 us’den daha uzun sürecektir. Dolayısıyla 256 değişimin tamamı görülemeyecektir. Ancak timer, esas programdan bağımsız saydığı için artış anlarındaki gerilim değerlerinin doğru olacağını düşünüyorum. Ayrıca elimizdeki denetleyici 1 MHz’de çalışıyor, biz bununla 1 kHz frekansında işaret üretmek istiyoruz ve her periyotta porta yaklaşık 500 farklı değer basmamız gerekiyor. Yani yapmaya çalıştığımız iş için denetleyicimizin çalışma frekansı biraz yetersiz kalıyor. Daha hızlı bir denetleyiciyle ya da elimizdekinin hızını 16 MHz’e ayarlayarak gereken zamanlamaları yakalamak mümkün olabilecektir.

  4. msp430f2011 değilde pic 16f877 ile yapcam nasıl olcak bana acil yardım edermsnz

Yorum Yap


Not - Bunları KullanabilirsinizHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>