pwm duty oranını sabitlemek

Başlatan bulut_01, 17 Şubat 2013, 01:10:01

bulut_01

iyi geceler picproje ailesi küçük bir algoritma yazılı yanlız takıldıgım nokta 0 dan baslayıp 2000 sonlanan pwm sinyali var 2000 oldugunda port hıgh oluyo ben motor düsük devirde döndürmek istiyorum mesala 0 dan basladım 2000 son(high oldugu deger) ben mesala 400 yada 1000 sabitlemek istiyorum değişkeni asagıdakı algoritmaya nasıl değiştiriyim ki istediğim sekilde çalışsın.
for (i=0; i<2000;i++)
    {
      output_high(pin_a2) ;
      delay_us(i) ;
      output_low(pin_a2) ;
      delay_us(2000-i) ;
      output_high(pin_a2) ;
YENİLMEZ..

burak54

Neden sabit PWM yaratmak için PWM komutunu kullanmıyorsun tam olarak soruyu anlayamadım =)

ete

Sinyalin peryodu 2000 ms ise yani high seviye + low seviye toplamı 2000 ise bu durumda high seviyesini 400 yaparsan low seviyen otomatik olarak 2000-400=1600 olması gerekir.
O halde yapman gereken döngü kurmadan;
Output_high(pin_a2). ;
Delay_us(400)
Output_low(pin_a2)
Delay_us(1600)
Bu aşamadan sonra programı yeniden ilk komut satırına döndürmen gerekir.
Yada en başa while ike bir sonsuz döngü kurarak içine verdiğim satırları yerleştirirsin olur biter.
Aynı mantık high seviyen 1000 ms içinde geçerlidir.
High süresi 1000 ms ise low süren 2000-1000=1000 ms olacaktır
Bu değerleri yukarıdakine benzer şekilde kullanırsan istediğini elde edersin.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

bulut_01

erol hocam öncelikle saolasın senin dedigin sekilde yaparsam sabit pwm elde etmiş olurum benim istedigim ise duty 0 basladı lineer olarak artıs devam ederken 2000 sonlanıyorya ben bu artış olurken örnek duty oranı 700 de sabitlemek istiyorum bu sekilde çalışması için nasıl algoritma kurmalıyım ? 
YENİLMEZ..

ete

Konu başlığı ile isteğin uyuşmamış Yanlış anlaşılıyor.
Ama şimdi anladım. Döngüyü 700 'e kadar kurarsan işin olur. Aslında cevap basit ama sen konudan uzaksın sanırım.
for (i=0; i<2000;i++) satıırn 2000 yerine 700 yazacaksın. Hepsi bu.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

necati

#5
      #include <16f873.h>
#fuses xt,put,nobrownout,nowdt
#use delay(clock=4000000)
int16  i=0,adc=0;
int8   ig=0;

void main(void){

      set_tris_a(0b00000000);
      set_tris_b(0b11111111);
      set_tris_c(0x00);
      port_b_pullups(0b11111111);

while (true){

      output_high(pin_a2);
      delay_us(i);
      output_low(pin_a2);
      delay_us(2000-i);
      output_high(pin_a2);
      if(ig==0){i++;}
      if(i>=1000){i=1000;}
      if(ig==1){i--;}
      if(i<1){i=1;}
     
      if(!input(pin_b6)){ig=0;}
      if(!input(pin_b7)){ig=1;}
}}     
[email]entegreterbiyecisi@yahoo.com[/email]

bulut_01

#6
Alıntı yapılan: ete - 17 Şubat 2013, 11:10:00
Konu başlığı ile isteğin uyuşmamış Yanlış anlaşılıyor.
Ama şimdi anladım. Döngüyü 700 'e kadar kurarsan işin olur. Aslında cevap basit ama sen konudan uzaksın sanırım.
for (i=0; i<2000;i++) satıırn 2000 yerine 700 yazacaksın. Hepsi bu.
Ete
erol hocam dediğim mantıgı anlamadınız galiba @necati arkadasımızın kurdugu algoritma istediğim sekilde çalısıyor dogrusu bu demekki iki tane sayac kurmak lazımmış.
int1 s=0;
while(true)
{
    for (i=0; i<=2000;i++)
    {
      output_high(pin_a2) ;
      delay_us(i) ;
      output_low(pin_a2) ;
      delay_us(2000-i) ;
      output_high(pin_a2) ;
        if(s==0){i++;}
      if(i>=1700){i=1700;}
      if(s==1){i--;}
      if(i<1){i=1;}
    }


edit: burdan necati üstadıma tsk ediyorum saygılar.
YENİLMEZ..

ete

Hala anlamadım. Neden 0 dan 2000 e kadar döngü kurupta döngüyü zoraki olarak 1700 de durdurmaya çalışıyorsunuz?
Kurun döngüyü 1700 e kadar ve ondan sonra sonsuz döngüye sokarak aynı duty oranını vermesini sağlayın. Bu şekilde sağ el ile sol kulak gösterilmiş gibi olmuş.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

bulut_01

erol abi yukardaki algoritmanın aynı işi yapacak dediğin şekilde kurabilirmisin burdaki mantık pwm lineer olarak artış saglayarak istedigimiz değişkende sabitlemek burda pwm sabit degil senin dedigin degişkeni duty sabit pwm sinyali alıyoruz pwm 0 dan başlayıp lineer artışı saglamıyor dedigin sekilde yaz erol abi burda deneriz.
YENİLMEZ..

ete

C dili ile aram iyi değil maalesef. Yazarsam yanlış bir şey yazarım mutlaka. Bilen birisi yazsın daha uygun olur.
Malum ben Basic ile çalışırım.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

bulut_01

biliyorum erol abi basic kralsın az bana yardımcı olmadın iyiliklerini unutamam abi basic de yazarsan eskileri bi anarız. ;)
YENİLMEZ..

ete

Aynı şeyi Basic de yazmış olsam şöyle yazardım,

FOR I=0 to 1700
  HIGH Pina_2
  Pauseus I
  LOW Pina_2
  Pauseus (2000-I)
Next
WHILE (1)
   HIGH Pina_2
   pauseus 1700
   LOW Pina_2
   Pauseus 300
Wend


Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

bulut_01

eyvallah erol abim c. Nin Basic versiyonu özlemişim basic yaklaşık 5-6 aydır ugrasmıyorum C. Hayat varmış ama benim için basic yeri her zaman bende ayrıdır.
YENİLMEZ..