MSP430 ile 5×7 Dot Matrix Display Değişen Yazı Yapımı

İyi günler arkadaşlar, bu blog ile ilk tanışma projem olduğu için yanlışlarım eksiklerim olabilir bu konuda sizden özür dileyerek başlamak istiyorum.

Bu projemde 1 tane 74HC4017 (CD4017 de kullanabilirsiniz) entegresi bir adet 5×7 Dot Matrix display (ortak katot) ve MSP430 kullandım.  Direnç kullanmadım çünkü direnç hem displayin parlaklığını azaltacak hem de devre üzerinde gerksiz elemana sebep olacaktır. Ledler sürekli yakıp söndürülerek gerekli olan tasarruf sağlanabilir ve ledlerin patlaması ortadan kaldırılabilir. 5×7 matrix display sürerken işlemi aşağıdan yukarıya taramalı yaptığım için (yönünü siz ayarlayabilirsiniz) dirence ihtiyaç duymadım. MSP430 un çıkış gücü yeterli olduğundan ledleri yakarken transistörle kuvvetlendirmeye de ihtiyaç duyulmamıştır.

 

Program arasında sürekli bekleme cycle’ı kullanmamın nedeni ise bekleme eklenmediğinde bazı ledlerin yanmaması.  Çünkü port çıkışı lojik 1 olamadan 0 olma şartı geldiğinde port lojik 1

üretememektedir.

Her harf oluştuğunda 4017 nin reset ucu aktif edilmelidir.

harflerin geçiş süresi for döngüsünden ayarlanabilir.

Harf Oluşturma:

Oluşturulan harf alttan başlanarak oluşturulmalıdır. Bu sadece benim oluşturduğumda geçerli üstten alta tarama yaptırırsanız aynı sırada hex kodlarını girmelisiniz.

E Harfi

0000001
0111101
0111101
0000101
0111101
0111101
0000001

for(i=0; i<110 ;i++)
 {
 P1OUT = 0x01;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x3D;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x3D;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x05;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x3D;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x3D;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x01;
 _delay_cycles(100);
 P1OUT = 0xFF;
 _delay_cycles(550);
 }

D Harfi

0000101
0111001
0111001
0111001
0111001
0111001
0000101

for(i=0; i<110; i++)
 {
 P1OUT = 0x05;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x39;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x39;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x39;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x39;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x39;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x05;
 _delay_cycles(100);
 P1OUT = 0xFF;
 _delay_cycles(550);
 }

K Harfi

0111001
0110101
0101101
0011101
0101101
0110001
0111001

for(i=0; i<110; i++)
 {
 P1OUT = 0x39;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x35;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x2D;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x1D;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x2D;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x35;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x39;
 _delay_cycles(100);
 P1OUT = 0xFF;
 _delay_cycles(550);
 }
R Harfi
0000101
0111001
0111001
0000101
0101101
0110101
0111001


for(i=0; i<110; i++)
 {
 P1OUT = 0x39;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x35;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x2D;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x05;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x39;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x39;
 _delay_cycles(100);
 P1OUT = 0x7c;
 _delay_cycles(550);
 P1OUT = 0x05;
 _delay_cycles(100);
 P1OUT = 0xFF;
 _delay_cycles(550);
 }

Kaynak Kodu
//***********************************************************
//	Ekrem Kursad DAL
// 	5x7 Dot matrix degisen harfle yazi yazma
//
//***********************************************************
 
#include <msp430g2231.h>
int i;
 
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR = 0xFF;
 
ab: 
 
//1=clk 2=reset
//E harfi
	for(i=0; i<150 ;i++)
	{
		P1OUT = 0x01;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x3D;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x3D;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x05;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x3D;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x3D;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x01;
		_delay_cycles(100);
		P1OUT = 0xFF;
		_delay_cycles(550);
	}
 
//K harfi
	for(i=0; i<150; i++)
	{
		P1OUT = 0x39;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x35;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x2D;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x1D;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x2D;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x35;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x39;
		_delay_cycles(100);
		P1OUT = 0xFF;
		_delay_cycles(550);
	}
 
//R harfi
	for(i=0; i<150; i++)
	{
		P1OUT = 0x39;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x35;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x2D;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x05;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x39;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x39;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x05;
		_delay_cycles(100);
		P1OUT = 0xFF;
		_delay_cycles(550);
	}
 
//E harfi
	for(i=0; i<150 ;i++)
	{
		P1OUT = 0x01;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x3D;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x3D;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x05;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x3D;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x3D;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x01;
		_delay_cycles(100);
		P1OUT = 0xFF;
		_delay_cycles(550);
	}
 
