Xc8 ile step motor kontrol devresi

Katılım
6 Ara 2017
Mesajlar
5
Puanları
1
Yaş
21
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.




#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

  • 236.7 KB Görüntüleme: 4

Sponsor Bağlantı

Forum istatistikleri

Konular
107,731
Mesajlar
759,900
Kullanıcılar
400,104
Son üye
sedatyumruktay

Yeni konular

Üst