Step motor kontrol devresi

Katılım
6 Ara 2017
Mesajlar
4
Puanları
1
Yaş
25
merhabalar;

yapmam gereken şöyle bir proje var; step motorun yön, hız ve adımlarını kontrol eden ve bunları LCD ekrana yazdıran bir devre tasarlamak.

şimdilik yön ve adıma göre bir program yazıp daha sonra geri kalanını üstüne eklemeyi düşünüyorum.

aşağıda yazdığım kodu proteusta kurduğum devrede simüle edince motor kısa bir süreliğine çalıştıktan sonra duruyor.

deneyimli ve bilgili insanlardan tavsiyelerini ve yardımlarını bekliyorum.
Kod:
#include <stdio.h>

#include <stdlib.h>

#include <xc.h>

#include <htc.h>

// CONFIG

#pragma config FOSC = XT // Oscillator Selection bits (XT oscillator)

#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)

#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)

#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)

#pragma config LVP = ON // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)

#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)

#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)

#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)

#define _XTAL_FREQ 4000000 // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#define buton_ileri RA0 //a0 bit'i buton_ileri olarak tanımlandı.

#define buton_geri RA1 //a1 bit'i buton_geri olarak tanımlandı.

#define buton_hiz_azalt RA2 //a2 bit'i buton_hiz_azalt olarak tanımlandı.

#define buton_hiz_arttir RA3 //a3 bit'i buton_hiz_arttir olarak tanımlandı.

#define buton_yarim_adim RA4 //a4 bit'i buton_yarim_adim olarak tanımlandı.

#define buton_tam_adim RA5 //a5 bit'i buton_tam_adim olarak tanımlandı.

const int yarim_adim[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09}; // Step motor yarım adım dönüş adımları tanımlandı.

const int tam_adim[]={0x01,0x02,0x04,0x08}; // Step motor tam adım dönüş adımları tanımlandı.

int i,j,m,n,adim,yon;



void __interrupt () kesme (void)

{

if(T0IF){ // Kesme oldu ise

TMR0=-200; // TMR0'a başlangıç değerini yeniden ata.

if(!buton_ileri)

{

yon=1;

}

if(!buton_geri)

{

yon=0;

}

if(!buton_yarim_adim)

{

adim=1;

}

if(!buton_tam_adim)

{

adim=0;

}

T0IF=0; // Kesme bayrağını sıfırla.

}

}









void main(void) {

TRISA=0xFF; //A Portu giriş olarak ayarlandı.

TRISB=0x00; //B Portu çıkış olarak ayarlandı.

TRISD=0x00; //D Portu giriş olarak ayarlandı.

PORTB=0x00; //B Portu çıkışı sıfırlandı.



if(adim==0&&yon==0)

for(i=3;i>-1;i--)

{

PORTB=tam_adim;

__delay_ms(100);



}

if(adim==1&&yon==0)

for(j=7;j>-1;j--)

{

PORTB=yarim_adim[j];

__delay_ms(100);

}

if(adim==0&&yon==1)

for(m=0;m<4;m++)

{

PORTB=tam_adim[m];

__delay_ms(100);

}

if(adim==1&&yon==1)

for(n=0;n<8;n++)

{

PORTB=yarim_adim[n];

__delay_ms(100);

}



T0CS=0; // TMR0, Timer olarak çalışsın

T0SE=1; // Yükselen kenar tetikleme

PSA=0; // WDT pasif T/C aktif

PS0=1; // Ön yükleyici 111 => 256'e bölünecek

PS1=1; // OSC=4 MHz, Timer => 1Mhz / 256

PS2=1; // Timer bir sayması 256 usn

TMR0=-200; // TMR0=-200 => 256 usn x 200 =51.200 usn

T0IF=0; // TMR0 kesme bayrağını resetle

T0IE=1; // TMR0 kesmesi aktif

GIE=1; // Global kesme aktif



while(1);

}
 

Ekli dosyalar

  • proteus.png
    proteus.png
    236.7 KB · Görüntüleme: 25
Moderatör tarafında düzenlendi:

Forum istatistikleri

Konular
128,179
Mesajlar
915,658
Kullanıcılar
449,940
Son üye
yavuzturan

Yeni konular

Çevrimiçi üyeler

Geri
Üst