//M harfi
	for(i=0; i<150 ;i++)
	{
		P1OUT = 0x39;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x39;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x39;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x39;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x29;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x11;
		_delay_cycles(100);
		P1OUT = 0x7c;
		_delay_cycles(550);
		P1OUT = 0x39;
		_delay_cycles(100);
		P1OUT = 0xFF;
		_delay_cycles(550);
	}
 
_delay_cycles(2000000);
 
goto ab;
 
}
Genel içinde yayınlandı | Yorum bırakın

Step Motor Nedir? Nasıl Çalışır?

Adını sıkça duyduğumuz step motorları tecrübesiz arkadaşlara anlatarak önbilgi sahibi olmaları için bu başlığı açıyorum. Sizlere kısaca iç yapısı, nasıl çalıştığı ve bir MCU ile nasıl kontrol edilebileceğini anlatacağım.

Step motor Türkçe adıyla adım motoru; motorun hızı ne kadar döneceği belli bir açıya bağlı olarak ayarlanabilen motorlardır. Direk enerji vererek çalıştırılması mümkün olmayan tip motorlardır. Örneğin bir araç motorunu düşünürsek pistonlarda belli zamanlarda belli yanma odaları ateşlenerek çalıştırılır. Step motorlarda aynen bu şekilde belli anlarda belli uçların enerjilenmesi gerekir yoksa motor çalışmaz. Bunun için step motor sürücüleri ortaya çıkmıştır(ULN2003). Ancak microcontroller kullanıldığı zaman istenirse sürücü kullanmadan da çalıştırılabilir. Tabi bu durumda transistör elemanına ihtiyaç vardır. Burada kullanılan transistör motorun gücüne bağlı olacak şekilde seçilmelidir. Düşük güçlü bir motor çalıştırılırken To kılıf BJT, FET yeterliyken. Yüksek güçlerde soğutuculu tip transistörler daha uygun olur.

Motorun herhangi   bir  uyartımda, rotorun yapacağı hareketin ne kadar olacağı, motorun adım açısına bağlıdır.  Adım açısı, motorun yapısına bağlı olarak 90, 45, 18, 7,5, 1,8… derece veya çok daha değişik açılarda olabilir Motora  uygulanacak  sinyallerin  frekansı  değiştirilerek  motorun  hızı  da  kontrol  edilebilir.  Adım motorlarının dönüş yönü ise, uygulanan sinyallerin sırası değiştirilerek, saat ibresi yönünde  veya saat ibresinin tersi yönünde olabilir.

Aşağıdaki resimde bir step motorun nasıl çalıştığını görebiliriz.

Step Motor Çeşitleri

Üç ana tipte step motor bulunmaktadır.

– Sabit mıknatıslı step motor

– Hibrid senkron(eş zaman) step motor

– Değişken relüktanslı step motor

İki Fazlı Step Motorlar

İki fazlı step motorlarda bipolar ve unipolar olmak üzere iki farklı elektromanyetik bobin sarım şekli vardır.

Bipolar step motorlar; faz başına tek sargı düşen motorlara denir. Sargıdaki akımı ters yöne döndürmek için manyetik kutbu ters yöne döndürmek gereklidir. Bipolar motorlar çift kutuplu olup, her iki yönden de akım akabilen motorlardır. Bipolar motorların genelde 4 ucu bulunur.

Unipolar step motorlar; tek yönlü besleme olup, sadece tek yönde akım ileten motorlardır. 5 ve 6 kablolu çeşitleri vardır. 6 Kablolu çeşidinde 2 ortak uç bulunur. Bunlar genellikle birleştirilerek tek bir besleme ucu varmış gibi kullanılırlar.

Bipolar ve Unipolar Step motorları kıyaslarsak

Unipolar motorların kontrolü kolaydır.

Bipolar step motorda daha az bobin olduğundan dolayı daha kalın bobin kullanılabilir. Bu da motorun daha fazla akım çekerek yüksek torklarda çalışabilmesine olanak sağlar.

Ortak Ucun Bulunması     
Step  motorlarda genellikle 5 veya 6 kablo bulunur. 5 kablolu step motorlarda bir, 6 kablolu step motorlarda ise iki kablo ortak uçtur ve bu uçlar kaynağın pozitif(+) kutbuna bağlanırlar.

