Efektif değer hesaplamanın basit yolu

Başlatan Zoroaster, 31 Ekim 2016, 20:53:49

frederic

Şebeke akım ve gerilim ölçümü düşünüyordum bu aralar, true rms araştırırken acaba bu olayımı denesem diye düşünüyorum şimdi.

Zoroaster

Alıntı yapılan: mihri - 02 Kasım 2016, 08:34:15
Peki örnekleme frekansı ne olmalı?

En az hata için olabildiğince yüksek tut.
Seytan deliginden kacti.

FxDev

#17
Bu işte bir terslik var, hatam varsa düzeltin. Bırakın daha sinüsü daha DC RMS hesaplayamıyor bu formül. Bir de işlemcim float işlerle uğraşmak zorunda kalacak.

Benim ADC'den gelen değerim sürekli DC 10 count olsun. RMS'i 10'counttur. Yalnız bu formülü binlerce kez işletmem lazım doğru sonuca varmak için. Bir sıkıntı var. Benim kafama yatmadı, yatırtabilir misiniz @Zoroaster ? Bu işlemin doğru sonuca ulaşması için bir çok kez öteleme gerekecek, hız kazanımı nerede o halde?

Forumda bazı bağnaz kişiler tarafından engellenip, atıldım. Tüm bu bağnaz kişilere rağmen Atatürkçülüğü sonuna kadar savunacağım; onlar da bağnazlıklarında boğulacaklar. Haberleşme için: info[at]firatdeveci.com / ©firatdeveci.com - ße Different Everytime!

CLR

char adcvalues[ ]={3,5,7,9,11,3,5,7,9,11,3,5,7,9,11,3};  // 16 değer var

bu değerlerin verdiğin algoritmaya göre rms'ini hesaplatan bir program yazar mısın?

veya ben aşağıya programı yazdım, bir kontrol et,
Hata yoksa sonuç 1.05 çıkıyor, oysa 7.34 gibi bir değer çıkması gerekiyordu, hem de sonucun 3 den küçük çıkması imkansız.

char adcvalues[ ]={3,5,7,9,11,3,5,7,9,11,3,5,7,9,11,3};

int main(int argc, char** argv) {
	float Ve=1.0;
	int  Cnt;
	
	for(Cnt=0;Cnt<sizeof(adcvalues);Cnt++){
		Ve= (((adcvalues[Cnt] * adcvalues[Cnt] / Ve) + (Ve * 16383)) / 16384);
	}
	
	printf("Rms Value : %f" , Ve); 
	
	
	return 0;
}
Knowledge and Experience are Power

muhittin_kaplan

Alıntı yapılan: CLR - 02 Kasım 2016, 15:06:32
char adcvalues[ ]={3,5,7,9,11,3,5,7,9,11,3,5,7,9,11,3};  // 16 değer var

bu değerlerin verdiğin algoritmaya göre rms'ini hesaplatan bir program yazar mısın?

veya ben aşağıya programı yazdım, bir kontrol et,
Hata yoksa sonuç 1.05 çıkıyor, oysa 7.34 gibi bir değer çıkması gerekiyordu, hem de sonucun 3 den küçük çıkması imkansız.

char adcvalues[ ]={3,5,7,9,11,3,5,7,9,11,3,5,7,9,11,3};

int main(int argc, char** argv) {
	float Ve=1.0;
	int  Cnt;
	
	for(Cnt=0;Cnt<sizeof(adcvalues);Cnt++){
		Ve= (((adcvalues[Cnt] * adcvalues[Cnt] / Ve) + (Ve * 16383)) / 16384);
	}
	
	printf("Rms Value : %f" , Ve); 
	
	
	return 0;
}


excel 1,050103 çıkartıyor.

Zoroaster

#20
Bu algoritma son derece kusursuz ve çok sağlam matematik alt yapıya sahip. Sonsuz bir döngüde işletilir.

MCU ADC dönüşümü yapar bu algoritmaya göre hesaplama yapılır ve ramda efektif değeri saklayan değişkene sonuç yazılır. Dolayısı ile bu rutini ADC interrupt rutinine ilave edeceksiniz.

Siz efektif değeri bilmek istediğinizde gider ve o değişkeni okursunuz.

Böylece algoritma girişteki sinyalin an ve an efektif değerini hesaplar.

İşin püf noktası burada. Zaten web sitemde verdiğim algoritmada döngü dışına çıkmaktan hiç bahsetmedim.

-----------

@CLR

16 değer için hesapladıktan sonra tekrar başa dön tekrar hesapla tekrar hesapla......

@FxDev

Hız kazanımı nerde?

Güzel soru.

Hız kazanımı algoritmayı kodlamadaki ustalığınızda gizli ve işlemciye getireceğin yük tamamen yazacağın kodun kalitesi ile ilgili.

---------------------

Bildiğiniz gibi sistemler uyarıldığında ilk başlarda geçici rejim baskındır. Bu rejim bittikten sonra sürekli rejim cevabı aradığınız cevabı verir. Aynı durum bu algoritma için de geçerli. Bu algoritma bir sistemin matematiksel modeli.

--------------------

Peryodunu bilmediğiniz bir sinyalin efektif değerini nasıl hesaplarsınız?

Fakat benim algoritmam hesaplar. Bu algoritma ile gürültü sinyalinin dahi efektif değerini hesaplayabilirsiniz.

--------------------

Kusura bakmayın ben kod yayınlamam. Kalitesiz kodlarımı gözler önüne serip kendimi rezil etmek istemem.
Seytan deliginden kacti.

muhittin_kaplan

