AC fanı pwm kontrolü bu kadar zormu?

Başlatan alikorkmaz_88, 06 Haziran 2007, 12:59:40

alikorkmaz_88

Arkadaslar kac gundür pwm yardım diye başlık actım ama koskoca formda 2 kişi  cevap yazdı oda anlamadım devrem var pic16f819  a bii  ccs de ornek kod istiyorum zormu bukadar yardımcı olursanız sevinirim.

Ersin

Buraya baktin mi?
C:\Program Files\PICC\Examples\EX_PWM.C

zafzaf82

#include <16f628.h>
#device *=16
#FUSES NOWDT                    //Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOCPD                    //No EE protection
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOLVP                      //No Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOBROWNOUT               //No brownout reset

#use delay(clock=4000000,RESTART_WDT)



#byte PORT_A = 0x05
#bit RA0 = 0x05.0
#bit RA1 = 0x05.1
#bit RA2 = 0x05.2
#bit RA3 = 0x05.3
#bit RA4 = 0x05.4
#bit RA5 = 0x05.5
#bit RA6 = 0x05.6
#bit RA7 = 0x05.7

#byte PORT_B = 0x06
#bit RB0 = 0x06.0
#bit RB1 = 0x06.1
#bit RB2 = 0x06.2
#bit RB3 = 0x06.3
#bit RB4 = 0x06.4
#bit RB5 = 0x06.5
#bit RB6 = 0x06.6
#bit RB7 = 0x06.7

int16 value;

#int_RB
RB_isr()
{
delay_ms(30);
   if(input(PIN_B4)==0)
   {
   value=value+100;
      if(value>=1023)
      value=1023;
   }

   if(input(PIN_B5)==0)
   {
   value=value-100;
      if(value<=0)
      value=0;
   }

   if(input(PIN_B6)==0)
   {
   value=value+10;
      if(value>=1023)
      value=1023;
   }

   if(input(PIN_B7)==0)
   {
   value=value-10;
      if(value<=0)
      value=0;
   }
   set_pwm1_duty(value);
}


void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_1,255,1);
   setup_ccp1(CCP_PWM);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_RB);
   enable_interrupts(GLOBAL);
   port_b_pullups(TRUE);

   set_tris_b(0xF0);

   value=500;
   set_pwm1_duty(value);
   for(;;)
   {
   }
}



gördüğün gibi çok basit mantıgı var 628 yerine 819 yaz çalışır
Mikroişlemci bi araçtır, amaç değil.....

Logan

@alikorkmaz_88, devrende PWM kullanma mecburiyetin var mı? Daha önceki mesajında da bahsettim.Amacın PWM'i öğrenmek mi yoksa AC fanın hızını kontrol etmek mi? PWM'i öğrenmek istersen @zafzaf82 çalışan örnek kod yollamış.Ama tekrar söylüyorum şimdiye kadar tamir ettiğim veya tasarladığım HİÇBİR sistemde PWM ile triyak sürmedim, bu şekilde sürüldüğüne de şait olmadım.Sadece 5 eksenli bileme makinesi yaparken 380 motorun soft start kartında mosfetleri sürmede kullanıldığını gördüm o kadar. PWM metodu ile motoru 220 V'a senkron çalıştırman çoooook zor  :)
İmza.

OG

Logan'a ilave, zor değil belkide imkansız. Üstelik fan motoru demişsin. 220V AC motorlarda hız kontrolu genelde asenkron motorlara yapılır, hatalıysam arkadaşlar düzeltsin, universal seri motorlar (matkap motoru gibi) hariç. Fan motoru yardımcı sargılı motor ise iş daha da zor. Küçük tipler genelde öyle oluyor.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

alikorkmaz_88

logan arkadasım bak ben olmayan bişeyi yapmaya çalışmıyorum adam yani italyan firması yapmıs bunu cokta şahanr calısıyoor ama dedimki bu elin italyanı yapıyosa bizde yaparız artı neden paramız dısarı gitsin adam koskocaman 5v pwm kontroluyle yaptım dyede user manueline yazmış biz yukarda verilen kodların aynısını yazdık olmuyo atladığımız bişey var ya cok hızlı ya cok yavaş bolemiyoz adımları saygılar.

MURSEL

arkadaşlar olay sadece frekansla cözümlenemezmi  akım frekans ilişkisi


xl=  1\2pfL  ama bununda sınırları var belirli frekans aralıgı sen sadece  periyot ayarlarıyla  ugraş yani ama  sebeke ile sürekli bagıntın olucak  mesala pic le şunu dene 2 tane buton koy ilk başlangıç  olarak yakalama  moduyla sebekedeki ilk alternası al 2 alternans bekle 1 alternans al 2 alternans bekle  aldıgın alternans ları tiriyakla(uygun sürücü ne ise artık)  fana uygula bu şekilde motara 17hz uygulamış olursun  frekans düştükce fan sargı  drençi  artar  butonlarıda   uygun  yazılımı yazaarak frekans azaltıp artırmasını sagla KESİNLİKLE UYGULANMAMIŞTIR ama bunu bir elektrik  bölümü okuyan arkadaşımla konuşmuştuk böyle bir fikir yürüttük  bu  arada  alternans lar  + degeri alınacak  beraber  fikir yürütelim

