pwm frekansını artırmak

Başlatan bulut_01, 17 Eylül 2012, 22:23:48

bulut_01

asagıdakı koda PTCON0:0b00000000 ; register ekledım cıkıs frekansım 60 hz 1 khz yapmam için ne yapmam lazım katalog register hepsini dededim sonuc hep vasat 60 hz gecemedım pwm sınyalınde ne yazmam lazım ?

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

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

 int16 duty1=0;
 int16 duty2=0;
 int16 duty3=0;

int16 p=255;  // duty oranı (0-255)
   
int1 f=0;
int1 l=0;
int1 e=0;


 void main()
{
   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);
 
PTCON0:0b00000000 ;   // ekledim frekans değişme olmadı.

 
 while(1)
   {
  
 f=input(pin_a0);
 l=input(pin_a1);
 e=input(pin_a2);  
  
  
  if ((f==1)&&(l==0)&&(e==1))        //101
   {
   
           duty3=p*64;
        set_power_pwm4_duty(duty3);
        output_high(pin_b4);
    
  }
  else 
  {
  set_power_pwm4_duty(duty3=0x00);
  output_low(pin_b4);
  } 

  
  delay_ms(1) ;

}
   }
   
YENİLMEZ..

mistek

   PTCON0=0xFB;   // Free running mode, Input clock 1:64, Postscale  1:16
   PTCON1=0x80;
   PWMCON0=0x5F;  //1,3,5 ve 7 pwm çıkış
   PWMCON1=0x01;
   DTCON=0x00;
   OVDCOND=0xFF;
   OVDCONS=0x00;
   FLTCONFIG=0x80;
   PTPERL=0x34;  //Frekans ayar
   PTPERH=0x0C;  // Detaylı anlatım datasheette
   SEVTCMPL=0x00;
   SEVTCMPH=0x00;

18f4431 için ptperl ve ptperh değerini değiştirerek tüm frekanslar ayarlanabiliyor. Birde pwm saat frekansını bölmek için ptcon kaydedicindeki değerleri değiştirin.  yardımcı olabilir belki.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

Kazım

#2
Alıntı yapılan: muhamm@ - 17 Eylül 2012, 22:48:38
   PTCON0=0xFB;   // Free running mode, Input clock 1:64, Postscale  1:16
   PTCON1=0x80;
   PWMCON0=0x5F;  //1,3,5 ve 7 pwm çıkış
   PWMCON1=0x01;
   DTCON=0x00;
   OVDCOND=0xFF;
   OVDCONS=0x00;
   FLTCONFIG=0x80;
   PTPERL=0x34;  //Frekans ayar
   PTPERH=0x0C;  // Detaylı anlatım datasheette
   SEVTCMPL=0x00;
   SEVTCMPH=0x00;

18f4431 için ptperl ve ptperh değerini değiştirerek tüm frekanslar ayarlanabiliyor. Birde pwm saat frekansını bölmek için ptcon kaydedicindeki değerleri değiştirin.  yardımcı olabilir belki.

bulut01--- öncelikle istediğin 18f1331 datasheetini indirmeden diğer mesajına cevap yazdığım için özür dilerim.18f1330 datasheetine göre muhamm@ arkadaşın dediği gibi PTPER registerini ve birde PTMRPS time base prescalerini ( ön bölücüyü ) aşağıdaki formüle göre ayarlamalısın. Aşağıda 50 Hz için örnek verilmiş PTMRPS 1:64 ve PTPER 0x137 OSC 4 MHZ dir..Datasheetinde değişik frekanslar için örnek bir tablo var.Senin de bildiğin gibi motor sürücüleri için 50-60 Hz 'lik PWM sinyalleri uygulama kabiliyetine uygun MCU 'lar kullanılmalı ve sende öyle yapmışsın.Formül Free Run modu içindir.Countinius UP-Down modu için PTPER x 2 olacak.Bu formülle istediğin Frekansı yakalayabilirsin..