Kaynağın pozitif (+) kutbuna bağlanacak ortak uçları ölçü aletinin ohm kademesini kullanarak bulmak mümkündür. Ölçü aleti ohm kademesinde iken step motorun bobin uçlarına bağlı kablolar arasındaki direnç ölçülür. Step motorlar ister 5, ister  6 kablolu olsun tüm uçlar arasında eşit dirence sahip olan uç ortak uçtur.

6  Kablolu step motorlarda kablolar üçerli olarak iki grup şeklindedir. Her gruptaki bir kablo ortak ucu temsil eder. Ölçüm yapılırken her iki grup kendi aralarında ölçülerek ortak uç tespit edilir. Bu işlem için ölçü aleti ohm kademesinde iken ilk gruba ait üç kablo ayrı ayrı kendi aralarında ölçülür. Tüm uçlar arasında eşit direnç gösteren uç, ortak uçtur yada ölçüm sonucunda bütün dirençlerden sadece biri farklı ise o farklı olan uç ortak uçtur. Aynı işlem ikinci grup içinde tekrarlanır. Ölçüm sonucunda her iki ortak uca göre iki grupta da eşit direnç değerleri elde edilir. Bu dirençlerin değerleri her step motor için farklı olabilir. Step motorlara ait bobin kabloları farklı renklerle  temsil edilirler. Bu renkler 6 kablolu step motorlarda genellikle her grup için aynı şekilde tekrarlanır.

Step Motorları Sürmek 

Step motorları tek fazlı yada iki fazlı şekilde sürebiliriz. Tek fazlı sürerken; her bobine sırayla enerji verilerek dönmesi sağlanır. Bu yöntem genelde tek başına tercih edilmez çünkü iki fazlı sistem daha kullanışlı olup, “tam adım sürme” ve “yarım adım sürme” olarak ikiye ayrılır.

Tam adım sürme işleminde 4 uçtan belli 2 uç aynı anda enerjilendirilir. Bu tek fazlı sürmeye göre motorun torkunu 2 kat artırırken 2 kat daha fazla akım çekmesine neden olur.

Yarım adım sürme işleminde ise tek fazlı ve tam adım sürmedeki işlemler birlikte arka arkaya uygulanır. Bu şekilde 90 derecelik adım açısına sahip step motoru 45 derece döndürebiliriz. Bu yöntemle step motorlar çok daha hassas, kısa adımlarla döndürülebilir.

Aşağıdaki tablolar nasıl sürüldüğünü göstermektedir.

Yararlanılan Kaynaklar:

http://www.societyofrobots.com/member_tutorials/node/28

http://www.endofcode.com/eskiyazilar/pic-16f628a-ile-unipolar-step-motor-kontrolu/ 

Genel içinde yayınlandı | Yorum bırakın

Step Motor Uygulaması 1: Step motoru Yarım Adım ve Tam adım olarak sürmek

Bu uygulamamızda Step Motoru tam adım ve yarım adım olarak ileri yada geri olarak çalıştıracağız. Step motor konusunda bilgi sahibi olmayanlar BURAYA tıklayarak daha ayrıntılı bilgi sahibi olabilirler.

Devre aşağıdaki diyagrama göre kurulmuştur. Ancak bu devre sadece düşük güçlü 5V ile çalışabilen step motorlar için uygundur.  Devrenin beslemesi için Launchpad in VCC ve GND beslemesi yeterlidir.

Eğer 12V yada 24V luk step motorlarla çalışılacaksa Transistörlerin Emiter ve Kollektröü arasına ters diyotlar ve transistörün base’i ile MCU arasına da koruma direnci eklenmelidir. Eğer devre hayati bir yerde kullanılacak ise bu şekilde kullanımda kafi gelmez. Bu durumda Optokuplör (4N25) ile devre ile MCU izole edilmelidir. Burada benim kullandığım motor eski HP Inkjet yazıcılardan sökülmüş olan kartuş park etme kafasındaki motordur.

Motoru İleri Yarım Adım Sürmek

  • 0001
  • 0011
  • 0010
  • 0110
  • 0100
  • 1100
  • 1000
  • 1001
//***********************************************************
// Ekrem Kursad DAL
// step motor surme
//
//***********************************************************
 
#include <msp430g2231.h>
 
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR = 0xFF;
ab: 
 
	P1OUT = 0x01;
	_delay_cycles(6000);
	P1OUT = 0x03;
	_delay_cycles(6000);
	P1OUT = 0x02;
	_delay_cycles(6000);
	P1OUT = 0x06;
	_delay_cycles(6000);
	P1OUT = 0x04;
	_delay_cycles(6000);
	P1OUT = 0x0C;
	_delay_cycles(6000);
	P1OUT = 0x08;
	_delay_cycles(6000);
	P1OUT = 0x09;
	_delay_cycles(6000);
 
