Akım Trafosu ile 220V Akım Ölçümü

Başlatan Proteus, 28 Kasım 2020, 21:59:23

Erol YILMAZ

#15
Birşeyleri yanlış yapıyorsun.  Dif amp yapısı belli.
100mVp-p giriş sinyali, 2.5V offset ve 5x kazanç ile çıkan sonuç aşağıdaki gibi...
lehimsiz bir direncin var gibi :)

Whats-App-Image-2020-12-02-at-23-43-01" border="0

Dave de aynı hesaplarla anlatıyor konuyu...  33. dk

https://www.youtube.com/watch?v=7FYHt5XviKc

dave-diff-amp" border="0


z

#16
Mavi ve sari olcumleri ayni zamanda yapmissiniz.

Sekonderdeki olcumleri nasil yaptiniz scopu sekondere nasil bagladiniz?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Proteus

Herkese çok teşekkür ederim çözdüm sorunları skop kalibrasyon ile ilgili bir sorun vardı ayrıca ac coupled ile okududum sinyali.

Mavi çıkış sarı giriş kazanç 4.54
Vref 1.65 olarak guncelledim
Opamp beslemesini de 5V bıraktım daha iyi aralıklar görmek için


Proteus

Alıntı yapılan: z - 03 Aralık 2020, 13:37:37Mavi ve sari olcumleri ayni zamanda yapmissiniz.

Sekonderdeki olcumleri nasil yaptiniz scopu sekondere nasil bagladiniz?


Sekonder de 50 ohm burden direncim var 0.46/1000*50=23mv RMS çıkıyor giriş sinyalim yani

Proteus

Arkadaşlar Kolay gelsin,
STM Studio'da aldığım değerler bu şekilde,



Timerim 200 us kurulu eğer aşığıdaki 1ms delay aktif edince grafik stabilleşiyor.Yük bağlı değilken 1.65V iken tam çıkış 200-250 arasında değerler alıyorum.Karta sürekli reset atarak.1ms delay sanırım timerimin çalışmasını engelliyor.Yük bağlayınca  ve tekrar reset işlemi uygulayarak değerleri okumaya calısıyorum değerler + - olarak  değişiyor.

RMS olarak değerleri alıyorum.Hesapda yapabiliyorum sorun yok , sorun ADC'nin dalgalanması bir videoda izledim 1ms delay koydu eleman sorunu çözdü ama benim diğer tarafı patlatıyor çözüm olarak ne yapabilirim.

https://www.youtube.com/watch?v=UzvIXeRCZw0&ab_channel=Weblearning
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* Prevent unused argument(s) compilation warning */

HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
	
	HAL_ADC_Start(&hadc1);
		 if (HAL_ADC_PollForConversion(&hadc1,5)==HAL_OK)
			
			 

for( count = 0 ; count < 100 ; count++ )
		
{
	adc_raw_data[count] = HAL_ADC_GetValue(&hadc1);
  rawrms += adc_raw_data[count] * adc_raw_data[count];
}
   if (count >=100){
	count =0;
rms = sqrt(rawrms / 100);
rms=rms-2047;
//		 HAL_ADC_Stop(&hadc1);
//	 HAL_Delay(1);
 }

JOKERAS

for( count = 0 ; count < 100 ; count++ ) {
  adc_raw_data[count] = HAL_ADC_GetValue(&hadc1);
  rawrms += adc_raw_data[count] * adc_raw_data[count];
}
if (count >=100){ 
    count =0;
    rms = sqrt(rawrms / 100);
    rms = rms-2047;
}

Yukarıdaki İf Bloğunun hiç bir anlamı yok!
Ayrıca, rawrms değişkenini for döngü bloğuna girmeden önce rawrms = 0; sıfırla.

Alttaki gibi deneyin bir.
  rawrms = 0;

for( count = 0 ; count < 100 ; count++ ) {
  adc_raw_data[count] = HAL_ADC_GetValue(&hadc1);
  rawrms += adc_raw_data[count] * adc_raw_data[count];
}
  rms = sqrt(rawrms / count);
  rms = rms-2047;

Proteus

Alıntı yapılan: JOKERAS - 07 Aralık 2020, 16:37:32
for( count = 0 ; count < 100 ; count++ ) {
  adc_raw_data[count] = HAL_ADC_GetValue(&hadc1);
  rawrms += adc_raw_data[count] * adc_raw_data[count];
}
if (count >=100){ 
    count =0;
    rms = sqrt(rawrms / 100);
    rms = rms-2047;
}

Yukarıdaki İf Bloğunun hiç bir anlamı yok!
Ayrıca, rawrms değişkenini for döngü bloğuna girmeden önce rawrms = 0; sıfırla.

Alttaki gibi deneyin bir.
  rawrms = 0;

for( count = 0 ; count < 100 ; count++ ) {
  adc_raw_data[count] = HAL_ADC_GetValue(&hadc1);
  rawrms += adc_raw_data[count] * adc_raw_data[count];
}
  rms = sqrt(rawrms / count);
  rms = rms-2047;

Teşekkürler değişkeni sıfırlamak gözden kaçmış :(
Değerler çok hızlı değişiyor offset gerilimi sayısal olarak çıkardım.0-500 arası değişiyor.
Aslında şuan tam okuyorum başka bir timer daha kurup değerleri belli peryotlarda  ekrana mı yazdırsam.
Nasıl bir yol izleyebilirim fikir olarak ?

mehmet

Alçak geçiren filtre olabilir
bir sonraki adım...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

Proteus

Alıntı yapılan: mehmet - 07 Aralık 2020, 18:29:01Alçak geçiren filtre olabilir
bir sonraki adım...

Donanımsal filtre sen bahsediyorsunuz dimi hocam RC ?

Kesim frekansı 50 Hz  olmalıdır değil mi?

Ayrıca yazılım ve algoritma olarak da tavsiyeleriniz benim için çok iyi olacaktır.


Kafamda olan klasik DMA ile okumak var
Ayrıca ADC kalibrasyonu hakkında neler yapabilirim?

ADC ölçümlerinde trickleri merak ediyorum çok hassas ölçümler için.

Kolay gelsin



mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

z

#25
Filitrelemede kesim frekansı için alliasing etkisini giderecek köşe frekansının altına inmek tehlikelidir.

Eğer bir tam periyodda (20ms) 100 örnek alırsan her bir örnek 0.2 ms eder. Bu da 5000 Hz demektir. Bununla da 2500Hz sinyal örneklenebilir. Yani 50 harmoniğe kadar sağlık örnekleyebilirsin.

Bu durumda kacinci harmonigi degerlendireceksen o harmonigin yukarisinda bir frekansta filitreleme yapabilirsin. Bu yuzden 50 Hz filitreleme yapilmamali.

RMS değer ölçmek istendiğine göre harmoniklerin voltaja olan etkisi öğrenilmek isteniyor demektir. Filitre yapıldığında harmoniklerin genliği tehlikeye girer ölçüm değerleri sapmaya başlar.

Yazdığın kütüphaneden anlamıyorum ama bu işlerde timer ile zamanı kesin anlarda sample toplaman lazım.
ADC ile ölç kaydet ölç kaydet sonra da ölçüm değerleri üzerinde işlem yap değil.

ADC ile ölç ve Sakla. T kadar bekle, ADC ile ölç ve Sakla. T kadar bekle şeklinde ölçümler yapmak gerekir.
Buradaki T değerleri oldukça sabit olmalı ki örnekleme peryodun şaşmasın.

Üstelik bu işlemi de her bir periyod boyunca yapmalısın.

Bazıları uzunca bir zaman diliminde (pek çok periyod üzerinden) RMS hesaplamaya kalkıyorlar hata yapıyorlar.


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

Proteus

Alıntı yapılan: z - 08 Aralık 2020, 01:20:37Yazdığın kütüphaneden anlamıyorum ama bu işlerde timer ile zamanı kesin anlarda sample toplaman lazım.
ADC ile ölç kaydet ölç kaydet sonra da ölçüm değerleri üzerinde işlem yap değil.

ADC ile ölç ve Sakla. T kadar bekle, ADC ile ölç ve Sakla. T kadar bekle şeklinde ölçümler yapmak gerekir.
Buradaki T değerleri oldukça sabit olmalı ki örnekleme peryodun şaşmasın.

Üstelik bu işlemi de her bir periyod boyunca yapmalısın.

Bazıları uzunca bir zaman diliminde (pek çok periyod üzerinden) RMS hesaplamaya kalkıyorlar hata yapıyorlar.


Peryodun başlangıç önemi var mı ?

ZCD Tetiklenince timer başlatırım 200 us boyunca örnek alırım ADC dizisine kaydederim.

Ana programda RMS hesabını yapıp sonucu alırım.

Tam anlayamadım T kadar bekle derken neyi kastettiniz bir peryot es geçmeyi mi birde RMS hesabını tam nerde yapmalıyım ?

Proteus

Ölçüm Disco kartın üzerinde olan 3V üstünden yapılmıştır.3mv bir fark var.
VREF kalibrasyonu 100 us örnek alma kayıt etme 1s'de bir kayıtlı değerleri hesaplayacak kesmelerde ekledim.
DC ölçümde başarılı oldum.
AC olarak henüz tam olarak keskin bir ölçüm sağlayamadım vadc değerleri 1,35V ila 1,90V oynuyor.
Ofsetten çıkardığımızda +- 300mv eder kazancımda 4,5x oldugu için 66mv input var demektir.
Ama benim input değerim 23vrms
Tam olarak çözemedim bu işi.
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{

	if (htim==&htim3){
	 
		for( count = 0 ; count < 100 ; count++ ){
			
rawrms += adc_raw_data[count] * adc_raw_data[count];
			
}
		
rms = sqrt(rawrms / count);
rawrms = 0;
vdda = 3.3000 * (*VREFIN_CAL) / vref;
//vadc = (vdda * (rms-2300)/4095);
vadc = (vdda*rms/4095);
//volt = (vadc-1.65);
//rms = rms-2047;
// HAL_GPIO_TogglePin(LED_GPIO_Port,LED2_Pin);

}
 
 if (htim==&htim2){
		
HAL_ADC_Start(&hadc2);
		
  if (HAL_ADC_PollForConversion(&hadc2,5)==HAL_OK)	 
		
for( count = 0 ; count < 100 ; count++ ) {
	
  adc_raw_data[count] = HAL_ADC_GetValue(&hadc2);
	
}	 
HAL_ADC_Stop(&hadc2);
HAL_ADC_Start(&hadc1);



if (HAL_ADC_PollForConversion(&hadc1,5)==HAL_OK)	 
		
  vref =  HAL_ADC_GetValue(&hadc1);
//	HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
 
}
	
HAL_ADC_Stop(&hadc1);

		

}




z

#28
Alıntı yapılan: Proteus - 08 Aralık 2020, 10:24:27Peryodun başlangıç önemi var mı ?

ZCD Tetiklenince timer başlatırım 200 us boyunca örnek alırım ADC dizisine kaydederim.

Ana programda RMS hesabını yapıp sonucu alırım.

Tam anlayamadım T kadar bekle derken neyi kastettiniz bir peryot es geçmeyi mi birde RMS hesabını tam nerde yapmalıyım ?

Eğer ölçümü tam bir peryod aralığında yapabiliyorsan nerden başladığının önemi yok.

Diyelim ki periyodu  20ms olan  gerilimden 100 örnek alacaksın. Bu durumda her bir örnek 20/100 ms aralıklarla alınmak zorunda.

Yani 200 uS.

O zaman timerı 200uS de bir int üretecek şekilde kuracak ve her bir int da ADC yi başlatıp bir tane değer okuyup saklayacaksın. Dolayısı ile yukarıda T olarak bahsettiğim şey buradaki 200uS oluyor.





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

e-zeki

nacizane tavsiye devrede zcd varsa zaten adc'yi dma'ya aktar timer içinde direk o anki değerleri listeleyerek git. 3-4 periyotta bir de biriktirdiğin adc datalarıyla rms hesabı yap.