Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

pwm oran ayarı ?

Başlatan bulut_01, 15 Eylül 2012, 00:12:14

bulut_01

küçük bir  kod yazdım  0-255 değer verip p: değişkenine cıkıs pwm ayarlamak istiyorum ama abuk sabuk pwm sinyalleri görüyorum lineer olarak pwm sinyalleri almam ıcın asagıdakı kod neresinde yanlıslık yapmıs olabilirim
(p: değişkenine atadıgım degerler sonucu proteus scop unda bakdıgım sınyaller çok salakca oluyor)

#include <18f1330.h> 
#fuses INTRC,NOWDT,NOMCLR
#use delay(clock=20000000) 

void main() 
{ 
   unsigned int16 j,dutyr=0 ;
   
   int8 p=100 ;           //pwm ayar değeri
   

#use fast_io(a)
#use fast_io(b)

   setup_power_pwm_pins(PWM_ODD_ON,PWM_odd_on,PWM_odd_on,PWM_odd_on); 
   setup_power_pwm(PWM_CLOCK_DIV_4|PWM_FREE_RUN,1,0,4095,0,1,0); 
   setup_adc_ports(NO_ANALOGS); 
   setup_adc( ADC_OFF );
   set_tris_a(0b000000111);
   set_tris_b(0x00);
   
  
   while(true)
{
  
  for (j=0;j<255;j++){
       dutyr=p-j;
      
      set_power_pwm0_duty(dutyr*16);
      
  }
    }
   }
   
YENİLMEZ..

serhat1990

#1
Hocam artık ccs c ile çalışmıyorum pek hatırlamıyorum açıkçası ama aşağıdaki işlemler için p'ye sabit 100 sayısını atamışsınız ç for değişkeninde 0'dan 255 ' e kadar saydırıp çıkarıp 16 ile çarpıp bunu pwm sinyalinin iş süresi olarak ayarlamışsınız. fonksiyonda j değeri 100'ü geçinde pwm sinyalinizin iş süresi 0 olur  16 ile çarparsın yine 0.
Ayrıca duty değerini falan 16 ile çarpmışsınız. İşlem karmaşası biraz bence ... Programı derlemeye çalıştım delay=20000000 kısmında hata veriyor . Dahili osc ile ilgili heralde... Programı şu şekilde deneyin isterseniz... Bence net birşey görürsünüz...

Şu şekilde yapsanız... 14 bit pwm varmış heralde işlemcinizde. 0'dan 16383'e kadar değerleri 1'er arttırarak pwm duty'ye yazdık. Sürekli artan bir sinyalimiz oldu. Sonra baştan başladı tekrar.

#include <18f1330.h> 
#fuses INTRC,NOWDT,NOMCLR
#use delay(clock=20000000) 

void main() 
{ 
   unsigned int16 j ;
   
   

#use fast_io(a)
#use fast_io(b)

   setup_power_pwm_pins(PWM_ODD_ON,PWM_odd_on,PWM_odd_on,PWM_odd_on); 
   setup_power_pwm(PWM_CLOCK_DIV_4|PWM_FREE_RUN,1,0,4095,0,1,0); 
   setup_adc_ports(NO_ANALOGS); 
   setup_adc( ADC_OFF );
   set_tris_a(0b000000111);
   set_tris_b(0x00);
   
  
   while(true)
{
  delay_ms(100);

  for (j=0;j<16383;j++){
      set_power_pwm0_duty(j);
     delay_ms(1);

      
  }
    }
   }

bulut_01

#2
satırı ekledım oldu

int p=10 ;
set_power_pwm0_duty(j=p*100);
YENİLMEZ..

serhat1990

Alıntı yapılan: bulut_01 - 15 Eylül 2012, 00:43:24
serhat verdiğinde ben pwm duty ayarlıyamıyorum benım verdıgım deger ile duty oranı değişmesı lazım senın verdıgın kodda sabıt pwm alıyorum

Ben denedim delay(clock=8000000) yaptım. Proteus'ta denedim senin kodları kopyaladım. Sadece delay kısmını değiştirdim. Birde dediğim kısımları değiştirdim osilaskop ekranında 0'dan başlayarak artan sonra sıfırlanan pwm sinyalini gördüm. Olması gerekir zaten olmaması için bir neden yok ccs c ' de uzun zamandır yazmıyorum fakat sonuçta yapılan işlem belli bir döngü ayarlayıp döngü sayma değerini duty değerine yüklüyoruz. Burda ben hata göremiyorum.

bulut_01

#4
---
YENİLMEZ..

serhat1990

#5
Alıntı yapılan: bulut_01 - 15 Eylül 2012, 00:56:55
sen benı anlamadın ben 0-255 değişken dusun ben p=100 dediğimde buna karsılık sabıt duty pwm almak isyorum yanı duty oranı 0 baslayıp sonuna kadar artmasını ıstemıyorum ben yazdıgım degerde o oranla sabıt pwm almak ıstıyorum umarım benı anlamısındır.

Tamam şimdi anladım. O zamanda ben sana şöyle birşey söyleyeyim senin yazdığın kodda sen p'ye sabit bir değerde versen garip olan bir pwm sinyali alırsın çünkü j ' değişkenin 255 kere sayacak ve  , p'den bu j değerini çıkararak dutyr' ye yazıyorsun . dutyr' yide 16 ile çarpıp pwm duty sinyali diyorsun. Senin programda sabit bir pwm istiyorsan girdiğin değere göre programın hatalı , saydırdığın bir değer üzerinden matematiksel bir takım işlemler ile duty değerini belirliyorsun sabit pwm sinyali çıkacak diyorsun p değerine girdiğin değere göre .

Şöyle birşey yap istersen işlemcin 14 bit pwm heralde . 2^14 = 16384  . 0 ile 255 arasında bir değer girince buna karşılık sabit bir pwm verelim.

sen değişkene örneğin 10 verdin diyelim ...

16384/255 = 64 civarı ... Adım değeri 64 civarı.
Girdiğin değeri 64 ile çarpıp bunu pwm duty ' ye yazmak bence mantıklı .

Toplamda 0-255 arası girdiğin bir değerin karşılığını değerin 64 katını alarak hesapla.

Şöyle bir komu işine yarar sanırım ..

#include <18f1330.h> 
#fuses INTRC,NOWDT,NOMCLR
#use delay(clock=20000000) 

void main() 
{ 
   unsigned int16 dutyr=0 ;
   
   int8 p=100 ;           //pwm ayar değeri
   

#use fast_io(a)
#use fast_io(b)

   setup_power_pwm_pins(PWM_ODD_ON,PWM_odd_on,PWM_odd_on,PWM_odd_on); 
   setup_power_pwm(PWM_CLOCK_DIV_4|PWM_FREE_RUN,1,0,4095,0,1,0); 
   setup_adc_ports(NO_ANALOGS); 
   setup_adc( ADC_OFF );
   set_tris_a(0b000000111);
   set_tris_b(0x00);
   
  
   while(true)
{
  
     dutyr=p*64;
      
      set_power_pwm0_duty(dutyr);
      
  }
    }
   }
   


Bu şekilde p değerini 0 ile 255 arasında değiştirerek 256 farklı sinyal alacaksın umarım bu sefer doğru anlamışımdır. :)


mesaj birleştirme:: 15 Eylül 2012, 01:20:06

Alıntı yapılan: bulut_01 - 15 Eylül 2012, 00:43:24
satırı ekledım oldu

int p=10 ;
set_power_pwm0_duty(j=p*100);


Tamamdır benim son yazdığımda işine yarar . Kolay gelsin ...