Ccs c ile limit switchi

Başlatan qnur07, 19 Ağustos 2014, 23:32:18

qnur07

Merhaba arkadaşlar
Ccs c diline yeni başladığım için biraz acemiyim kusura bakmayın :(

Sorunum şu 16f84a ile bir dc motor kontrol sürücüsü yapmaya çalışıyorum toplamda 3 buton bulunuyor bir tanesi start diğer ikisi sağ stop ve sol stop şeklinde limit belirleyecek. Tek buton ile iyi kötü bir sistem kurdum butona bir kere bastığım zaman motor sağa dönmeye başlıyor motorun dönüp durması gerektiği kadar delay verip çıkışı low yapıyorum. butona ikinci basışımda motor sola dönüp bir süre sonra duruyor. Ama bu motorun dönüş hızına voltaj değişikliğine vs. göre delay süresi değişiyor haliyle durması gereken yerde dönüyor veya yarım tur dönüyor yani düzensiz çalışıyor. Bunun yerine limit switchi ile belirlediğim açıda motoru durdurmayı düşünüyorum. Start, Sağ Stop, Sol Stop şeklinde fakat motor sağa dönüp switche basınca duruyor tamam ama o buton sürekli input olduğu için bir sonraki işlemi yaptıramıyorum dış kesme falan hepsini denedim ama olmadı >:( Bu konuda yardımcı olabilirseniz çok sevinirim yapmak istediğim ve sistemi ve yapabildiklerimi aşağıya ekliyorum.
Yapmak istediğim sistem;


Yapabildiğim Sistemi;
http://www.dosya.tc/server34/Xs4VuC/motor_y_n.rar.html
#include "bit.h"

int sayac;

void main ()
{   
   set_tris_a(0x00);
   set_tris_b(0xFF); 

   output_a(0x00);

  while(1)
  {
      if(input(pin_b0))
  {
   sayac++;
   while(input(pin_b0));
   }
   
   if(sayac==0) //eğer sayac 0 a eşitse b0 ve b1 portunu sıfırla
   {
      output_low(pin_a0);
      output_low(pin_a1); 
   }
   
   if(sayac==1) // eğer sayac 1 e eşitse aşşağıdaki işlemleri yap
   {
      output_high(pin_a0);
      delay_ms(1000);
      output_low(pin_a0); 
      sayac++; // işlem sonunda sayacı 1 attır, sayac 1 artınca if dışına çıkıcak
   }
         
    if(sayac==3)//eğer sayac 3 e eşitse aşşağıdaki işlemleri yap
   {
      output_high(pin_a1);
      delay_ms(1000);
      output_low(pin_a1);
      
      sayac=0; //işlemler bitince sayac değerini sıfırla, sayac sıfırlanınca işlem başa döner
   }
    
  } 
}

Kabil ATICI

int calis=0;
örneğin
if(input(pin_b0))
{
//başla/dur işlemleri motor bir yönde dönmeye başlasın
//buton bırakma ile ilgili işlerin göz önüne alınması gerekir. Bunları sana bırakıyoruz.
if(calis==0)
{
calis=1;
//motoru çalıştır örneğin sağa dönerek
}
else
}
calis=0;
//motoru durdur
}.
}

if(calis==1)
{
if(input(pin_b1))
{
//motor yönünü değiştir. örnek  sağa dönsün
//burada birkaç kere denetlemesi yapılması önemli değildir.
}
if(input(pin_b2))
{
//motor yönünü değiştir. örnek sola dönsün
//burada birkaç kere denetlemesi yapılması önemli değildir.
}
}

Sınır anahtar kullanmadan yapmak için encoder tarzı bir ürün kullanman gerekir. Çünkü kontrol sistemi olmayan yapılarda yükün durumuna göre motor hızı değişebileceği için zamanlama ile istenen verimi alamazsın. Şu anki yapmaya düşündüğün sistemden nesnenin konumunu sınır anahtarlarla geri bildirim alıyorsun. Ona göre işlemini sürdürüyorsun.
ambar7

omereliusuk

eğer yanlış anlamadıysam
1. butona bastığınız zaman motoru çalıştıracak. // peki bir defa daha basarsanız duracak mı?
2. buton sag kontrol ediyor. switche geldiği zaman motor tersine dönecek. // ilk sağa döndüğünü varsayıyorum.
3. buton sol kontrol ediyor. switche geldiği zaman motor tersine mi dönecek yoksa orada kalıp 1. butonun hareketini mi bekleyecek.

start butonuna basıldı ve motor önce saga sonra sola hareketini tamamlayıp tekrar start butonuna basılıncaya kadar beklecek mi?
yoksa
start butonuna basıldı ve motor önce saga sonra sola ve harekete sonsuza kadar devam et. tekrar start butonuna (Artık stop butonu) basılınca dur? tekrar starta basılınca yine aynı şeyleri yap mı olacak.

şu anda aklıma iki farklı hikaye geliyor. farklı hikayeler de eklenebilir.

qnur07

Alıntı yapılan: ambar7 - 20 Ağustos 2014, 09:30:23
int calis=0;
örneğin
if(input(pin_b0))
{
//başla/dur işlemleri motor bir yönde dönmeye başlasın
//buton bırakma ile ilgili işlerin göz önüne alınması gerekir. Bunları sana bırakıyoruz.
if(calis==0)
{
calis=1;
//motoru çalıştır örneğin sağa dönerek
}
else
}
calis=0;
//motoru durdur
}.
}

