G

Çizgi İzleyen İçin PWM Kontrolü

Başlatan GRaFiT, 12 Mayıs 2012, 10:48:10

GRaFiT

Merhaba,
Derste hocamız projeler verdi ve pazartesi gününe kadar teslim etmek zorundayız. Benim projem Çizgi izleyen robot, Robotun elektronik ve mekanik aksamları hazır fakat bir türlü programı yazamadım. Pwm modülünü düzgün kullanamıyorum ve Bilgilerim yetersiz kalıyor.
Proton İde derleyici programı kullanıyorum. İnternette çok araştırdım fakat mantığını çözemedim. Burada normal pwm mi kullanmalıyım ?yoksa donanımsal pwm mi? ve iki motorun hızlarını bir türlü ayarlayamıyorum. Tek pwm de sıkıntı yok ama 2 motoru kontrolde duty ayarlarını ayarlayamıyorum galiba zaten nasıl ayarlanır nasıl hesaplanır onu da tam çözemedim :(

Yardım ederseniz sevinirim.

mierdogan

Ustalar cevap verecektir ama donanım ve kullandığın işlemci hakkında bilgi vermelisin?
"Doğal bir esin arzulu bir isteğe dönüştüğünde, insan hedefine dev adımlarla ulaşır..."

GRaFiT

l298 motor sürücü ile pic 16f877a microişlemciyi kullanıyorum

mierdogan

Acaba diyorum hpwm veya pwm kullanırken çift cikismi kullansan? Veya iki adet pwm ya da senkron tutmaması zamanlayicinin tek olmasindanmi kaynaklanıyor?

Eğer zamanlayici ile alakalı ise tek zamanlayici kullanıldığında her iki çıkış icin fark oluşmazmi? Frekansdan dolayı? Yazılım bilgim yok yeni başladım ama aklıma bunlar geliyor

Saygilar
"Doğal bir esin arzulu bir isteğe dönüştüğünde, insan hedefine dev adımlarla ulaşır..."

ete

2 ayrı motor için kesin olarak iki ayrı hpmw cikisi olan pic kullanılmalıdır.
Ete

GRaFiT

16f877 serisinde iki tane hpwm modülü var mı? acaba hocam

Mucit23

16F876 ve 877 de iki adet Donanımsal PWM modülü var. Bunları kullanman gerekiyor. İşlemcide RC1 ve RC2 bacaklarını bu amaçla kullanabilirsin. Başka Bacaklar olmaz.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

GRaFiT

evet ben bunları bu bacakları kullanarak motorları süreceğim ama motorların devir hızlarını kontrol edemiyorum. Mesela biri %50 diğeri ise %25 ile döndürmek istiyorum ama bu işlemi başaramıyorum. Bu devir kontrollerini nasıl yapacağım. yardımlarınızı bekliyorum.
Şimdiden teşekkürler

ete

Donanımsal (HPWM) ve yazılmsal PWM sinyallerinin kullanılması

Türkçesi Pals Genişliği Düzenleme Ya da değişikliği anlamına gelen Pals Width Modulation kelimelerinden üretilmiş bir sinyal şeklidir. Kare dalga şeklindedir ve iş zamanı denilen HIGH konumunun taplam peryot içindeki genişliği ayarlanarak endüstride motor hız ayarından tutunda ışık parlaklık ayarlarına kadar pek çok yerde kullanılan bir işlemdir.

Burada peryodun süresi içinde yer alan HIGH genişliği Duty değerini ifade etmektedir.
Bu sürenin tamamı %100 değerine karşılık gelir. Diyelimki toplam peryot 100 us. %50 duty süresi 50 us olacaktır. Şayet Duty=%20 alınırsa HIGH genişliği 20us olacaktır. İşte bu sürenin azaltılıp çoğaltılması motor devirinin azaltılıp çoğaltılmasını sağlar.

İşte bu şekilde duty değerini değiştirerek iş zamanını değiştirebilir ve böylece o sinyal ile kontrol edilen elemanları rahatlıkla kontrol edebiliriz.

Basic de İş zamanı veya HPWM için kullanılan iki yöntem vardır. Birincisi,      HPWM kanal, duty,frekans   şeklinde kullanılır. Kanal denilen şey kullandığın işlemcide birden fazla PWM çıkışı var ise hangisini kullanacağındır.  Bu sistem 8 bitlik bir duty çözünürlüğü verir. Bu nedenle duty için kullancağın değer 0-255 arası bir değerdir. 128 değeri tam olarak %50 duty değeri sağlar.
Frekans ise sana kalmış bir hususdur. Motor devir kontrollerinde genellikle 1-10KHz arası frekans tercih edilir. 5 Khz idealdir. Azı motorda inleme sesi çıkartır fazlası ise motor gücünde sorun çıkartabilir.
Bu komut ile motora istediğin hızları verebilirsin.

Diğer yöntemde ise 10 bitlik Duty çözünürlüğü kullanılır ki bunun maalesef direk basic komutu yoktur. Yalnızca işlemci registerlerini kullanarak bunu yapabilirsin.

Şimdi 2 adet HPWM çıkışı olan 16F877 entegresi ile çalışalım ve iki çıkışıda kullanmaya çalışalım.
Frekansımız 10 Khz olacaktır.
Önce CCP1 ve CCP2 pinlerini çıkış olarak ayarlıyoruz.
TRISC.1=0   'CCP2 çıkış pini
TRISC.2=0   'CCP1 çıkış pini

Sonra T2CON registerinden bölme oranını ayarlıyor ve TMR2 yi aktif ediyoruz.
T2CON=%00000101   'bölme oranı ¼ yapıldı
10Khz lik frekans için  PR2 değeri hesaplanırsa ¼ bölme oranı ile 99 değeri bulunacaktır.
PR2= 99

Şimdi %50 duty değerini CCP1 kanalına verelim;  (X=(PR2+1) * %duty/25)
X=(99+1) * 50/25 = 100 * 2= 200 değeri bulunacaktır.
Bunu yerlerine yerleştirelim,
CCP1CON.4=X.0
CCP1CON.5=X.1
CCPR1L=X>>2
Dikkat ederseniz bu sefer farklı bir yol izledik. Her şeyiyaptık ancak henüz sinyal çıkışını aktif etmedik. Bu işi yapan CCP1CON registeri idi.  Sinyali aktif etmek için aşağıdaki yolu da kullanabilirsiniz.
CCP1CON.2=1
CCP1CON.3=1
Bu komutlarla birlikte CCP1 pininden %50 duty değerine sahip 10 Khz lik bir sinyalin çıktığını görebilirsiniz.

Benzer şekilde CCP2 pininden ise %30 duty değerine sahip bir sinyal çıkartalım.
Önce X değerimizi hesaplayalım.(X=(PR2+1) * %duty/25)
X=(PR2+1)* 30/25 =(99+1) * 30 / 25
X=100 * 30 /25 = 120 değeri bulunmuş olur.
X=125
CCP2CON.4=X.0
CCP2CON.5=X.1
CCPR2L=X>>2   ve sinyali aktif etmek içinde;
CCP2CON.2=1
CCP2CON.3=1    komutlarını vererek sinyal çıkışı sağlanır.

Motorları sürmekiçin arada bir sürücü entegre kullanıyor isen bu sürücünün LOW side beslemesini direk PWM ile sürerek hız ayarını yapabilirsin.
Bu konuda sıkıntı çekiyor isen bize şema vermen gerekiyor. Ona göre şurdan gir şuraya uygula gibi öneriler sunabiliriz.

Hepsi bu kadar.
Ete

GRaFiT

Hocam ben dediğiniz gibi kodları yazıp denemek istedim fakat başaramadım. yazdığım kodları yazıyorum.

Device 16F877
XTAL 20
TRISC.1=0
TRISC.2=0
T2CON=%00000101
CCP1CON.4=200
CCP1CON.5=200
CCPR1L=200>>2

CCP1CON.1=1
CCP1CON.2=1

CCP1CON.4=120.0
CCP1CON.5=120.1
CCPR1L=120>>2

CCP2CON.2=1
CCP2CON.3=1

Ayrıca derlerken şu hataları da veriyor

ete

#10
Ben olsam bunları yazdım deyip bu kodları buraya koymazdım. Önce benim yazdıklarımı iyice bir okur sonrada yeniden bu işi yapmaya çalışırdım.

Yazdıklarına bir bak istersen . İpe sapa gelmez şeyler olduklarını göreceksin. Açık açık ne yapılması gerektiğini yazdım.
Artık gerisini halledebilmen gerekir.

Her zaman söylüyorum. Bir şeyi kopyalamaya çalışmayın. Mantığını öğrenip değişikliklere göre gerekenleri yazmayı becermeye çalışın.
Sen bir şeyleri kopyalamışsın ama sonuç felaket.

CCP1CON.4=120.0
CCP1CON.5=120.1
bu satırlar ne anlama geliyor sence? Hiç böyle bir eşitlik bir yerlerde gördünmü Acaba da sen yazdın?

Ete


GRaFiT

Affedersiniz Hocam ben sadece sizin bir üst yanıtınızdaki verdiğiniz örneği anlamaya çalışıyordum. Sanırım anlayamamışım. Ama sizin verdiğiniz bilgileri kullanmaya çalışıyordum. Dediğiniz gibi  pic programlamaya yeni başlayan biri de olsa böyle bir saçmalık yapmaması lazımdı.

Acaba burada bulduğum değerleri hpwm de duty değeri olarak mı yazacağım? Ben yazınızı defelarca okuyuduktan sonra böyle düşündüm doğrumu acaba?

ete

Duty değeri aşağıdaki formül ile hesaplanıyor.
(X=(PR2+1) * %duty/25)
Buradan elde ettiğin X değerini verdiğim açıklamada takip edebileceğin gibi
CCP2CON.4=X.0
CCP2CON.5=X.1
CCPR2L=X>>2 
şeklinde CCP kontrol registerine yerleştiriyoruz. Bu andan itibaren de yeni sinyal şekli çıkış pininden çıkıyor.

Ete

GRaFiT

Hocam sorunu buldum benim derleyici hex dosyalarını yanlış çıkardığı için bir türlü kodlar çalışmıyormuş yardımlarınız için teşekkür ederim

Powered by EzPortal