TPWM = time period of PWM frequency:
PTPER = 14-bit period register PTPERL and PTPERH
PTMRPS = 64 PWM time base prescaler



                                   (PTPER+1)*PTMRPS                (PTPER+1)*64
    TPWM       =                ----------------                =     ------------              = 0.02            Örnekte   PTPER= 0x137
                                      Fosc/4  (MIPS)                       1000000                                          Fosc 4000000 Hz                           



Frequency = 1/TPWM = 1/0.019968 = 50.0801Hz

bulut_01

#3
Alıntı yapılan: muhamm@ - 17 Eylül 2012, 22:48:38
   PTCON0=0xFB;   // Free running mode, Input clock 1:64, Postscale  1:16
   PTCON1=0x80;
   PWMCON0=0x5F;  //1,3,5 ve 7 pwm çıkış
   PWMCON1=0x01;
   DTCON=0x00;
   OVDCOND=0xFF;
   OVDCONS=0x00;
   FLTCONFIG=0x80;
   PTPERL=0x34;  //Frekans ayar
   PTPERH=0x0C;  // Detaylı anlatım datasheette
   SEVTCMPL=0x00;
   SEVTCMPH=0x00;

18f4431 için ptperl ve ptperh değerini değiştirerek tüm frekanslar ayarlanabiliyor. Birde pwm saat frekansını bölmek için ptcon kaydedicindeki değerleri değiştirin.  yardımcı olabilir belki.

yukardaki örneklerı uyguladım sonuc değişmedı
örnek:  PTCON0=0xFB ; yazdıgımda ccs derlemiyor bu komutu söyle yazdıgımda derlıyor  PTCON0: 0xFB ; yazdıgımda derlıyor ptcon0 register sonrakı hex değeri ne yaparsam yapıyım 60 hz pwm alıyorum frekans değişmiyor yukardakı register değerleri 18f4431 göre oldugun için 18f1330 mı uyumsuz konu halen çözmüş değilim arkadaslar.PTCON0: 0X100; yapdım (1:1 Postscale,PWM time base input clock is FOSC/4
1:1 prescale,PWM time base operates in a Free-Running mode) yapmak amacım ama bu parantez ıcındekı register değerlerini bir türlü 18f1330 kabul ettıremedım ptcon0: 0x100; hex binary olarak
ptcon0 = 0b00000000; yapıyorum ne yapdıysam olmadı yardımlarınızı beklıyiyorum.
YENİLMEZ..

VFR

CCS'de main'in içinde registerlere değer atayamazsın.
Power PWM ayarlarını yapman için CCS'nin helpini aç , oradan power pwmi bul.
Orada anlatıyor ayarların nasıl yapılacağını. Aşağıdaki örnek var dediğim yerde.


Example Code:
 

....
 

long duty_cycle, period;
 

...
 

// Configures PWM  pins to be ON,OFF or in Complimentary mode.

setup_power_pwm_pins(PWM_COMPLEMENTARY ,PWM_OFF, PWM_OFF, PWM_OFF);   



//Sets up PWM clock , postscale and period. Here period is used to set the

//PWM Frequency as follows:

//Frequency = Fosc / (4 * (period+1) *postscale)

setup_power_pwm(PWM_CLOCK_DIV_4|PWM_FREE_RUN,1,0,period,0,1,0);



set_power_pwm0_duty(duty_cycle));
// Sets the duty cycle of the PWM 0,1 in

                                                                   
//Complementary mode


Kısacası aşağıdaki komut ile frekansı ayarlayabilirsin.
setup_power_pwm(PWM_CLOCK_DIV_4|PWM_FREE_RUN,1,0,period,0,1,0);

bulut_01

#5
Alıntı yapılan: healme - 19 Eylül 2012, 22:05:46
Kısacası aşağıdaki komut ile frekansı ayarlayabilirsin.
setup_power_pwm(PWM_CLOCK_DIV_4|PWM_FREE_RUN,1,0,period,0,1,0);

