Yazılımsal Pwm

Başlatan serhat1990, 21 Mart 2012, 22:15:19

serhat1990

Merhaba arkadaşlar , ben yazılımsal pwm yapmak istiyorum 2 kanal falan yaptım sıkıntısız çalışıyor yalnız 8 kanal gibi bir ihtiyacım var. Ayrıca her kanal dışarıdan kontrol edileceğinden program sürekli denetleme durumunda yaptım pwm'i fakat veri beklemek falan işlemleri karıştırıyor. Tam olarak çözebilmiş değilim bu konuda fikir verebilecek arkadaşlardan cevap bekliyorum. Benim izlediğim yol 2 tane timer kullandım 1 timer 4 kanalı diğer timer'da diger 4 kanalı kontrol ediyor. Osilaskopta gözlemlediğimde pwm sinyalinin sonunda bir bosluk var . Yani diger pwm sinyali olusmadan arada bir bosluk var. Yardımcı olursanız sevinirim iyi çalışmalar...

z

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

serhat1990

Sağolun Bülent Hocam çok teşekkür ederim ,

serhat1990

Yazılımsal pwm oldu yalnız söyle bir sıkıntı yaşıyorum. Simulasyon ortamında osilaskopta falan çok güzel bir sinyal görüyorum fakat gerçekte denediğimde bazı portlarda görmem gereken gerilimleri görüyorum fakat bazılarında alakasız degerler cıkıyor bunun nedeni ne olabilir acaba.

serhat1990

#4
Bu konu hakkında yorumu olan yokmu çıkışları tek tek inceledim , simulasyon ortamında sonuçlar çok güzel fakat gerçekte alakasız değerler görüyorum 

pwm şu sekilde sağlanıyor... pwm1 ,pwm2,pwm3... hepsi b portunda... 16mhz osc kullanıyorum...