goto ab;
 
}


Motoru  İleri Tam Adım Sürmek 

  • 0001
  • 0010
  • 0100
  • 1000
//***********************************************************
// Ekrem Kursad DAL
// step motor surme
//
//***********************************************************
 
#include <msp430g2231.h>
 
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR = 0xFF;
ab: 
 
	P1OUT = 0x01;
	_delay_cycles(12000);
	P1OUT = 0x02;
	_delay_cycles(12000);
	P1OUT = 0x04;
	_delay_cycles(12000);
	P1OUT = 0x08;
	_delay_cycles(12000);                            
 
goto ab;
 
}

 Motoru İleri İki Kat Daha Fazla Tork İle Tam Adım Sürmek

  • 0011
  • 0110
  • 1100
  • 1001 
//***********************************************************
// Ekrem Kursad DAL
// step motor surme
//
//***********************************************************
 
#include <msp430g2231.h>
 
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR = 0xFF;
ab: 
 
	P1OUT = 0x03;
	_delay_cycles(12000);
	P1OUT = 0x06;
	_delay_cycles(12000);
	P1OUT = 0x0C;
	_delay_cycles(12000);
	P1OUT = 0x09;
	_delay_cycles(12000);                            
 
goto ab;
 
}


Motoru Geri Olarak Tam Adım Yada Yarım Adım Olarak Sürmek

Burada yapmamız gereken motora verdiğimiz verdiğimiz sırayı ters çevirmektir. Yani ilk olarak en alt satırdaki komut işlemelidir. Bu şekilde ters olarak enerjilendirdiğimizde motor ters dönecektir. Burada temel mantık aynı olduğu için sadece Geri Tam Adım Sürmeyi vereceğim.

  • 1000
  • 0100
  • 0010
  • 0001 

 

//***********************************************************
// Ekrem Kursad DAL
// step motor surme
//
//***********************************************************
 
#include <msp430g2231.h>
 
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR = 0xFF;
ab: 
 
	P1OUT = 0x08;
	_delay_cycles(12000);
	P1OUT = 0x04;
	_delay_cycles(12000);
	P1OUT = 0x02;
	_delay_cycles(12000);
	P1OUT = 0x01;
	_delay_cycles(12000);                            
 
goto ab;
 
}



Genel içinde yayınlandı | Yorum bırakın

Step Motor Uygulaması 2: MSP430 ile butona basınca dönen step motor

Uygulama 1: Butona basınca dönen step motor

Bu projemde step motoru MSP430’un P1.3 portundaki buton ile kontrol edeceğim. Butona bastığım kadar step motorun dönmesini sağlamak istiyorum. Bu durumda her dönüşte buton kontrolü yapması gerekir ki buton bırakıldığında neredeyse anında durabilsin.

//***********************************************************
//	Ekrem Kursad DAL
// 	Butona basinca donen step motor
//
//***********************************************************
 
#include <msp430g2231.h>
 
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR = 0xF7;
 
ab: 
 
	if (!(P1IN & 0x08))
	{P1OUT = 0x01;
	_delay_cycles(10000);}
	if (!(P1IN & 0x08))
	{P1OUT = 0x03;
	_delay_cycles(10000);}
	if (!(P1IN & 0x08))
	{P1OUT = 0x02;
	_delay_cycles(10000);}
	if (!(P1IN & 0x08))
	{P1OUT = 0x06;
	_delay_cycles(10000);}
	if (!(P1IN & 0x08))
	{P1OUT = 0x04;
	_delay_cycles(10000);}
	if (!(P1IN & 0x08))
	{P1OUT = 0x14;
	_delay_cycles(10000);}
	if (!(P1IN & 0x08))
	{P1OUT = 0x10;
	_delay_cycles(10000);}
	if (!(P1IN & 0x08))
	{P1OUT = 0x11;
	_delay_cycles(10000);}
 
goto ab;
 
}


 Uygulama 2: Butona basınca bir tam tur dönen step motor

Bu uygulamada yapmak istediğim şey butona bastığımda bir motorun tam 1 tur dönmesidir. Burada döngünün 12 kere tekrarlanması ile elimdeki motor bir tur dönmekte. Bu motordan motora farklı olabilir. Burada yapmış olduğum devredeki beklenmedik bir hatayı da yazılımla düzelttim. Bunu da sizinle paylaşmak istiyorum.

 

