Pwm için değişken değeri ne kullanmalıyım?

Başlatan samedkutuk, 22 Ocak 2020, 12:46:18

samedkutuk

Arkadaşlar merhabalar öncelikle herkese iyi çalışmalar dilerim
Pıc in ccp1 ve ccp2 pinlerinden ayarladığım duty de pwm çıkması için çalışma yaptım fakat değişken olayı kafamı karıştırdı.
İlk aşamada formdan bulduğum hesaplayıcı ile tmr2 değerlerini hesapladım 10 khz ve %50 duty (setup_timer_2(T2_DIV_BY_4, 124, 1);) için  daha sonra deneme yaptım set_pwm2_duty(250); şeklinde yazınca %50 duty olduğunu gördüm
daha sonra bunu programım içine ekleyince duty fonksiyonunun içine yazdığım değişkeni ne tanımlarsam tanımlayayım 256 dan büyük bir değer almıyor ve bu nedenle %60 duty ve sonrasına çıkamıyorum
Tanımlama da ki hatam nedir yardımcı olabilir misiniz?
Burada önce menüden Ok tuşuna basıp arttırıp azaltarak uygun duty değeri seçiliyor örneğin 4 seçildi sonra ok tuşu ile kaydedilip menüden çıkılıyor Arttır tuşuna basılığında bu 0-10 arasında seçilmiş olan değer 50 ile seçilip (4*50=200)  duty değeri belirleniyor pwm modu aktif edilip pwm çıkışa aktarılıyor.
#include <main.h>
#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

#define OK      PIN_A0
#define ARTTIR  PIN_A1
#define AZALT   PIN_A2
#define STOP    PIN_A3

#include <lcd.c>

unsigned int Mod=0;
unsigned long int Mod_Secim=0;

void ayar(){
lcd_gotoxy(1,1);
lcd_putc("***MOD SECINIZ***");
while(True){
 if(input(ARTTIR)==1){while(input(ARTTIR)==1);
Mod=Mod+1;
if(mod>=10){mod=10;}
lcd_gotoxy(2,1);
printf(lcd_putc,"\f***Mod Seciniz***\nMod=%u",Mod);}

 if(input(AZALT)==1){while(input(AZALT)==1);
 Mod=Mod-1;
 if(mod<1){mod=0;}
 lcd_gotoxy(1,2);
 printf(lcd_putc,"\f***Mod Seciniz***\nMod=%u",Mod);}
 
 if(input(OK)==1){while(input(OK)==1);
 printf(lcd_putc,"\f Secilen Mod= %u",Mod);
 delay_ms(1000);
 lcd_putc("\f");
 break;}
}
}

void main()
{
   lcd_init();  
setup_spi (FALSE);
enable_interrupts (global);

 setup_timer_2(T2_DIV_BY_4, 124, 1);


      setup_ccp1(CCP_OFF);
      set_pwm1_duty(0);
      setup_ccp2(CCP_OFF);
      set_pwm2_duty(0);



   while(TRUE)
   {
        lcd_gotoxy(4,1);
        lcd_putc("HOSGELDINIZ");
      if(input(OK)==1){while(input(OK)==1);ayar();}
      
      if(input(ARTTIR)==1){while(input(ARTTIR)==1);

     Mod_Secim=(Mod*50);    
     setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM);
     set_pwm1_duty(Mod_Secim);set_pwm2_duty(Mod_Secim);
      
      }
      
      if(input(AZALT)==1){while(input(AZALT)==1);
      set_pwm1_duty(0);set_pwm2_duty(0); 
      setup_ccp1(CCP_OFF);setup_ccp2(CCP_OFF);
      }

   
 


      //TODO: User Code
   }

}
samedkutuk

RaMu

#1
Alıntı yapılan: samedkutuk - 22 Ocak 2020, 12:46:18...
     Mod_Secim=(Mod*50);    
     setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM);
     set_pwm1_duty(Mod_Secim);set_pwm2_duty(Mod_Secim);
    ...


https://www.picproje.org/index.php?topic=68993.0

https://www.picproje.org/index.php?topic=31321.0
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

samedkutuk

Alıntı yapılan: RaMu - 22 Ocak 2020, 13:04:02https://www.picproje.org/index.php?topic=68993.0

https://www.picproje.org/index.php?topic=31321.0

Mod_Secim=((unsigned int16)(Mod*50)); 
şeklinde yaptım ama sonuç yine değişmedi tür dönüşümü yapılıyor sanırım çarpım sonucu önce 16 bit e çevrilip daha sonra 16 bitlik değişkene atılıyor
samedkutuk

secretagent

unsigned int8: 0 to 255
signed int8: -128 (0x80) to +127 (0x7f)

unsigned int16: 0 to 65535
signed int16: -32768 (0x8000) to +32767 (0x7fff)

CCS de standart olarak int yazdfığınızda int8 tanımlıyor derleyici oyüzden int16 diye tanımlamanızı tavsiye ederim.

RaMu

unsigned int16 Mod_Secim=0;

Mod_Secim=( (unsigned int16)Mod * 50 );

Sayfa 42 Basic Types:
https://www.ccsinfo.com/downloads/ccs_c_manual.pdf
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

samedkutuk

samedkutuk