PIC16F877A min. PWM frekansı

Başlatan oongit, 05 Kasım 2010, 22:26:24

oongit


oongit

#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)

int i=5; //Tamsayı tipinde değişken tanımlanıyor

void main()
{
   setup_PSP(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   
   set_tris_b(0b11111111);
   set_tris_c(0b11111001);
   set_tris_d(0b00000000);
   
   setup_ccp1(CCP_PWM);       //CCP1 birimi PWM çıkışı için ayarlandı
   setup_ccp2(CCP_PWM);       //CCP2 birimi PWM çıkışı için ayarlandı
   setup_timer_2(T2_DIV_BY_16,249,1);
   
   set_pwm1_duty(i);
   set_pwm2_duty(i);
   
   while(1)
   {
      if (input(pin_b6))
      {
         delay_ms(20);
         while(input(pin_b6));
         i+=5;
         
         if (i>=249)
         i=249;
         
         set_pwm1_duty(i);
         set_pwm2_duty(i);
      }
      
      if (input(pin_b7))
      {
         delay_ms(20);
         while(input(pin_b7));
         i-=5;
         
         if (i<5)
         i=5;
         
         set_pwm1_duty(i);
         set_pwm2_duty(i);
      }
   }
}


Bu sefer resim eklemeyi beceremedim... Upload.gen.tr de açılmıyor. Nasıl yapacağım bilmiyorum...


justice_for_all

invalid link diyor arkadasim

http://www.imageshack.us/ busiteye yuklermisin..
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay


justice_for_all

#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)

int i=5; //Tamsayý tipinde deðiþken tanýmlanýyor

#int_RB
void  RB_isr(void)
{
      if (input(pin_b6))
      {
         //delay_ms(5);//boyle kullan olmazsa  delayms leri acarsin ok
         i+=5;
         
         if (i>=249)
         i=249;
         
         set_pwm2_duty(i);
      }
     
      if (input(pin_b7))
      {
         //delay_ms(5);//boyle kullan olmazsa  delayms leri acarsin ok
         i-=5;
         
         if (i<5)
         i=5;
      }
     
      set_pwm1_duty(i);
      set_pwm2_duty(i);

}

void main()
{
   setup_PSP(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   
   set_tris_b(0b11111111);
   set_tris_c(0b11111001);
   set_tris_d(0b00000000);
   
   setup_ccp1(CCP_PWM);       //CCP1 birimi PWM çýkýþý için ayarlandý
   setup_ccp2(CCP_PWM);       //CCP2 birimi PWM çýkýþý için ayarlandý
   setup_timer_2(T2_DIV_BY_16,249,1);
   
   set_pwm1_duty(i);
   set_pwm2_duty(i);
   
   while(1)
   {

   

   }
}


boyle bidenermisiniz...proteusda...bekliyorum olmasi gerek ama simdi bence butonlari b4 ve b5 e alirsaniz daya ii olur eger entegreyi devre uzerinde programlicaksaniz veya debug yapcaksaniz eger entegreyi zif sokette programlicaksaniz boyle kalabilir...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

oongit

250 Hz PWM alabiliyorum. Ancak "ARTTIR" ve "AZALT" tuşları ile Duty oranını ayarlayamıyorum..

oongit

Devre ilk açıldığında Duty %50 olarak başlamalı,
"Arttır" butonuna her tıkladığımda, Duty oranı %5, %5 artmalı,
"Azalt" butonuna her tıkladığımda, Duty oranı %5, %5 azalmalı...

Umarım anlatabilmişimdir  ???

justice_for_all

ozur sunu eklememeyi unutmusum

   setup_ccp1(CCP_PWM);       //CCP1 birimi PWM çýkýþý için ayarlandý
   setup_ccp2(CCP_PWM);       //CCP2 birimi PWM çýkýþý için ayarlandý
   setup_timer_2(T2_DIV_BY_16,249,1);
 
   bu satirdan sonra

asagidakini kopyala yapistir...

   
   enable_interrupts(int_rb);
   enable_interrupts(global);
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

justice_for_all

int i =5 ; tanimlamasinida asagidaki ile degistir ok...

int i=125; //Tamsayý tipinde deðiþken tanýmlanýyor
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

oongit

#85
Tamam şimdi çalıştı... Ancak; yukarıda bahsettiğim şekilde nasıl değiştirmeliyiz bu programı?

Devre ilk açıldığında Duty %50 olarak başlamalı,
"Arttır" butonuna her tıkladığımda, Duty oranı %5, %5 artmalı,
"Azalt" butonuna her tıkladığımda, Duty oranı %5, %5 azalmalı...

Duty min. %10, max. %90 olacak şekilde olabilmeli...

Çok şey istiyorum sanırım...  :-[

NOT: Sonsuz teşekkür ederim. Hakkınızı ödeyemem...

justice_for_all

int i =5 ; tanimlamasinida asagidaki ile degistir ok...

int i=125; //Tamsayý tipinde deðiþken tanýmlanýyor


%5 arttirma;

250 * 5 /100 =12 yani i yi 12 ser azaltip cogaltman gerek yani soyle olcak


      if (input(pin_b6))
      {
         //delay_ms(5);//boyle kullan olmazsa  delayms leri acarsin ok
         i+=12;
         
         if (i>=252)
         i=240;
      }
     
      if (input(pin_b7))
      {
         //delay_ms(5);//boyle kullan olmazsa  delayms leri acarsin ok
         i-=12;
         
         if (i<=12)
         i=12;
      }
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

oongit

Süpersiniz...

Şimdi yazılan bu kodla min. duty %10, max. duty %90 mı olmuş oldu? Proteus osiloskoptan tam anlayamadım ama olmuşa benziyor...

justice_for_all

eger min %10 yapmak istiyosaniz

bu islemde 

         i-=12;
         
         if (i<=24)
         i=24;

olcak

%90 icin de


         i+=12;
         
         if (i>=216)
         i=216;


boyle duzeltirseniz olur ayrica osilascoptan kareleri sayarakda yuzde hesaplayabilirsiniz ama ben bunu hesapla yaptigim icin buyuk ihtimalle dogru...
Kolay Gelsin...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

oongit

Harikasınız... İnanın ne diyeceğimi bilemiyorum...

Peki bu hesaplamaları neye göre yapıyorsunuz? Yani PR2 veya diğer şeyleri nasıl hesaplıyorsunuz? O komutlarda nasıl yerine koyuyorsunuz? Bunları da kaparsam çok yol katetmiş olacağım sanırım...

Tekrar tekrar teşekkürler... ;D