MSP430G2452 ile Sinüs Sinyal Jeneratörü

Reklamlar

Selamlar,
Bu yazıda MSP430G2452 entegresi ile nasıl sinüs oluşturacağımızı göreceğiz. Bu iş için temelde kullanılacak birim yaygın olarak duyduğumuz DAC devresidir. Fakat entegre üzerinde bu modül olmadığından onun yerine farklı bir yöntem deneyeceğiz.

 

 

Bu işlem temel olarak PWM tekniğine dayanmakta. PWM nedir?

      Pulse-width modulation (PWM, Darbe genişlik modülasyonu), üretilecek olan darbelerin, genişliklerini kontrol ederek, çıkışta üretilmek istenen analog elektriksel değerin veya sinyalin elde edilmesi tekniğidir.

PWM elektrik ve elektronikte birçok alanda, farklı amaçlar için kullanılmaktadır.(Kaynak:http://www.antrak.org.tr/index.php?Itemid=27&id=58&option=com_content&task=view)

Mikrodenetleyicili devrelerde bu işlem şu şekilde gerçekleştirilmektedir. Öncelikle Frekansı sabit olmak üzere bir kare dalga üretilir ve bu her zaman sabit frekanslıdır. Kare dalga bildiğimiz gibi peryodun yarısında lojik 1 yarsında lojik 0 olmaktadır. İşte tam bu noktada eğer lojik 1 oranını %50 değilde daha farklı şekillerde üretirsek PWM sinyali elde etmiş oluruz.
Sonuç olarak sinyalimizin ortalama DC değeri değişmiş olur. Bu özelliğinden dolayı yaygın olarak güç devrelerinde de kullanılmaktadır.Oluşan bu sinyali uygun filtre ile düzeltirsek dc bileşeni elde edebiliriz.

Bu işlem yaygın olarak mikrodenetleyicilerde özel bir modül olarak bulunuyorsa kullanılabilir yada timer kesmeleri ile yazılımsal olarakta gerçekleştirilebilir. Bizim kullandığımız denetleyicide olmadığı için biz yazılımsal olanı görmüş olacağız.

Timer kesmelerinin biri işe PWM frekansını, diğeri ile Duty cycle dediğimiz lojik 1 ‘de kalma süresini belirleyeceğiz.

Timer A çevre birimi:

Bu işlemi yapmamız için Timer A ‘yı Up mode olarak kullanmamız gerekiyor. Up mode seçenekleri:

Yukarıdaki resme bakacak olursak burada bizim işimizi görecek sinyal şeklinin “Toogle/Set” yada “Reset/Set” olduğunu kolaylıkla görebiliriz. Daha detaylı bilgi için datasheet’ten faydalanabilirsiniz.

PWM.c   
//Program  : Sinus -- MSP430 PWM Sine
//Engineer : Orhan YILMAZ
//Web      : www.mafgom.com
//
//Örnekler Linux ortamında Octave GNU
//programı ile PWM in %25 ile %75
//arasına denk düşmek üzere oluşturuldu.
//////////////////////////////////////////
 
#include<msp430g2452.h>
 
unsigned char Wave[]=
{
134, 140, 147, 152, 158, 164, 169, 173,
177, 181, 184, 187, 189, 191, 192, 192,
192, 191, 189, 187, 184, 181, 177, 173,
169, 164, 158, 152, 147, 140, 134, 128,
122, 116, 109, 104, 98, 92, 87, 83, 79,
75, 72, 69, 67, 65, 64, 64, 64, 65, 67,
69, 72, 75, 79, 83, 87, 92, 98, 104, 109,
116, 122, 128
};
 
unsigned char T = 0;
unsigned char freq = 0;
 
void main()
{
 
	WDTCTL = WDTPW + WDTHOLD;
 
	//16 Mhz
	DCOCTL = 0x60;
	BCSCTL1 = 0x8F;
 
	//Giriş - Çıkış bitleri
	P1DIR |= 0x01;
	P1OUT = 0x00;
	P1IE |= 0x08; //P1.3 portuna Kesme Aktif et..
 
		//Clk kaynağı,Ön ölçekleyici,Mod seçimi..
	TACCTL0 = CCIE + OUTMOD_6 + OUT;
	TACCTL1 = CCIE + OUTMOD_6 + OUT;
	TACCR1 = Wave[T]; //PWM başlangıç duty cycle değeri
	TACCR0 = 256;
 
	//SMCLK = 16MHz
	TACTL = TASSEL_2 + ID_1 + MC_1 + TAIE + TACLR;
 
	_BIS_SR(GIE);//Kesme izinlerini ver
 
	while(1) //Sonsuz döngü.. (Kesmeleri bekle!)
	;
}
 
#pragma vector = TIMER0_A0_VECTOR
interrupt void ta0kesmesi()
{
	if(TAIV == 10)
	{
		P1OUT |= 0x01;
		TACCR1 = Wave[T];
		T ++;
		T = (T+freq) % 64;
	}
}
 
#pragma vector = TIMER0_A1_VECTOR
interrupt void ta1kesmesi()
{
	if(TAIV == 2)
	{
		P1OUT &= ~0x01;
	}
}
 
#pragma vector = PORT1_VECTOR //Buton kesmesi. Frekansi buton ile değiştirmek için
interrupt void P1kesmesi()
{
	freq ++;
	freq %= 6;
	P1IFG &= ~0x08;
}

Bunun ardından artık P1.0 pininden yani kırmızı led bağlı olan pin çıkışından pwm’i scop aracılığı ile gözlemleyebiliriz.

Görüldüğü gibi yaklaşık 28 kHz frekanslı bir pwm sinyali oluşturmuş olduk. Gözlemlerde sec/div ayarını küçültürseniz, derbe genişliklerinin değiştiğini görebilirsiniz.

Bundan sonraki aşamada ise bir alçak geçiren filtre uygulamaya kalıyor. Bu işlemi sabit bir frekans için basit bir RC filtre ile bile yapabiliyoruz. Neden sabit derseniz, frekans arttıkça kazanç filtre ile düşmeye başlıyor ondan. Yani genlik azalmaya başlıyor. Ben çıkışa direk 4k7 direnç ardından 33nF çift kutuplu yani aynından kaskat olarak 2 adet bağladım ve en sondaki dirençten 100nF kondansatör ile çıkış aldım. Sonuç gayet tatmin edici oldu. Bu arada genliği ayarlayabilmek için ikinci direnç yerine potansiyometre bağlayıp öyle gözlemledim. Örnek devreyi aşağıda görebilirsiniz.

Aktif filtre takılarak daha temiz sinyal elde edilebilir diye düşünüyorum. Benim elde ettiğim sinyal aşağıdaki.

İyi çalışmalar. Kolay gelsin.

 

Orhan YILMAZ

——–
Kaynak: En baştaki resim, “http://www.softwareforeducation.com/wikileki/index.php?title=Digital_Modulation” adresinden temin edildi.

PWM de timer kesmeleri için MSP430Gxx User guide

Bu yazının kalıcı bağlantısı https://www.mafgom.com/msp430g2452-ile-sinus-sinyal-jeneratoru/