Başlangıç > Donanım/Yazılım > PIC16F877 ile 8 Step Motor

PIC16F877 ile 8 Step Motor

PIC16F877 ile 8 unipolar step motor sürülebilir mi? Hesap edelim. Unipolar her motor 4 pinli, 8×4 den 32 I/O lazım ki PIC ile ilişkilendirebilelim. Her motora da 2 şer adet ileri geri butonu ile kontrol edersek 2×8 den 16 I/O eder. Toplamda 48 I/O. PIC16F877 de var olan pin sayısından da fazla.

Eğer 1 adet motor sürse idik, 4 pinin alacağı değerler 1000, 0100, 0010, 0001 şeklinde 4 farklı pozisyon olacaktı. Kısaca 1, 2, 3 ve 4. Bu durumu 0, 1, 2 ve 3 şeklinde yazarsak, bu sayıları 2 bitlik bir değişken olarak tanımlayabiliriz. 0 için 00, 1 için 01, 2 için 10, 3 için 11. Aslında yaptığımız iş 10 luk sistemi 2 lik sisteme çevirmekten ibaret. Dolayısı ile PIC çıkışını her bir motor için 2 bitlik düşünüp, bu 2 biti 10luk sisteme çevirdiğimizde istediğimiz olacaktır. Bu işi yapabilecek marifetli entegre ise CD4028 dir.

CD4028 çıkışlarını ise ULN2003A ile sürerek step motorlara uygulayabiliriz. 8 buton ise PIC in bir portu üzerinden tarama mantığı ile sürülmektedir.

#include <htc.h>

struct
{
union
{
unsigned char All;
struct
{
unsigned char Number1Reverse:1;
unsigned char Number1Forward:1;
unsigned char Number2Reverse:1;
unsigned char Number2Forward:1;
unsigned char Number3Reverse:1;
unsigned char Number3Forward:1;
unsigned char Number4Reverse:1;
unsigned char Number4Forward:1;
}Stepper;
}Part1;

union
{
unsigned char All;
struct
{
unsigned char Number5Reverse:1;
unsigned char Number5Forward:1;
unsigned char Number6Reverse:1;
unsigned char Number6Forward:1;
unsigned char Number7Reverse:1;
unsigned char Number7Forward:1;
unsigned char Number8Reverse:1;
unsigned char Number8Forward:1;
}Stepper;
}Part2;
}Buttons;

struct
{
union
{
unsigned char All;
struct
{
unsigned char Number1Value:2;
unsigned char Number2Value:2;
unsigned char Number3Value:2;
unsigned char Number4Value:2;
}Stepper;
}Part1;

union
{
unsigned char All;
struct
{
unsigned char Number5Value:2;
unsigned char Number6Value:2;
unsigned char Number7Value:2;
unsigned char Number8Value:2;
}Stepper;
}Part2;
}Positions;

bit bitButtonScanner;
bit bitStepperOperation;

