Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

pwm dimmer süresini ayarlama

Başlatan cseb, 23 Ağustos 2014, 15:42:01

cseb

Arkadaşlar merhaba,
Dimmer tasarlıyorum, dim yaparken süresini de parametrik olarak ayarlamak istiyorum. Şöyle ki, dim seviyesini %0 dan %100 e getirene kadar geçen süreyi parametrik olarak değiştirebilmem gerekiyor. Mesela time değişkenimiz olsun, bu değişken 5 olduğunda dim seviyesi %0 dan %100e 5 snde gelmeli , ya da time değeri ne ise o kadar süre içinde dim yapabilmeliyim. Konu ile ilgili fikir ihtyacım var yardımcı olrmusunuz.

OnderGrmz

Bunun için kendine bir fonksiyon yazabilirsin.
Zamanı int a; gibi bir değişkene atarsın.
Sonra bunu float b=a/100; gibi bir kod satırı izler.
Fonksiyonun içinde ise bir for döngüsü olur. Döngü 1'den 100 ' e kadar işler. Döngünün içine ise PWM sinyalini her seferinde %1 arttıracak komutu yazarsın. Sonra gecikme fonksiyonunu yazarsın delay_ms (b); gibi. Bu şekilde a değişkenine atadığın zaman değeri süresinde PWM sinyalin %1'den % 100 'e çıkar ve dimleme işlemini gerçekleştirmiş olursun.

cseb

Demek istediğiniz aşağıdaki gibi bir fonksiyonmu? Bir de burda pwm in %1 lik miktarını nasıl arttıracağız?  Ben burada 2.55 değerinde arttırma yazdım ama değişken tipi int yada char olduğu için onu 3 e yuvarlar , yanlışım varsa düzeltin. pwm 0 ile 255 arasında değer alıyor çünkü.

void pwm_adjust(void)
{
	int time;
	float b = time / 100;

	for ( i = 0; i < 100; i ++)
	{
		pwm = pwm + 2.55;
		pwm_out(pwm);
		delay(b);
	}
}

OnderGrmz

Öncelikle Merhabalar;
Geç cevap verdiğim için kusura bakmayın.
Alıntı yapılan: cseb - 24 Ağustos 2014, 12:20:07
Yanlışım varsa düzeltin. pwm 0 ile 255 arasında değer alıyor çünkü.
Evet yukardaki ifadede yanlışınız var.Sizin bahsettiğiniz değer pwm sinyalinin üretildiği Timer 2 zamanyalıcısı prescaler ( bölme oranı ) değeridir.
Prescaler değeri 8 bit'liktir. Yani 0 ile 255 arasında değişir. Prescaler değerini 100 yaparsanız sorun olmadan pwm sinyalini %1 aralıklarla arttırabilirsiniz.
Aşağıda örnek alması açısından bir kod veriyorum.
int a=0;
setup_timer_2(T2_DIV_BY_1,100,1);
for ( i=0;i<100;i++)// pwm %1 arttırılıyor.
      {		
        a++;
		set_pwm1_duty(a);
		delay_ms(10*1000/100); // Dimleme işlemi için süre 10 sn. olarak seçildi !!!
      }


Prescaler değeri 255 olursa yazmanız gereken kod şu şekildedir.
float a=0;
setup_timer_2(T2_DIV_BY_1,255,1);
for ( i=0;i<100;i++)// pwm %1 arttırılıyor.
      {      
		a+=(255/100);
		set_pwm1_duty(a);
		delay_ms(2*1000/100); // Dimleme işlemi için süre 2 sn. olarak seçildi !!!
      }


İyi çalışmalar ...




serkan_esk

On numara anlatim ve ornek agzina saglik onder bey

gokhan1325

Merhabalar, Ben pwm ile dimmer yapmayı düşünüyorum. Ancak kafama takılan bir soru var. Şebeke sinyali ile pwm'i nasıl senkronize yapabilirim. Dimmerde böyle yapılıyor diye biliyorum. Yardımcı olursanız sevinirim. Saygılarımla

z

Pwm frekansı ile şebeke frekansını aynı yaparsan ve şebekenin her sıfır geçişinde pwm sayıcısını sıfırlarsan senkronize tmiş olursun.
Dimmer yapmak için pwm kullanabilirsin fakat gerek yok.

Basit bir timera ilk değer yükler ve şebeke sıfırını algılar algılamaz timeri saydırmaya başlarsan timer taştığı anda üretilen interrupt sana tetikleme anını belirler. Timera yükleyeceğin ilk değeri değiştirerek tetikleme yapacağın noktayı da değiştirmiş olursun.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com