sizce kaç sample sonra doğru değeri gösterecek @Zoroaster yukardaki 3-5-7-9-11 değerlerinde ?

FxDev

@Zoroaster: Kusura bakma ama bu kod hiç de efektif değil. Karekökten kurtulacağız diye iki adet float bölme ile uğraşıyoruz. En büyük problem burada. ARM ya da FPU birimine sahip olan işlemcilerde problem değil ama gariban 8bit işlemcilerin halini düşünemiyorum. Tekrar ve tekrar, tekrar ve tekrar. Sabit 10 sayısı verdim. Kaç iterasyon sonra gerçek değeri yakaladı biliyor musun; yaklaşık 1600 cycle sonrasında. 20kHz ile ADC ölçümleri aldığını düşün, ~0.1 saniye sonra nihayi sonuca ulaşıyorsun bir de sinyal oynaksa vay halimize. 3 fazla uğraşan arkadaşlara şimdiden geçmiş olsun, 3 adet LN, 3 adet LL ve 3 adet de akım okuyacaksanız RMS olarak vaylar ki vaylar. Şu an benim bu 9 adet RMS'i hesaplamam 5us sürüyor, bir de kalibrasyonu, ortalaması vs. de var.

Fluke vb. makineler sizce frekans vs. biliyorlar mı? Hayır. Sadece örnek zamanlarını çoğaltıyorlar. Yoksa her sinyalde başka sonuç arama işine girecekler.

1600 adet örnek alıp, bu örnekler üzerine çalışarak frekansı bilmediğin sinyalin RMS değerini hesaplamaya çalışıyorsun. Eh bir zahmet hesapla.

Herkesin derdi başka tabi, ben şebekede yarım cycle içerisinde RMS değer ne oluyor ne bitiyor bilmeliyim, sen 1Hz ile atıyorum 1MHz arasındaki sinyalin RMS'ini hesaplamak istiyorsun.

Evet doğruluğu kanıtlanmış süper bir algoritma (!).
Forumda bazı bağnaz kişiler tarafından engellenip, atıldım. Tüm bu bağnaz kişilere rağmen Atatürkçülüğü sonuna kadar savunacağım; onlar da bağnazlıklarında boğulacaklar. Haberleşme için: info[at]firatdeveci.com / ©firatdeveci.com - ße Different Everytime!

Zoroaster

#23
Bunu hiç dert etmeyin. MCU'ya elektriği verdiğiniz andan itibaren algoritma zaten hesap yapmaya başlıyor. Size efektif değer lazım olunca hesap falan yapmıyorsunuz sadece Veff değişkenindeki değeri okuyorsunuz.

Olayı şöyle düşünün.

ADC peryodik olarak int çakmakta. Algoritma hesap yapıp int rutinininden çıkılmakta.
ADC mesela her 50us de int çakıyor.

Sonuçta beklediğiniz doğruluk, efektif değeri alınan sinyalin frekansına göre ADC sample sürelerini ayarlarsınız.

Bu bir peryodik int rutini.

Seytan deliginden kacti.

muhittin_kaplan

#24
ben 3-5-7-9-11 değerlerini verdim. 7,54 e 50000 (ellibin) iterasyonda ulaştı.

Zoroaster

Ne güzel işte. Amaç efektif değeri hesaplamak değilmiy di.

50000'inci interupt palsına kadar geçici rejim devam etmiş biraz daha devam edecek görünüyor. Demekki bundan sonra giriş sinyalini çok yakından takip etmeye başlayacak.

Aslında bu süreyi çok aşağılara çekebilirsiz. Fakat algoritmanın şu anki halinin kimseye zararı yok.

Seytan deliginden kacti.

muhittin_kaplan

10 değerini verdim, tam 10 değerine ulaşması 131949 (132 bin yaklaşık) iterasyonda oldu.

FxDev

Ya @Zoroaster şöyle güzel algoritma, böyle mükemmel matematik diyeceğine işin mantığını anlatsan.

Şimdi @muhittin_kaplan 50us'de int çaksa, ki bu demek oluyor ki en fazla 20kHz örnekleme demek. Eh en az 16 data alınsa 1kHz sinyali ölçebilirsin, adam 1kHz sinüsün RMS'ini hesaplamak için 50us*132bin=6.6saniye sonra sonuç alacak. Peki ya kritik bir sinyalse bu ne yapacağız şimdi. 6.6saniyede neler olur benden iyi biliyorsun, adamlar 100 metreyi koşuyor o sürelerde.
Forumda bazı bağnaz kişiler tarafından engellenip, atıldım. Tüm bu bağnaz kişilere rağmen Atatürkçülüğü sonuna kadar savunacağım; onlar da bağnazlıklarında boğulacaklar. Haberleşme için: info[at]firatdeveci.com / ©firatdeveci.com - ße Different Everytime!

Zoroaster

Anlaşıldı beğendiremedik.

Peki AC 50Hz ile ark kaynağı yapan makinanın elektrod akımının efektif değerini ölçmek istiyorum. Hadi bakalım MCU ile efektif değeri ölçecek bir kod yazıverin.
Seytan deliginden kacti.

FxDev

@Zoroaster : Senin algoritmada hesaplayamıyor ki onu, elma/armut kıyaslaması yapma şimdi. Akım 0'ken bir anda 100A'e fırladığında hesaplaması 130bin cycle sürecek yine.
Forumda bazı bağnaz kişiler tarafından engellenip, atıldım. Tüm bu bağnaz kişilere rağmen Atatürkçülüğü sonuna kadar savunacağım; onlar da bağnazlıklarında boğulacaklar. Haberleşme için: info[at]firatdeveci.com / ©firatdeveci.com - ße Different Everytime!