16f877 ile step motor kontrol devresi tasarımı hakkında

Katılım
26 Şub 2018
Mesajlar
5
Puanları
1
Yaş
25
Şuanki step motor devresi ileri geri hareket ettiriliyor buna 2 kat ileri 2 kat geri butonları eklemek lazım fakat bunun kodunu birtürlü yazamadım yardımcı olursanız çok sevinirim

Şuanki kodu ve ISIS şeması;

Kod:
#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

// Giriş ve çıkış pinlerine isim atanıyor
#define buton_ileri pin_a0
#define buton_geri pin_a1

int i=0,hiz=10;

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

/********* ANA PROGRAM FONKSİYONU********/

void main ( )
{
 setup_psp(PSP_DISABLED); // PSP birimi devre dışı
 setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
 setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
 setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
 setup_adc(ADC_OFF); // ADC birimi devre dışı
 setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
 setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı

 output_b(0x00);

 while(1) // Sonsuz döngü
 {

 if (input(buton_ileri)) // İLERİ Butonuna basıldı ise
 {
 output_b(yarim_adim); // Step motor 1 adım ileri
 while(input(buton_ileri));// Basılan tuş bırakılana kadar bekle
 delay_ms(hiz); // Adımlar arası bekleme süresi

 if (i==7) // i değişkeni 7 olunca i değeri -1 olsun
 i=-1;
 i++; // i değişkenini 1 arttır

 }

 if (input(buton_geri)) // GERİ Butonuna basıldı ise
 {
 if (i==0) // i değişkeni 0 ise i değeri 8 olsun
 i=8;
 i--; // i değişkenini 1 azalt
 output_b(yarim_adim); // Step motora 1 adım geri
 while(input(buton_geri)); // Basılan tuş bırakılana kadar bekle
 delay_ms(hiz); // Adımlar arası bekleme süresi
 }
 }
}
upload_2018-5-8_21-13-22.png
 
Moderatör tarafında düzenlendi:
Butonlar ile yarım degişkeni ne müdale edin ve tam adım adında degişken oluşturup aynı kodu degişkenleri ve butonları degiştirerek bir daha yazın yada başka buton ile i degişkenini 1 deyil 2 şer olarak artırın
 
Teşekkür ederim yorumunuz için ben yorumunuza dayanaraktan şöyle birşey çıkardım ama isisten sonuç alamadım yanlışım var büyük ihtimal

Kod:
/******************************************************
      PIC16F877 ile Step Motor Uygulaması (ULN2003A İle)
*******************************************************/

#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

// Giriş ve çıkış pinlerine isim atanıyor
#define buton_ileri pin_a0
#define buton_geri  pin_a1
#define buton_ikikatileri pin_a2
#define buton_ikikatgeri pin_a3

int i=0,hiz=10;

const int yarim_adim[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09}; // Step motor yarım adım dönüş adımları
const int tam_adim[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09}; // Step motor tam adım dönüş adımları
/********* ANA PROGRAM FONKSİYONU********/

void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   output_b(0x00);
   output_c(0x00);
 

   while(1) // Sonsuz döngü
   {

      if (input(buton_ileri)) // İLERİ Butonuna basıldı ise
      {
         output_b(yarim_adim);  // Step motor 1 adım ileri
         while(input(buton_ileri));// Basılan tuş bırakılana kadar bekle
         delay_ms(hiz);            // Adımlar arası bekleme süresi

         if (i==7)                 // i değişkeni 7 olunca i değeri -1 olsun
            i=-1;
         i++;                      // i değişkenini 1 arttır

      }

      if (input(buton_geri)) // GERİ Butonuna basıldı ise
      {
         if (i==0)                 // i değişkeni 0 ise i değeri 8 olsun
            i=8;
         i--;                      // i değişkenini 1 azalt
         output_b(yarim_adim); // Step motora 1 adım geri
         while(input(buton_geri)); // Basılan tuş bırakılana kadar bekle
         delay_ms(hiz);            // Adımlar arası bekleme süresi
      }
   }



   while(2) // Sonsuz döngü
   {

      if (input(buton_ikikatileri)) // İLERİ Butonuna basıldı ise
      {
         output_c(tam_adim);  // Step motor 2 adım ileri
         while(input(buton_ikikatileri));// Basılan tuş bırakılana kadar bekle
         delay_ms(hiz);            // Adımlar arası bekleme süresi

         if (i==7)                 // i değişkeni 7 olunca i değeri -1 olsun
            i=-1;
         i+=2;                      // i değişkenini 2 arttır

      }

      if (input(buton_ikikatgeri)) // GERİ Butonuna basıldı ise
      {
         if (i==0)                 // i değişkeni 0 ise i değeri 8 olsun
            i=8;
         i-=-2;                      // i değişkenini 2 azalt
         output_c(tam_adim); // Step motora 2 adım geri
         while(input(buton_ikikatgeri)); // Basılan tuş bırakılana kadar bekle
         delay_ms(hiz);            // Adımlar arası bekleme süresi
      }
   }
}
 
