PWM Okuma.

Başlatan muhittin_kaplan, 08 Ocak 2012, 21:16:50

muhittin_kaplan

MCU ya uygulanan bir PWM sinyali Hangi Yöntemlerle Öğrenebiliriz ?

frat

Hep beraber aldığımız Logic Analyzer'dan çok temiz bir şekilde bilgisini görebiliriz:) Sinyal genişliğini, frekansını çok net okuyabiliyorum.

Ya da Picbasic ile Pulsin komutunu LCD'de yazdırarak ya da Capture özellikli bir Pic ile bilgisi okutulabilir.
DataCNC ve Robotus Mühendislik Kurucusu // https://www.robotus.net & https://www.datacnc.com

pea

Frekans ölçen multimetrelerde %Duty gösterme özelliği olabiliyor.
Osiloskop da olabilir.

muhittin_kaplan

Şu MCU yada Şu Dille Şu Komutla yerine sistemi sormuştum.
Yani Kondansatörle DC gerilime çevirebiliz vs gibi.
8 Adet sinyali Ölçem gerekiyor.

mozkan87

Aslında en temiz yöntem PWM nin high ve low side zamanlarını ölçmek. Bunun için CCP modülü kullanılabilir.

ErsinErce

1 snlik timer ve istediğiniz çözünürlüğe göre başka bir timerı ayarlayıp portların durumları zamana göre değerlendirilebilir hocam

muhittin_kaplan

1sn timer potları taramak, diğeri high yada low durumunu kontrol etmek için mi

fatihinanc

Alıntı yapılan: muhittin_kaplan - 08 Ocak 2012, 22:58:09
1sn timer potları taramak, diğeri high yada low durumunu kontrol etmek için mi

Hocam 1 sn PWM frekansını tesbit etmek için. CCP gibi bir modülle rahat yapılabilir gibi.
Bir tane timer sabit 1saniyeye ayarlı olmalı, diğeri ise bir pinden gelen palseri saymalı. Her pals geldiğinde bir değişken bir arttırılmalı ve 1 sn lik kesme oluştuğunda bu sayaca bakılarak PWM frekansı tesbit edilmeli.

High ya da low durumu için ise timer sayacını kontrol ederek palsin 0 ya da 1 de kalma süresini tesbit edebilirsiniz.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

muhittin_kaplan

#8
@fatih
yazdıklarınızı işlem basamağı olarak yazabilir misiniz ?
(8 Adet PWM okumam gerek)



--Düzeltme--
8 Kanal Olduğu eklendi

ErsinErce

1sn lik timer A olsun, 10ms lik timer B olsun

B timerının kesmesi 8 pinin H->L ve L->H geçişlerindeki A temelli zaman farklarını 8 ayrı yazmaca aktarmaya ayarlanacak

A timerının kesmesi A yı ve B yi pasif konuma geçirecek

ilk başta A ve B yi beraber başlatıyoruz

A nın pasif duruma geçmesini bekliyoruz, pasif duruma geçince yüksekte kalma ve düşükte kalma sürelerine göre Duty ve frekansı görmüş oluyoruz

fatihinanc

Hocam aşağıdaki bağlantıda güzel bir çalışma var.
http://www.fatiherdem.net/at89s52-ile-frekansmetre/

8 kanal için 8 ccp pini kesinlikle gerekli mi onu tam kestiremedim ama eğer öyleyse en basitinden bu iş ARM CM0 lar ile daha rahat olur. Onlarda timerları 2 ye bölüp iki adet ccp olarak kullanmak mümkün.

Frekans için adımları sıralayacak olursak;
1- 1.Timerı 1 sn ye kur
2- 2.Timerı capture olarak hem düşen hem de yükselen kenarda tetikleme üretecek şekilde ayarla
3- 1sn olduğunda timer1 kesme vektörü içerisinde timer2 ccp değerini oku (bu değerin 2 ye bölümü frekansı verir çünkü kesme hem yükselen hem de düşen kenar)

High ve Low süresi tesbiti için;
Başka bir timer, 2.Timer kesme ürettiği an çalıştırılarak kesmeye gitme durumlarına göre hem high süresi hem de low süresi tesbit edilebilir.

Pek ekonomik bir yöntem olmadı ama kabaca mantığını anlatmaya çalıştım. Biraz optimizasyon yapılarak bazı işler i/o pinleri ile de yapılabilir.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

muhittin_kaplan

PWM_OKU(char Kanal)
{

static int okunan;
static int onceki;
	okunan=GPIOA->IDR & 0x00000001<<Kanal;
	if ((okunan==0)&&(onceki==1))
		{
		Olculen_Kanal[Kanal]++;
		}
	if ((okunan==1)&&(onceki==0))
		{
		SendChar(Olculen_Kanal[Kanal]);
		Olculen_Kanal[Kanal]=0;
		}
	if ((okunan==1)&&(onceki==1))
		{
		Olculen_Kanal[Kanal]++;
		}	  
onceki=okunan;
}

denemedim nasıl olur ?