Picproje Elektronik Sitesi

SERBEST BÖLGE => Programlama ve Algoritma => Konuyu başlatan: muhittin_kaplan - 08 Ocak 2012, 21:16:50

Başlık: PWM Okuma.
Gönderen: muhittin_kaplan - 08 Ocak 2012, 21:16:50
MCU ya uygulanan bir PWM sinyali Hangi Yöntemlerle Öğrenebiliriz ?
Başlık: Ynt: PWM Okuma.
Gönderen: frat - 08 Ocak 2012, 21:38:48
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.
Başlık: Ynt: PWM Okuma.
Gönderen: pea - 08 Ocak 2012, 22:09:27
Frekans ölçen multimetrelerde %Duty gösterme özelliği olabiliyor.
Osiloskop da olabilir.
Başlık: Ynt: PWM Okuma.
Gönderen: muhittin_kaplan - 08 Ocak 2012, 22:14:42
Ş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.
Başlık: Ynt: PWM Okuma.
Gönderen: mozkan87 - 08 Ocak 2012, 22:20:17
Aslında en temiz yöntem PWM nin high ve low side zamanlarını ölçmek. Bunun için CCP modülü kullanılabilir.
Başlık: Ynt: PWM Okuma.
Gönderen: ErsinErce - 08 Ocak 2012, 22:29:14
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
Başlık: Ynt: PWM Okuma.
Gönderen: muhittin_kaplan - 08 Ocak 2012, 22:58:09
1sn timer potları taramak, diğeri high yada low durumunu kontrol etmek için mi
Başlık: Ynt: PWM Okuma.
Gönderen: fatihinanc - 08 Ocak 2012, 23:13:57
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.
Başlık: Ynt: PWM Okuma.
Gönderen: muhittin_kaplan - 08 Ocak 2012, 23:18:38
@fatih
yazdıklarınızı işlem basamağı olarak yazabilir misiniz ?
(8 Adet PWM okumam gerek)



--Düzeltme--
8 Kanal Olduğu eklendi
Başlık: Ynt: PWM Okuma.
Gönderen: ErsinErce - 08 Ocak 2012, 23:47:47
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
Başlık: Ynt: PWM Okuma.
Gönderen: fatihinanc - 08 Ocak 2012, 23:48:29
Hocam aşağıdaki bağlantıda güzel bir çalışma var.
http://www.fatiherdem.net/at89s52-ile-frekansmetre/ (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.
Başlık: Ynt: PWM Okuma.
Gönderen: muhittin_kaplan - 15 Ocak 2012, 15:07:43
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 ?