pwm frekans 7.8 khz geçemedim ?

Başlatan bulut_01, 16 Ekim 2012, 00:08:50

bulut_01

iyi aksamlar arkadaslar 18f1330 bldc surucusu ıcın ugrasıyorum yanlız 7.8 khz gecemedım proteus sımılasyonda max 7.8 khz PLL acık hesaba göre 32/4=8 mhz calısma frekansı olarak PWM_CLOCK_DIV_4 komutu ıle 8/4=2 mhz yakın frekans almam gerekırken 7 khz fazla alamadım bunun nedeni nedir test codu asagıdadır 20 khz almam ıcın ne yapmam gerekir ? dahılı osc kullanıyorum pll acık.

#include <18f1330.h> 
#fuses INTRC_IO,NOWDT,NOMCLR,H4
#use delay(clock=40M)
#use fast_io(a)
#use fast_io(b) 

int16 duty1=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 );
   setup_comparator(NC_NC_NC); 
   set_tris_a(0b000000011);
   set_tris_b(0b000001100);
   OUTPUT_B(0x00);

  
while(TRUE)
{
set_power_pwm0_duty(duty1=7620);
}
}
YENİLMEZ..

computerboy

#include <pwm.h>

OpenPWM1(0xff);
SetDCPWM1(512);

bu komutları incele hocam. microchipin dc motor sürme kodları vardı şimdi bulamadım nette aratırsan örnek mevcut.

// Setup A/D converter
OpenADC(ADC_FOSC_32 & ADC_LEFT_JUST & ADC_1ANA_0REF,
         ADC_CH0 & ADC_INT_OFF);

OpenPWM1(0xff);            // Setup Timer2, CCP1 to provide
               //   19.53 Khz PWM @ 20MHz

OpenTimer2(T2_PS_1_1 & T2_POST_1_10 & TIMER_INT_ON);

SetDCPWM1(512);            // 50% initial duty cycle

esensoy

dahili osilatorü 8MHz ama siz PLL 40M yazmışsınız, 32M e çevirmek lazım
sorun kaynağı mı bilmiyorum ama onu düzeltmek lazım
En tehlikeli an "zafer" anıdır.

bulut_01

32 mhz yazsam gine 7.8 khz alıyorum nasıl bir komut yazman gerekir 7 khz fazla almam için register oynadım aynı bir türlü bulamadım.
YENİLMEZ..


anladinmi

Ana döngüde habire ayni degeri veriyorsun.
PWM Glitch yapiyor olabilir, bu yüzden üretilen sinyalin peryodu daha büyük olabilir.

oburak90

4-5 senedir pic ile takılmama rağmen elime daha 18f almadım =) kodlar deişik geldi bana power pwm filan galiba 18f lere geçmem lazım artık.. benim eskiden karşılaştığım sorun 16f lerde pwm oluştururken girdiğin pr2 değerini aşmaması gerekiyordu duty değerinin aynı sorun sendede olabilirmi acaba?

bulut_01

evet arkadaslar kesin sonuca varabilecegim bir cvp bekliyorum yada hangi komut yazmam lazım ?
YENİLMEZ..

iyildirim

Cevap beklemek yerine datasheet'i açıp Power PWM modülüne baksan, hatta sadece frekans yada period nasıl ayarlanır örneğine baksan çoktan sorununu çözmüş olurdun.. 

18F serisi işlemcileri de CCS yi de pek bilmiyorum, hiç kullanmadım ama tahminimce 4095 ile 7.8 elde ediyorsan 1600 değeri ile 20Khz üretebilirsin..

Kazım


4-5 senedir picle uğraşıyorum 18F serisi farklı geldi diyen arkadaşa " Vaktin bu kadar mı değersiz " demeden edemiyeceğim.Kendini geliştirmeyeceksen bırak gitsin bu işi.Ömrüne yazık.Gideceğin yol bir arpa boyu

bulut_01

Alıntı yapılan: iyildirim - 18 Ekim 2012, 23:48:40
Cevap beklemek yerine datasheet'i açıp Power PWM modülüne baksan, hatta sadece frekans yada period nasıl ayarlanır örneğine baksan çoktan sorununu çözmüş olurdun.. 

18F serisi işlemcileri de CCS yi de pek bilmiyorum, hiç kullanmadım ama tahminimce 4095 ile 7.8 elde ediyorsan 1600 değeri ile 20Khz üretebilirsin..

yıldırım hocam dedıgınız gibi olmuyo işler 1600 atadıgım degerde pwm cıkmıyor sadece o port on durumda oluyor katalog pwm cıkısı ıcın 20 khz yada ustu nasıl elde edılır net degıl yada ben bulamadım.PLL acık hesabıma göre 32 mhz/4  işlemci ıntrc pll iken 8 mhz calısıyo oda 8/4=2 mhz yapar bu frekans cıkıs port görmek ıcın regıster ne değer atanır bulamadım katalog bakdım yada göremedim.ben 2 mhz istemiyorum 20 khz kafi.
YENİLMEZ..

iyildirim

Alıntı yapılan: bulut_01 - 24 Ekim 2012, 19:59:48
yıldırım hocam dedıgınız gibi olmuyo işler 1600 atadıgım degerde pwm cıkmıyor sadece o port on durumda oluyor

Portun  sürekli ON durumda olması normal görünüyor. Çünkü period 1600 iken  duty perioddan büyük kalmış olmalı.
Peki 1600 ile denerken (ki 1600 derken CCS bildiğimden değil sadece tahminden dolayı. Çünkü kodda frekans belirtebileceğin başka bir şey yok..) duty'yi de örneğin 1600 den daha ufak bir değere atadınmi?.


bulut_01

#include <18f1330.h> 
#fuses INTRC_IO,NOWDT,NOMCLR,H4
#use delay(clock=40M)
#use fast_io(a)
#use fast_io(b) 

int16 duty1=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,10,0,1,0); 
   setup_adc_ports(NO_ANALOGS); 
   setup_adc( ADC_OFF );
   setup_comparator(NC_NC_NC); 
   set_tris_a(0b000000011);
   set_tris_b(0b000001100);
   OUTPUT_B(0x00);

  
while(TRUE)
{
set_power_pwm0_duty(duty1=40);
}
}


bu son hali ile 760 khz aldım burdan yıldırım kardesımıze tsk ederıyorum
YENİLMEZ..