//***********************************************************
//	Ekrem Kursad DAL
// 	Butona basinca donen step motor duzeltilmis
//
//***********************************************************
 
#include <msp430g2231.h>
int i;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR = 0xF7;
	P1OUT = 0x00;
	_delay_cycles(100000);
ab: 
 
	if (!(P1IN & 0x08))
	{
		_delay_cycles(10000);
		goto isle;
	}
	else
	{
		goto ab;
	}
 
isle:	for(i=0; i<12 ;i++)
		{
		_delay_cycles(10000);
		P1OUT = 0x01;
		_delay_cycles(10000);
		P1OUT = 0x03;
		_delay_cycles(10000);
		P1OUT = 0x02;
		_delay_cycles(10000);
		P1OUT = 0x06;
		_delay_cycles(10000);
		P1OUT = 0x04;
		_delay_cycles(10000);
		P1OUT = 0x14;
		_delay_cycles(10000);
		P1OUT = 0x10;
		_delay_cycles(10000);
		P1OUT = 0x11;
		_delay_cycles(10000);
		}
		P1OUT = 0x00;
goto ab;
 
}

							
Genel içinde yayınlandı | Yorum bırakın

Step Motor Uygulaması 3: MSP430 ile step motor hız uygulamaları

Öğrenciliğimde yapmış olduğum bir projem. Umarım faydalı olur. Bugün baktığımda kodlarımın aslında ne kadar amatör olduğunu görüyorum.

Bu uygulamada motorun teknik terim olarak “kalkış rampası” ve “durma rampası” nasıl ayarlanacağını göstereceğim aynı zamanda da hız kontrolünün nasıl yapıldığını da göreceğiz.

Kalkış ve durma rampaları makinelerde motorun birden hareket etmesinin doğuracağı problemleri gidermek için kullanılırlar. Motorun çalışma ve durma ivmelerini temsil ederler. Örnek verirsek motor birden hızlandığında dişlilerde, kasnaklarda zorlamalardan dolayı çok fazla aşınma, motorda atmalar, motor sargılarında bozulmalar, sargıların yanması, ani enerji yüklenmesi meydana gelebilir. Bunların her biri makinenin doğru çalışmamasına yada istenilen sonucun elde edilememesine neden olur.

Step motorlarda dönüş hızı verilen sinyalin frekansı ile ayarlanır. Frekans arttıkça hız artar, ta ki motor gelen frekansa tepki veremeyene kadar. Frekans çok arttığında motor durur ve titremeye başlar. Bu nedenle uygulamada frekans belli bir düzeyi geçmemelidir.

Uygulama yaparken motorun hızını araya eklediğimiz gecikmeleri ayarlayarak yapabiliriz. Code composer studio_delay_cycles () komutuna sadece integer eklememize izin verdiği için 10 Cycle lık gecikmeyi tekrarlatarak gecikmeleri ayarladım.

Butonla yavaşlatılsın şeklinde istenseydi s integer değeri başta düşük tutulup sonrasında -50 yerine +50 yazılarak yapılabilirdi. Burada 50 değerinin artması motorun hızlanma yada yavaşlama ivmesini artırır. Bu şekilde motorun kalkışı ve durması ayarlanarak yukarıda belirttiğim sorunların yaşanması engellenebilir.

//***********************************************************
//	Ekrem Kursad DAL
// 	Step motor hizlandirma
//
//***********************************************************
 
#include <msp430g2231.h>
int i, s;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR = 0xF7;
	P1OUT = 0x00;
	_delay_cycles(100000);
	s=4000;
 
ab: 
 
		if (!(P1IN & 0x08))
		{
			_delay_cycles(1000);
			s=s-50;
		}
 
		for(i=0; i<s ;i++)
			{
				_delay_cycles(10);
			}
		P1OUT = 0x01;
		for(i=0; i<s ;i++)
			{
				_delay_cycles(10);
			}
		P1OUT = 0x02;
		for(i=0; i<s ;i++)
			{
				_delay_cycles(10);
			}
		P1OUT = 0x04;
		for(i=0; i<s ;i++)
			{
				_delay_cycles(10);
			}
		P1OUT = 0x10;
		for(i=0; i<s ;i++)
			{
				_delay_cycles(10);
			}
 
		if (s<600)
		{
			s=600;
		}
 
goto ab;
 
}



Genel içinde yayınlandı | Yorum bırakın