yok arkadasım dedıgın komut ıcındekı butun degerlerı degıstırdım ındırdım kaldırdım 60 hz gıne gecemedım 1 khz almak ıcın ptcon0: regis oynadım petcon0: 0x100; yani 0b00000000 atadım nette bakmadıgım sıte kalmadı ccs bu 18f1330 denen zımbırtıyla ılgılı detaylı bırsey bulamadım ulan ne zormus bu 18f1330 den 1 khz pwm almak elımde deve olsa sımdıye bununla ugrasdıgım kadar ugrassaydım kac tane hendek atlatırdım sevgılı ustatlarım bu 18f1330 denen zımbırtının prekans nasıl yukseltırım dedıgım regıster ve set_power_pwm harıcıde var mı bir yolu ?
not:
petcon0: register asagıda 0b00000000 ; en yuksek pwm almak degeri değilmidir.

REGISTER 14-1: PTCON0: PWM TIMER CONTROL REGISTER 0

PTOPS3 PTOPS2 PTOPS1 PTOPS0 PTCKPS1 PTCKPS0 PTMOD1 PTMOD0

bit 7 bit 0
Legend:

bit 7-4 PTOPS3:PTOPS0: PWM Time Base Output Postscale Select bits
0000 = 1:1 Postscale
0001 = 1:2 Postscale
...
1111 = 1:16 Postscale

bit 3-2 PTCKPS1:PTCKPS0: PWM Time Base Input Clock Prescale Select bits
00 = PWM time base input clock is FOSC/4 (1:1 prescale)
01 = PWM time base input clock is FOSC/16 (1:4 prescale)
10 = PWM time base input clock is FOSC/64 (1:16 prescale)
11 = PWM time base input clock is FOSC/256 (1:64 prescale)

bit 1-0 PTMOD1:PTMOD0: PWM Time Base Mode Select bits
11 = PWM time base operates in a Continuous Up/Down Count mode with interrupts for double PWM
updates
10 = PWM time base operates in a Continuous Up/Down Count mode
01 = PWM time base configured for Single-Shot mode
00 = PWM time base operates in a Free-Running mode

YENİLMEZ..

VFR

OSC 20MHZ için aşağıdaki kodu denedim tam 1khz elde ettim.

period=1249;
setup_power_pwm_pins(PWM_COMPLEMENTARY,PWM_OFF,PWM_OFF,PWM_OFF);
setup_power_pwm(PWM_CLOCK_DIV_16|PWM_FREE_RUN,1,0,period,0,1,0)

bulut_01

#7
burdan bana yardımcı olan butun arkadaslara tessekkur edıyorum sorun çok kucukmus aslında ama ınsan gözunden kacıyor bagzı seyler asagıdakı kodu duzeltınce ıstedıgım frekans alıyorum duzeltıgım kod asagıdakı gıbı bıde ben dahılı osc kullandıgım ıcın max 8 mhz alabılıyormusum @healme PLL devreye sokarsam 8x4PL oda 32 mhz kadar dahılı osc ıle pll acık alabılıyorum pll gerek kalmadı bana lazım olan 500 hz cıvarıydı rahat aldım burchless motorların calısma frekans nedır ? örnek harddısk motoru.
bu hali ile 500 hz civarında alıyorum.
düzeltiğim yerden eskı halı ıle  240 hz calısıyormus OSC

#include <18f1330.h> 
#fuses INTRC_IO,NOWDT,NOMCLR

#use delay(clock=40M,oscillator=10M)  //düzeltdiğim bölüm burası osc 
                                                               
#use fast_io(a)
#use fast_io(b) 

 int16 duty3=0;


int16 p=55;  // duty oranı (0-255)
   
int1 f=0;
int1 l=0;
int1 e=0;
 

 void main()
{
   setup_power_pwm_pins(PWM_ODD_ON,PWM_odd_on,PWM_odd_on,PWM_odd_on);
   setup_power_pwm(PWM_CLOCK_DIV_16|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(1)
   {
  
 f=input(pin_a0);
 l=input(pin_a1);
 e=input(pin_a2);  
  
  
  if ((f==1)&&(l==0)&&(e==1))        //101
   {
   
        duty3=p*64;
      
      set_power_pwm4_duty(duty3);
     output_high(pin_b4);
    
  }
  else 
  {
  set_power_pwm4_duty(duty3=0x00);
  output_low(pin_b4);
  } 

  
  delay_ms(1) ;

}
   }
   
YENİLMEZ..