if(TMR1IF)	
  
	{
		pwmsayici++;		//pwm sayıcısını arttır. ( peryod için kullanırım )
 		GIE=0;PEIE=0;		//GENEL VE YARDIMCI KESMELER KAPATILIR...
		TMR1ON=0;			//TMR1 SAYMAZ.
		TMR1L=0xFC;		// TMR1 DEGERİNE 65532 YÜKLENİR ( 3 KERE SAYACAK )
		TMR1H=0xFF;		// TMR1 DEGERİNE 65532 YÜKLENİR / 3 KERE SAYACAK )

	if(pwmsayici==pwmvariable1)PWM1=0;
	if(pwmsayici==pwmvariable2)PWM2=0;
	if(pwmsayici==pwmvariable3)PWM3=0;
	if(pwmsayici==pwmvariable4)PWM4=0;
	if(pwmsayici==pwmvariable5)PWM5=0;
	if(pwmsayici==pwmvariable6)PWM6=0;
	if(pwmsayici==pwmvariable7)PWM7=0;	
	if(pwmsayici==pwmvariable8)PWM8=0;

	if(pwmsayici==1024)
	{
		pwmvariable1=100;//pwmdeger1;		//pwm1 'in duty degeri yüklenir.
		pwmvariable2=200;//pwmdeger2;		//pwm2 'nin duty degeri yüklenir.
		pwmvariable3=400;//pwmdeger3;		//pwm3 'ün duty degeri yüklenir.
		pwmvariable4=500;//pwmdeger4;		//pwm4 'ün duty degeri yüklenir.
		pwmvariable5=700;//pwmdeger5;		//pwm5 'in duty degeri yüklenir.
		pwmvariable6=800;//pwmdeger6;		//pwm6 'nın duty degeri yüklenir.
		pwmvariable7=900;//pwmdeger7;		//pwm7 'nin duty degeri yüklenir.
		pwmvariable8=1000;//pwmdeger8;		//pwm8 'in duty degeri yüklenir.
		pwmsayici=0;
		PORTB=255;

	}
		TMR1IF=0;			//bayragı temizle		
		TMR1ON=1;			//TİMER1 BASLATILIR...
		GIE=1;				//kesmeleri ac
		PEIE=1;				//yardımcı kesmeleri ac.

serhat1990

#5
Gerilimler tam gözükmeye başladı sayılır fakat bir kac kanalda 5-10mV Bir fark söz konusu osilaskop görüntüsü aşağıdadır. Sizce ne yapmak gerekiyor. Her kanalda olsa neyse diyecem  ama bazı kanallarda şaşırttı beni.

Görüntüler aşağıdaki gibidir.




bymrz

- O portun hepsinin çıkış olduğuna emin misin ?
- O portlardan herhangi birinde, o porta özel bir özellik olup ta bu özellik aktif durumda olabilir mi?( işlemci modelin nedir? )

serhat1990

1827 kullanıyorum hocam , portun hepsi cıkıs cünkü gerilimleri tam görmeye basladım fakat bazı pinlerde 5-10 mV farklılıklar var. Buda kafamı karıştırıyor. Neden sadece bir kaç kanalda var yada neden hepsinde yok..

bymrz

#8
ANSELB
LATB
OPTION_
PORTB
TRISB
WPUB


Bu registerların hepsini kontrol ettiğine emin misin hocam. Bu portta bir çok özellik var, Bunlara iyice bakıp, o özellikleri doğru ayarlamalı, iptal etmelisin...


Özellikle datasheet teki TABLE 12-5: PORTB OUTPUT PRIORITY' ye bakarsan, o portlarda neler olduğunu görebilirsin...

serhat1990

Hocam hepsini kontrol ettim , onlarda sıkıntı yok... Nedenini çözebilmiş değilim.

serhat1990

RC filtre falan çok şey denedim fakat resimlerde kırmızı ile belirtilen dalgalanmayı önleyemedim bu yüzden voltaj değeri bazı pwm kanallarında 5-10mV civarı bir oynama yapıyor sizce nasıl bir filtre uygulamalıyım.




bymrz

hocam resimlerde net gözükmüyorda, yazılımdan da anladığım kadarı ile senin timer kesmesine girme süren çok mu kısa sanki? 65536-65532 = 4usn çok kısa bir süre. Bu kadar hızlı kesmeye gidersen stabil bir pwm alamazsın bu arada. Fakat senin bu alttaki kırmızı işaretli yerlerdeki dalga çok garip . sanki hatta bir capacitor varmış gibi. Hocam bu arada bu ölçümü yaparken bu ölçtüğün bacaklar tamamen boşta değil mi, ve de işlemcinin bacağının dibinden ölçüyorsun ? 

serhat1990

Aynen hocam dediğiniz gibi ölçüyorum benim anlamadığım şey kondasatör şarj olma karakteristiği gibi alttaki işaretli bölüm. Timer süresine gelince hocam uzun tutunca pwm periyodu çok uzun oluyor buda çıkış voltjında değişimler gözükebiliyor.  Ondan dolayı çok kısa hocam...

bymrz

yalnız timer kesmesi içerisindeki if komutlarının koşullarına göre kesme içinde her seferinde farklı zamanlar geçeceğinden, zaten pwminde bir kararsızlık olacaktır.  Bu arada bu bahsettiğim kararsızlık olmaması için de timer değerine daha düşük bir değer yükle ve timer ı hiç bir zaman durdurma, kesmenin içinde de saysın...

Ama senin şu eğri, sanki pinin çıkışında bir direnç ve kondansatör varmış gibi... Sen yine de bi şu portların capacitive touch vs. özellikleri kısmını felan bi kontrol et... :)

serhat1990

Anladım hocam , kesmeyi hiç durdurmazsam örneğin 8.kanal 10 bit değer üzerinden 15 yüklendi diyelim geLen veriye göre . Ama ben kesmeyi kapatmadığımdan oraya gelene kadar kesme girdiğinden araya puls üretirkenki gecikme sıkıntı yaratmazmı sizce hocam. Parazit sadece puls'in kenarlarında var osilaskopta gördüğüm kadarıyla voltaj değerinede bakarken söyle birsey dikkatimi çekiyor. 5 10 mV bir fark var diyorum ya bu fark sürekli değil şu şekilde örneğin görmem gereken değer 1.615 v olsun ben su degerleri goruyorum sureklı degiserek , 1.615 , 1.614 , 1.610 , 1.617 , 1.620 gibi ...