CaFFeiNe


MURSEL

CaFFeiNe  hocam  sürelerle bu işin olucagını sanmıyorum sizin  metot sanırım uygun zamanlara karşılık gelen altarnaslara uyguladıgınız degişiklik(YADA BEN YANLIŞ ANLIYORUM) fakat bu  metotla motorun calışma prensibine aykırı olmuyormu(ACmotorlarda)  motora adım atması için 1 periyot kesintisiz uygulanması lazım ki sadece elimizde saniyedeki frekans degişikligi kalıyor oda 1 hz den 50 arası değil tabi  kiritik degerleri var  minumum  ama ne? :oops:

CaFFeiNe

zaten 0.1 saniyede 5 periyot uygulanmış olur motora (50Hz şebekede)

uygun zamanlara karşılık gelen birşeyler yapılmıyor çünkü herhangi bir hissedici yok!
sadece kendi belirlediğimiz bir periyot içerisinde (örneğin 2sn) fana belirli bir süre (duty) enerji veriyoruz, bu enerji verdiğimiz süre periyodun uzunluğuna ne kadar yaklaşırsa fanın hızıda o kadar artacaktır
tabiki fanın hızında dalgalanmalar olacaktır ama önemli mevzuu fanın hızında hiç dalgalanma olmamasımı yoksa istediğimiz hava akışını ayarlamakmı?

sıfır geçiş hissetme derdi yok bir fan için en kolay bu şekilde olur sanıyorum hatta geçenlerde bir arkadaşa bilgisayar toplamıştım Core2Duo işlemcinin fanıda işlemci ısınana kadar buna benzer bir yöntemle çalışıyordu

alikorkmaz_88

araştırmalarıma göre timer2 ile 4 mhz de 244 hz üretebiliyorsun en düşük bana 50 hz lazım yani 20 ms
while()
{
output_high(PIN_b3);
delay_ms(10);
output_low(PIN_b3);
delay_ms(10);
}

bu şekilde yüzde 50 yavaşlatıyorum fakat motorda dur kalk yani stabil olarak arada çok az da olsa boşluk oluyor timer0 la veya timer1 le 20 ms oluşturabilirmiyim ?

CaFFeiNe

timer kesmeleri ile istediğin zamanı ayarlayabilirsin
mesela saniyede 500 kesme üretecek şekilde timerı ayarladın diyelim
kesme programının içine bir sayaç rutini yazarsın

if(++sayac >= 500)
{
  sayac = 0;
  istedigini_yap();
}

mesela yukarıdaki rutin ile saniyede bir defa istedigini_yap() fonksiyonu çalıştırılıyor

alikorkmaz_88

anlamadım daha açık yazabilirmisin bi örnek kod? timer nası ayarlamam gerekiyor ? teşekkürler

CaFFeiNe

mesela aşağıdaki örnekte pwm periyodu 1 saniye ve duty değerini UP/DOWN butonları ile %1 hassasiyette ayarlayabiliyorsun
fan kontrolü için biraz fazla hassas olmuş olabilir örnek olsun diye yaptım

duty += 5;
duty -= 5;

satırlarındaki 5 değerini 50 yaparsan duty değeri %10 hassaslıkta olur yani fanı 10 kademe kumanda edebilirsin





proje dosyaları
picproje.4shared.com altında
Picproje Örnekler klasöründe
pwm.zip dosyasındadır.

alikorkmaz_88

helal olsun abi  :D her döngüde 20 ms oluşturmuşsun çok sağol yeni bir soru periyotu 20 ms olması gerek  

#int_timer0
void Timer0_Int(void)
{
   set_timer0(131); // saniyede 500 kesme üretir
   if(++x >= 500)
   {
     x = 0;
     pwmstart = 1;
     dutytemp = duty;
   }

   output_high(LED);
   delay_ms(10);
   output_low(LED);
   delay_ms(10);

}

yapsam ? yada alt bi programa yönlendirsem
hangisi mantıklı olur

void pwm(void)
  {
   output_high(LED);
   delay_ms(10);
   output_low(LED);
  }

#int_timer0
void Timer0_Int(void)
{
   set_timer0(131); // saniyede 500 kesme üretir
   if(++x >= 500)
   {
     x = 0;
     pwmstart = 1;
     dutytemp = duty;
   }

pwm();

}

yoksa ikiside mantıksızmı ? alt program kullarak ana programı yavaşlatmış olurmuyum ana programı haricinde mi çalışır yoksa? ana programda yapmam gereken işler var. bunun içinde bir interput oluşurmu ?