Moderatör tarafında düzenlendi:
İ degişkenini tam adım sürmede kullanmayın önceden yüklü degerleri sıfırlamadan kullanıldığında problem çıkar i yerine başka defişken ile denendiğinde çalışması gerek
 
Sizin dediğiniz gibi eklediğim i değişkenini x değişkeni olarak değiştirdim fakat isis den çıkış alamadım ilk ilk döngü çalışıyor fakat 2. döngü çıkış vermiyor

Kod:
int i=0,hiz=10;
int x=0;

const int yarim_adim[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09}; // Step motor yarım adım dönüş adımları
const int tam_adim[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09}; // Step motor tam adım dönüş adımları
/********* ANA PROGRAM FONKSİYONU********/

void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   output_b(0x00);
 
 

   while(1) // Sonsuz döngü
   {

      if (input(buton_ileri)) // İLERİ Butonuna basıldı ise
      {
         output_b(yarim_adim);  // Step motor 1 adım ileri
         while(input(buton_ileri));// Basılan tuş bırakılana kadar bekle
         delay_ms(hiz);            // Adımlar arası bekleme süresi

         if (i==7)                 // i değişkeni 7 olunca i değeri -1 olsun
            i=-1;
         i++;                      // i değişkenini 1 arttır

      }

      if (input(buton_geri)) // GERİ Butonuna basıldı ise
      {
         if (i==0)                 // i değişkeni 0 ise i değeri 8 olsun
            i=8;
         i--;                      // i değişkenini 1 azalt
         output_b(yarim_adim); // Step motora 1 adım geri
         while(input(buton_geri)); // Basılan tuş bırakılana kadar bekle
         delay_ms(hiz);            // Adımlar arası bekleme süresi
      }
   }



   while(2) // Sonsuz döngü
   {

      if (input(buton_ikikatileri)) // İLERİ Butonuna basıldı ise
      {
         output_b(tam_adim[x]);  // Step motor 2 adım ileri
         while(input(buton_ikikatileri));// Basılan tuş bırakılana kadar bekle
         delay_ms(hiz);            // Adımlar arası bekleme süresi

         if (x==7)                 // x değişkeni 7 olunca i değeri -1 olsun
            x=-1;
         x+=2;                      // x değişkenini 2 arttır

      }

      if (input(buton_ikikatgeri)) // GERİ Butonuna basıldı ise
      {
         if (x==0)                 // x değişkeni 0 ise i değeri 8 olsun
            x=8;
         x-=-2;                      // x değişkenini 2 azalt
         output_b(tam_adim[x]); // Step motora 2 adım geri
         while(input(buton_ikikatgeri)); // Basılan tuş bırakılana kadar bekle
         delay_ms(hiz);            // Adımlar arası bekleme süresi
      }
   }
}

upload_2018-5-9_19-29-27.png


Yönetici Notu: Lütfen "Code" etiketini kullanın!
 
Moderatör tarafında düzenlendi:
While(2) diye bir döngü kuramazsınız döngüyü while 1 içerisine alın while 1 anlamı sürekli çalışmasını isdedimiz kodlar çalışır ccs while (2) kullanılmaz
 
Moderatör tarafında düzenlendi:
A4988 kullanmak daha kolay ve pratik olarak kodda degişiklik yapma dan modül üzerinden pinler ile bir çok adım da sürebilirsin

Mevcut kod ve çizimi ni isis ***@*** gönder bakayım modül ile ilgili örnekler göndereyim
 
Moderatör tarafında düzenlendi:

Forum istatistikleri

Konular
128,177
Mesajlar
915,643
Kullanıcılar
449,938
Son üye
Dragonov

Yeni konular

Geri
Üst