if(calis==1)
{
if(input(pin_b1))
{
//motor yönünü değiştir. örnek  sağa dönsün
//burada birkaç kere denetlemesi yapılması önemli değildir.
}
if(input(pin_b2))
{
//motor yönünü değiştir. örnek sola dönsün
//burada birkaç kere denetlemesi yapılması önemli değildir.
}
}

Sınır anahtar kullanmadan yapmak için encoder tarzı bir ürün kullanman gerekir. Çünkü kontrol sistemi olmayan yapılarda yükün durumuna göre motor hızı değişebileceği için zamanlama ile istenen verimi alamazsın. Şu anki yapmaya düşündüğün sistemden nesnenin konumunu sınır anahtarlarla geri bildirim alıyorsun. Ona göre işlemini sürdürüyorsun.

Aynen kardeşim sınır anahtarı kullanmayınca farklı yüklerde motorun yavaşlaması sonucu, motorun çalışma sürelerini belirleyemiyorum.s O yüzden bir limit butonu ile motorun sağdamı soldamı yani konumunu almam gerekiyor ona göre bir daha ki start verilince tersine dönmesi gerekiyor yukarda verdiğiniz kod bu işlemi yapabilir mi acaba?

qnur07

Alıntı yapılan: omereliusuk - 20 Ağustos 2014, 11:33:03
eğer yanlış anlamadıysam
1. butona bastığınız zaman motoru çalıştıracak. // peki bir defa daha basarsanız duracak mı?
2. buton sag kontrol ediyor. switche geldiği zaman motor tersine dönecek. // ilk sağa döndüğünü varsayıyorum.
3. buton sol kontrol ediyor. switche geldiği zaman motor tersine mi dönecek yoksa orada kalıp 1. butonun hareketini mi bekleyecek.

start butonuna basıldı ve motor önce saga sonra sola hareketini tamamlayıp tekrar start butonuna basılıncaya kadar beklecek mi?
yoksa
start butonuna basıldı ve motor önce saga sonra sola ve harekete sonsuza kadar devam et. tekrar start butonuna (Artık stop butonu) basılınca dur? tekrar starta basılınca yine aynı şeyleri yap mı olacak.

şu anda aklıma iki farklı hikaye geliyor. farklı hikayeler de eklenebilir.

Ben kısaca tekrar özetleyeyim kardeşim şimdi 1 adet start butonumuz var 2 adette sağ ve sol olmak üzere sınır belirmek için buton bulunuyor.
ben devreye enerjiyi verince örneğin motor sağ tarafa dönecek ve sağdaki butona gelip çarpınca motor duracak ve öyle kalacak taki ben start butonuna tekrar basıncaya kadar öyle bekleyecek. Ben start butonuna basınca motor bu sefer beklediği konumun tersine dönecek yani sola, soldaki butona gelince, ben start butonuna basıncaya kadar bekleyecek.   

Dc motorun sağ ve sola dönmesini H köprüsüyle hallettim start butonuda tamam fakat şu sağ butona gelip besınca haliyle butor basılı kalıyor ve bir sonraki işlem için bir hareket veremiyorum sorun bu :S

secilcemal

Bilmiyorum işinize gelir mi, 12f 683 gibi 2. bir pic kullansanız, limit switch ler tetiklendiğinde 12f683 un giriş yatığınız bacağı high olsa ve bu da basla bir bacağı 500ms boyunca high yapıp tekrar low a dönse, bu 2. bacaktan çıkışı da da siz limit switch çıkışı gibi kullansanız, böylece limit switch e basıldığında,mekanik olarak basılı olmasına rağmen  500ms sonra switch bırakılmış gibi olur.
Bakmayın cok bildiğimden değil ama fikir işte..

qnur07

#6
Alıntı yapılan: secilcemal - 05 Eylül 2014, 12:54:57
Bilmiyorum işinize gelir mi, 12f 683 gibi 2. bir pic kullansanız, limit switch ler tetiklendiğinde 12f683 un giriş yatığınız bacağı high olsa ve bu da basla bir bacağı 500ms boyunca high yapıp tekrar low a dönse, bu 2. bacaktan çıkışı da da siz limit switch çıkışı gibi kullansanız, böylece limit switch e basıldığında,mekanik olarak basılı olmasına rağmen  500ms sonra switch bırakılmış gibi olur.
Bakmayın cok bildiğimden değil ama fikir işte..

En azından bir mantık önerdin kardeşim sağolasın. Bir fikir bir fikir daha bir proje yaparmış (: dediğin gibi olduğu zaman sadece çıkış verdğin entegreyi kurtatmaış oluyorsun 683 teki inputlar aynı sorunda kalııyor çünkü switch inputta olduğu sürece diğer işleme izin vermiyor idi takii sonucu bulana kadar (: tek entegre 4 role ile hallettim bilgisayarımı ulaşınca paylaşimde başka arkadaşlarda uğraşmasın :)

emrekantarci

Merhabalar.
Çözümü benim gibi acemi arkadaşlar için  de paylaşabilir misiniz.