void main(void)
{
unsigned char bSpeed;

PSPMODE=0;
TRISC=TRISD=0x00;
TRISB=0xFF;

ADCON1=0x06;
TRISA=0x38;

PORTC=0x00;
PORTD=0x00;

//Timer 0
//Freq = 15.26 Hz
T0CS = 0;
T0SE = 0;
PSA = 0;
PS2 = 1;
PS1 = 1;
PS0 = 1;
TMR0 = 0;
T0IE=1;

//Timer 2
bSpeed=(PORTA>>3)&0x07;
//Freq = 15.32 Hz
T2CON |= 120;
TMR2ON = 1;
T2CKPS1 = 1;
T2CKPS0 = 0;
PR2 = 36*bSpeed+3;
TMR2IE=1;
PEIE=1;

GIE=1;

while(1)
{
if(bitStepperOperation)
{

if(Buttons.Part1.Stepper.Number1Reverse) Positions.Part1.Stepper.Number1Value–;
if(Buttons.Part1.Stepper.Number1Forward) Positions.Part1.Stepper.Number1Value++;
if(Buttons.Part1.Stepper.Number2Reverse) Positions.Part1.Stepper.Number2Value–;
if(Buttons.Part1.Stepper.Number2Forward) Positions.Part1.Stepper.Number2Value++;
if(Buttons.Part1.Stepper.Number3Reverse) Positions.Part1.Stepper.Number3Value–;
if(Buttons.Part1.Stepper.Number3Forward) Positions.Part1.Stepper.Number3Value++;
if(Buttons.Part1.Stepper.Number4Reverse) Positions.Part1.Stepper.Number4Value–;
if(Buttons.Part1.Stepper.Number4Forward) Positions.Part1.Stepper.Number4Value++;
if(Buttons.Part2.Stepper.Number5Reverse) Positions.Part2.Stepper.Number5Value–;
if(Buttons.Part2.Stepper.Number5Forward) Positions.Part2.Stepper.Number5Value++;
if(Buttons.Part2.Stepper.Number6Reverse) Positions.Part2.Stepper.Number6Value–;
if(Buttons.Part2.Stepper.Number6Forward) Positions.Part2.Stepper.Number6Value++;
if(Buttons.Part2.Stepper.Number7Reverse) Positions.Part2.Stepper.Number7Value–;
if(Buttons.Part2.Stepper.Number7Forward) Positions.Part2.Stepper.Number7Value++;
if(Buttons.Part2.Stepper.Number8Reverse) Positions.Part2.Stepper.Number8Value–;
if(Buttons.Part2.Stepper.Number8Forward) Positions.Part2.Stepper.Number8Value++;

PORTC=Positions.Part1.All;
PORTD=Positions.Part2.All;

bitStepperOperation=0;
}
}
}

void interrupt ISR(void)
{
//Button operations
if(T0IF)
{
T0IF=0;
bitButtonScanner^=1;
if(bitButtonScanner) { Buttons.Part2.All=PORTB; RA0=1; RA1=0; }
else { Buttons.Part1.All=PORTB; RA0=0; RA1=1; }
}

//Stepper operations
if(TMR2IF)
{
TMR2IF=0;
RA2^=1;
bitStepperOperation=1;
}

}

Program oldukça basittir. Özetle; Yazılımda 2 adet timer kullanılmaktadır. Bunlardan biri buton taraması içindir diğeri ise motor adımları arasındaki süre için kullanılmaktadır. Buton taramasında her step motora ait ileri ve geri bit değişkenleri bulunmaktadır. Bu değişkenler step motorun o anki pozisyonunu belirler. Bu pozisyon değeri ileri yön için 1 artırılır geri için bir azaltılır. Her step motor kontrolü için PIC portunda 2 adet pin ayrılmıştır, buda yazılımda 2 bitlik değişkene tekabül eder. PIC portuna bağlı CD4028 entegreleri ile bu değişkenler 1 of 10 dekoder mantığı ile step motor sürme palslerine dönüşür. Yani portun 2 bitlik değişkeninin aldığı değerin onluk karşılığı 4028 in çıkış pinlerine yazılmış olur. ( 2 bitlik değer 0 ise Q0 high olur 1 ise Q1 high olur 2 ise Q2high olur 3 ise Q3 high olur ) Diğer timer step motor sürme işlemleri için kullanılır. Bu timer her kesme ürettiğinde bir biti set eder ve bu bit main döngüsünde sürekli kontrol edilerek set olduğu anda buton bilgilerine göre step motor pozisyonları ayarlanır ve son olarak bit silinir. Ayrıca donanımda kullanılan 3 dip switch motorların hız ayarları içindir ve sadece ilk enerjilendiğinde okunur.

Firmware (Farklı kaydedip dosya uzantısını .rar olarak değiştirin)

ISIS Simulasyonu (Farklı kaydedip dosya uzantısını .rar olarak değiştirin)


Reklamlar
Kategoriler:Donanım/Yazılım Etiketler:,
  1. 11 Ocak 2012, 21:01

    emeğinize sağlık. çok çaba sarfedilmiş bu 8 step motor için.

  1. No trackbacks yet.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: