True RMS'de periyot konusu

Başlatan Mucit23, 30 Kasım 2017, 21:33:43

Mucit23

500 Örnekten fazla alamıyorum. Karelerinin toplamı uint32 ye sığmıyor. Ancak örnek aralığını uzatabilirim.

hasankara

#61
Daha farklı bir hata olmalı; Çünkü periyot başlama ve bitiş aynı yerde olmamasından kaynaklanıyor olsa, bu durum sonuç değerinde kıpraşma ve hareketlilik olarak görülürdü. İşlemsel olarak topladığın örnek sayısı ile böldüğün örnek sayısının aynı olup olmaması incelenebilir.

Diğer bir önerim ise seri port üzerinden bir periyot boyunca topladığın tüm örnekleri bilgisayara çekip grafikte görmek probleme çok farklı bir boyut kazandıracaktır. Bu kısa süre için biraz zahmetli olabilir belki ama farklı alanlarda da bu alt yapıyı kullanabilirsin. RTDM diye sorduğum olay ile aslında bunu kast ediyordum.

Elinde ki imkanlar doğrultusunda söyleyebileceğim, tepeden tepeye ayrı zamanlarda dc akım ölçüp farklı değerlerde kalibre etmeni öneriyorum sanırım bu 3. kez söyleyişim oldu.

hasankara

Evet tam yazarken yazmışsın ki karelerin toplamı uint32 e sığdığına emin misin? Float kullanmayı deneyebilirsin.

baran123


Mucit23

Hasan hocam aslında dediklerinizi yapabilirim. En azından Mikroişlemcinin gördüğü ile Osiloskop ile gördüğüm arasındaki farkı net olarak görebilirim.
uint32_t ye sığdığını şu şekilde hesaplıyorum.


ADC den okuduğum değer max +-2048 arası bir değer alabilir.


ADC den max 2048 gelse ve bu örneğin karesini alsam 2048*2048=4,194,304 değerini alır. Bu değeri 500 ile çarparsam
500*4,194,304=2,097,152,000 Yapar


uint32_t max 4,294,967,295 değerini alıyor. Aslında örnek sayımı 1000 yapabilirim. Yine uint32'ye sığıyor. Fakat Hesaplama süremi çok uzatır diye 500'de bırakmıştım.


uint64_t ye de bu yüzden ihtiyaç duymadım.

Mucit23

Biraz daha derinlere indim. Birkaç post yukarıda Yarım dalga sinüs şeklinde akan akımı İki Periyot boyunca örnekledim. Örnekleme işlemi tam olarak sıfır geçişinde başlatıldı.  Toplam 500 Örnek var ve 80uS aralıklarla 2T boyunca örneklendi. Okuduğum ADC değerinden 1.65V 'a denk gelen(2048) ofset değerini çıkartıyorum.

Dediğim Gibi Yarım dalga olarak çekilen akım için elde ettiğim değerler aşağıdaki gibi.

-8,2,3,-4,-4,-4,-1,3,-2,2,-6,-8,-3,-1,2,-1,-3,0,1,1,0,-3,-4,-11,-1,-2,-4,-6,-6,0,6,0,0,5,-1,-2,2,4,3,4,-6,-6,8,0,3,4,-2,5,7,6,6,0,6,6,3,6,0,5,1,2,-1,-1,8,4,6,6,9,6,5,-2,-3,8,5,5,7,-2,-3,-6,-1,3,6,5,7,4,6,13,8,9,8,11,9,16,4,6,14,7,8,5,6,8,8,9,3,6,6,10,8,5,6,7,6,6,26,3,6,-13,9,7,5,11,2,13,13,5,24,34,45,67,73,99,107,132,153,171,186,212,236,240,260,282,297,304,332,353,358,369,377,407,414,427,448,452,476,491,489,506,519,535,541,551,549,569,581,587,602,614,622,638,641,667,669,680,681,697,694,697,700,709,708,707,707,716,713,714,719,721,723,719,726,723,728,721,730,724,720,720,719,723,724,725,718,712,702,695,677,667,654,644,632,626,608,607,589,578,566,554,552,529,516,492,483,469,449,430,415,402,387,367,350,338,320,299,279,266,255,225,212,189,172,157,143,127,111,91,79,45,37,26,18,6,-8,6,3,5,3,-1,-2,-3,2,-5,-4,-5,1,-5,0,-7,-3,-3,-1,-5,-1,-8,-2,-4,1,5,0,-2,0,-6,-3,3,-3,9,2,-1,-2,3,-2,6,-4,-3,-2,13,-1,-4,6,1,1,1,4,2,1,9,9,3,8,-6,6,-6,3,-4,5,-1,-2,2,-1,4,3,6,2,5,-4,5,5,15,8,12,6,11,9,7,1,4,0,4,4,3,6,8,6,3,8,16,11,11,7,11,9,12,9,6,6,10,6,-3,6,8,6,0,1,11,7,8,20,17,-2,20,10,5,15,0,-8,13,12,31,44,60,79,90,104,124,146,166,184,201,234,241,273,279,292,308,329,347,357,374,395,400,422,428,450,457,467,492,501,513,522,537,543,552,563,570,580,587,599,614,631,632,645,658,678,673,684,689,679,675,682,672,699,697,715,708,692,695,686,680,698,690,688,696,695,685,695,694,698,687,687,687,690,689,691,672,656,654,644,638,643,608,595,595,582,565,546,539,535,511,505,484,487,455,456,425,414,389,379,355,330,325,308,288,269,251,237,235,210,196,163,151,125,81,30,26,2,17,-4,1,-10,3,-14,-5


Yaptığım hesapların aynısını devc üzerinde yaptım ve Aynı sonuçları elde ettim. Yaklaşık olarak 3.45A civarı.  Gerçekte Ölçü aletlerim 2.75A civarı ölçüyor.

Hesap yöntemim aşağıdaki gibi
for(i=0;i<500;i++){
	sum+=dizi[i]*dizi[i];
}

iadc=sqrt(sum/500.0);
irms=(iadc*7.70) / 798.00;


2. Olarak Yarım dalga olmayan tam dalga olarak çekilen bir akım sinyalinden okuduğum değerler.
-11,-25,-37,-48,-54,-69,-80,-91,-103,-122,-129,-142,-152,-160,-177,-186,-203,-201,-217,-231,-233,-241,-246,-267,-264,-282,-294,-302,-302,-313,-320,-327,-342,-344,-351,-356,-367,-368,-380,-387,-396,-400,-409,-415,-422,-437,-433,-441,-445,-449,-446,-448,-455,-451,-459,-453,-460,-456,-458,-456,-452,-463,-456,-463,-463,-465,-457,-463,-472,-466,-462,-472,-458,-461,-456,-460,-461,-449,-449,-447,-435,-421,-409,-409,-395,-391,-384,-378,-372,-365,-353,-349,-337,-330,-322,-313,-302,-288,-282,-268,-255,-244,-237,-229,-224,-206,-197,-189,-171,-166,-148,-138,-130,-118,-103,-112,-79,-77,-63,-43,-31,-16,-13,-4,20,25,48,57,71,87,101,122,140,156,172,205,212,235,253,280,290,302,327,335,358,366,394,398,415,425,435,456,466,478,496,505,525,528,546,558,559,576,589,594,599,614,622,640,661,664,675,688,698,700,704,711,709,712,725,727,728,727,719,731,729,724,727,733,730,740,729,736,731,731,730,728,736,730,731,727,723,721,714,707,698,675,671,656,648,638,628,613,594,583,579,561,554,534,528,509,493,471,468,448,434,421,389,371,366,341,327,309,290,278,258,248,219,214,195,175,151,133,116,87,74,47,30,28,15,0,-17,-30,-36,-46,-57,-73,-79,-97,-101,-118,-123,-139,-157,-168,-183,-183,-195,-208,-217,-231,-236,-237,-252,-257,-272,-278,-293,-301,-307,-321,-329,-332,-337,-346,-351,-355,-363,-367,-378,-389,-396,-400,-405,-414,-427,-427,-443,-440,-448,-441,-448,-455,-456,-447,-457,-449,-457,-466,-458,-460,-461,-460,-456,-468,-465,-461,-464,-466,-459,-460,-466,-457,-466,-464,-464,-460,-458,-450,-445,-440,-434,-421,-414,-401,-397,-396,-384,-377,-372,-364,-357,-342,-337,-324,-319,-313,-296,-286,-282,-269,-258,-252,-239,-233,-215,-198,-198,-188,-168,-163,-150,-143,-131,-112,-117,-92,-80,-70,-64,-54,-32,-21,-3,11,6,34,41,60,69,89,104,122,142,155,181,192,221,233,253,274,295,305,326,339,350,375,385,404,408,422,448,450,465,479,499,510,520,530,548,557,560,576,580,591,608,614,629,641,657,674,676,685,699,705,713,714,720,712,718,724,718,727,721,729,729,731,725,734,738,731,729,736,736,731,729,735,731,735,731,729,718,714,709,703,689,681,667,654,646,638,624,624,598,588,573,553,551,532,518,507,491,482,457,448,427,409,391,376,357,341,331,316,296,276,265,245,229,211,193,173,153,138,112,86,82,49,50,38,6,-5


Burada Ölçü aletleri 4.12A ölçerken Ben 4.21A hesaplıyorum.

Son Olarak yine tam dalga fakat daha yüksek bir akım değeri için aldığım değerler.
-29,-64,-84,-103,-127,-158,-190,-214,-238,-273,-311,-334,-367,-394,-416,-445,-476,-501,-523,-545,-573,-602,-618,-636,-669,-685,-707,-731,-746,-764,-794,-805,-826,-842,-850,-862,-883,-922,-922,-937,-960,-985,-1006,-1022,-1036,-1057,-1070,-1069,-1085,-1092,-1094,-1102,-1106,-1109,-1111,-1114,-1131,-1116,-1125,-1127,-1129,-1124,-1133,-1143,-1133,-1130,-1133,-1138,-1138,-1141,-1137,-1141,-1140,-1136,-1136,-1129,-1122,-1106,-1088,-1074,-1056,-1034,-1029,-1003,-989,-970,-952,-928,-922,-894,-871,-858,-833,-808,-796,-771,-740,-724,-694,-666,-634,-609,-587,-565,-533,-506,-483,-459,-425,-404,-376,-352,-323,-300,-276,-247,-217,-181,-156,-126,-97,-67,-33,-16,9,31,63,85,110,141,164,186,212,235,275,305,339,358,396,415,450,480,505,531,557,576,602,621,642,663,686,708,733,752,769,795,816,837,848,859,874,891,910,933,946,961,977,1009,1024,1044,1056,1076,1088,1093,1099,1127,1127,1127,1127,1131,1127,1130,1127,1135,1136,1139,1140,1143,1143,1143,1143,1147,1138,1140,1148,1148,1147,1151,1154,1145,1139,1127,1127,1127,1082,1063,1055,1031,1017,990,976,959,946,925,906,889,871,837,831,803,779,760,731,717,678,654,625,603,572,552,521,498,471,451,416,394,366,339,315,289,262,215,198,168,127,105,82,51,31,16,-25,-52,-70,-96,-132,-150,-176,-206,-234,-269,-296,-330,-357,-390,-420,-442,-468,-494,-526,-547,-568,-592,-607,-627,-650,-672,-691,-728,-741,-765,-785,-794,-826,-841,-859,-862,-883,-922,-922,-929,-967,-973,-993,-1015,-1026,-1050,-1068,-1082,-1086,-1100,-1100,-1098,-1100,-1104,-1115,-1120,-1117,-1124,-1121,-1126,-1123,-1125,-1130,-1131,-1135,-1138,-1130,-1135,-1140,-1139,-1137,-1139,-1134,-1141,-1138,-1137,-1129,-1114,-1095,-1080,-1072,-1046,-1035,-1012,-983,-973,-954,-937,-922,-890,-881,-863,-844,-820,-798,-775,-752,-735,-701,-684,-649,-621,-595,-574,-544,-520,-492,-466,-434,-409,-389,-359,-331,-308,-278,-255,-201,-179,-164,-129,-105,-64,-33,-11,16,35,53,79,102,125,147,181,208,230,267,301,331,358,387,418,441,472,502,517,552,573,592,614,640,657,681,706,721,747,770,791,810,832,844,857,871,879,908,924,939,961,982,999,1014,1035,1056,1068,1077,1095,1095,1099,1127,1127,1127,1127,1127,1129,1132,1134,1136,1133,1136,1144,1141,1149,1138,1143,1143,1152,1143,1143,1145,1149,1145,1140,1139,1135,1127,1099,1091,1082,1056,1035,1026,1008,984,964,947,938,912,897,873,855,835,810,790,767,744,719,687,665,639,614,586,551,529,506,480,448,431,396,372,347,317,299,271,236,210,182,140,119,75,55,34,16


Ölçü aleti 7.84A Hesaplarken Ben 7.85A hesapladım.

Ben mi hesap hatası yapıyorum yoksa yöntemmi yanlış. Anlaşılan o ki Sıfır geçişinde örnek almaya başlamak pek birşey değiştirmiyor.

Son olarak Aklıma takılan şu var. Acaba ADC den okuduğum HAM değerleri RMS hesaplarına sokmadan önce 1.65V ofset değerini çıkarmam sonucu etkiliyor olabilirmi? Aklıma bundan başka birşey gelmiyor. 

Yukarıdaki 500 Adet örneği analiz edebilecek olan varmı?

devrecii

#66
Galiba oldu :) iyiki şu değerleri verdin teşekkürler, yoksa mümkün değildi.
Burda kod ve exeler var verdiğin değerlerler ile devcpp de hesaplattım.

http://dropmefiles.com/Kvl2n

Küçük bir kod eklemen gerekiyor offset düzelme diye yazdım.
Peki nasıl oluyor .




Mucit23

@iboibo    Asıl ben Teşekkür ederim.  Sorun şimdi belli olmaya başladı. Fakat anlamadığım birkaç nokta var. Çünkü sayenizde başka bir hatamı daha fark ettim. Ben ADC den değer okurken ofset değerimi 1.65V olarak kabul edip okuduğum değerlerden 2048 değerini çıkartıyordum. Fakat bazen ofset değeri tam 1.65V olmuyor 1.60V'lara kadar düşüyor. Bu durumda ofset değeri kaymış oluyor.(Sanırım benim en büyük hatamda bu oldu).

ADC den okumuş olduğum HAM veriler üzerinden otomatik olarak ofset değerini hesaplamam mümkünmüdür? Bu durumda gelen değerler 0-4095 arası olacak. Bu değerler içerisinden ofseti bulup RMS hesabı öncesinde ofset değerini çıkarmam gerekiyor. Bu işlemi nasıl yaparım?

Siz Ofset düzeltme olarak bir işlem yapmışsınız RMS öncesinde ama nasıl çalıştığını açıkçası anlayamadım. Bunu biraz anlatabilirmisiniz?.

devrecii

Girişteki voltajdaki değişimdeki sorun tabiki önemli.

Bunu çözmek için Adc kalibrasyonu yapabilirsin Hal library içinde vardı.
Adc girişine direnç kondansatör koyup denemeler yaparak kalibrasyonu iyileştirebilirsin.
ACS entegresinin kendi içinde kalibresini yapıyor zaten ,Artık yapacak bişey yok.


Fakat buradaki durum çok farklı, girişin yüzdeyüz doğru olsa bile bu hesaplamayı yapman gerekiyor.


Buradaki durum elektronik değilde fiziksel olarak açıklanması gerekiyor herhalde.

Büyük ihtimalle enerji hesaplamalarında sorun olduğu için bu RMS denen şey bulunmuştur.
Mesela bir dirence  titreşimi olmayan akım versek ne kadar ısınır, peki bir
dirence ,içinde ripple iniş çıkışları  olan akım versek ne kadar ısınır ?


RMS hakkında internette detaylı bilgi yok mu ? Arduno projeleri görüyorum sadece. 

Kodları resimle ancak açıklayabilirim





Mucit23

#69
Ben sadece dalganın 0v izdüşümü hesaplaması işini anlayamadım. Böyle birsey ile ilk defa karşılaşıyorum. Bunun matematiksel bir alt yapısı varmı? Ayrıntısını nasıl öğrenebilirim? Birde giriste 2048 degerini çıkarmasak nasıl çalışacak? Çünkü o işi yani 2048 degerini otomatik hesaplatıp çıkarmak ıstiyorum.

Rms ile ilgili cok fazla bilgi var. Teorik olarak bilgim var ama bu tür konular genellikle uygulamaya yonelik pratik bilgiler istiyor. Onlarıda internette bulmak zor.

devrecii

İlk başta 2048 çıkarma ,  tek for döngüsü ile halledeblirsin.

bb=kk/500; dan sonra  bb+=2048;  dersen  tek seferde halledersin .  Acs711 boşta V/2 çıkış verdiği için mecburen bu sayıyı çıkarmamız
lazım rms yapmadan önce.

İzdüşüm olayını birazcık düşünsen anlarsın karmaşık bişey değil sonuçda 1D sadece y koordinatı ,  2D, 3D izdüşümlerde  var bu ne ki.

sadogan






Grafiklerini çizdirince, 1 ci ölçüm değerlerinde bir simetri hatasi var.

hasankara

    cumulative_sum_phaseA = cumulative_sum_phaseA + phaseCurrentA - moving_average_phaseA;
    moving_average_phaseA = cumulative_sum_phaseA >> MOVING_AVG_WINDOW_SIZE;

    /*Bounding the offset value */
    if (moving_average_phaseA > CURRENT_OFFSET_MAX)
    {
        moving_average_phaseA = CURRENT_OFFSET_MAX;
    }
    else if (moving_average_phaseA < CURRENT_OFFSET_MIN)
    {
        moving_average_phaseA = CURRENT_OFFSET_MIN;
    }

    phaseCurrentA = (phaseCurrentA - moving_average_phaseA); // Removing the offset

Mucit23

Alıntı yapılan: iboibo - 16 Aralık 2017, 23:37:32
İlk başta 2048 çıkarma ,  tek for döngüsü ile halledeblirsin.

bb=kk/500; dan sonra  bb+=2048;  dersen  tek seferde halledersin .  Acs711 boşta V/2 çıkış verdiği için mecburen bu sayıyı çıkarmamız
lazım rms yapmadan önce.

İzdüşüm olayını birazcık düşünsen anlarsın karmaşık bişey değil sonuçda 1D sadece y koordinatı ,  2D, 3D izdüşümlerde  var bu ne ki.

Araya fi naller girdiği için birkaç gündür bakamadım. Dün akşam sizin yöntemi reel de denedim fakat bir sıkıntı var çözemedim. Boşta akım çekilmiyorken değerler sürekli belirli bir aralıkta örneğin 0,5-8A arası geziniyor. Böyle bir sorun var. Tekrar bu konuya bakacağım.

@sadogan  o konuya tekrar bakacağım ama sensör verisi bu şekilde gibi.

Alıntı yapılan: hasankara - 18 Aralık 2017, 10:31:03
    cumulative_sum_phaseA = cumulative_sum_phaseA + phaseCurrentA - moving_average_phaseA;
    moving_average_phaseA = cumulative_sum_phaseA >> MOVING_AVG_WINDOW_SIZE;

    /*Bounding the offset value */
    if (moving_average_phaseA > CURRENT_OFFSET_MAX)
    {
        moving_average_phaseA = CURRENT_OFFSET_MAX;
    }
    else if (moving_average_phaseA < CURRENT_OFFSET_MIN)
    {
        moving_average_phaseA = CURRENT_OFFSET_MIN;
    }

    phaseCurrentA = (phaseCurrentA - moving_average_phaseA); // Removing the offset


Hasan hocam Otomatik DC ofseti çıkarmak için yanlış anlamadıysam şöyle yapmam gerekiyor. Bu işi düzgün yapsam bütün sorunlar çözülecek gibi.

N tane örnek var. Bu örneklerin RMSini hesaplamadan önce DC ofseti çıkarmanız gerekiyor. DC ofset dediğimiz zaten N tane örneğin toplamının ortalaması olacağı için Bu örnekleri toplayıp ortalamasını alırsak bize DC ofset değerini verecek. Sinyal simetrik sinüs bir sinyal ise zaten DC ofset sıfır olur. RMS hesabından önce bu dc ofset değerini ana örneklerden çıkarıyorsunuz.

Kodun ilk başında cumulative_sum_phaseA  satırında ne yapılıyor onu tam anlayamadım. Anlık gelen Faz akımından bir önceki ortalama değer çıkartılıyor elde edilen fark toplanıp belirli bir aralığa oranlanıyor sanırım.

Ortalama Almak için sizde belirli bir zaman içerisinde örneklerinizi alıp işliyormusunuz? Yoksa daha farklı bir sistem mi işliyor arka planda.

Ölçümü mü iyleştirecek ayrıntıları öğrenmeye çalışıyorum.  :) RMS almak işin en kolay herhalde



devrecii

Dostum  verdiğim kodlardaki değişkenlere dikkat et,  uint32 olmayacak signed  int olacak in32_t olacak .