www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Arduino - povprečenje analognih meritev

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
malci
Član
Član



Pridružen-a: Sob 15 Sep 2007 21:05
Prispevkov: 793
Aktiv.: 3.92
Kraj: Polhov Gradec

PrispevekObjavljeno: Ned Apr 09, 2023 12:13 pm    Naslov sporočila:  Arduino - povprečenje analognih meritev Odgovori s citatom

Pozdrav.

Pri meritvi toka moram oz sem za bolj stabilne/natančne meritve uporabil povprečenje. To deluje ok, tudi kodo, kjer odšteje največjo in najmanjšo vrednost sem sestavil in deluje.
Spodaj pa pripenjam del kode, kjer odštejem dve max in dve min vrednosti, za katero pa nisem več 100%,da deluje ok (da vrne pravo vrednost)? Ker če bo prva prebrana vrednost najmanjša od vseh 20-tih, potem ShuntIntMin[1] ostane na 8500....
Pričakovane vrednosti Shunt so od -80.00mV do + 80mV.

Kako rešiti to težavo? oz sploh če bi želel odštevati 5 max in 5 min vrednosti pri 30-tih meritvah?

lp
Uroš

Koda:
//*********meritev toka na shuntu in povprečenje...******************   
   
   long ShuntTotal=0;                      // sešteta vrednost meritev
   int ShuntInt;                        // integer vrednosti
   int ShuntIntMax[2]={-8500, -8500};       
   int ShuntIntMin[2]={8500,8500};   

   for(int i = 0; i<20; i++){             
      Shunt= ina226.getShuntVoltage_mV();     // vrednost v decimalkah (npr 16.75mV) - Shunt je deklarian kot Float
      ShuntInt=Shunt * 100;               // preračun v integer (brez decimalk)
      
         if (ShuntInt> ShuntIntMax[0]) {      //  preveri če je vrednost večja od max
            ShuntIntMax[1]=ShuntIntMax[0];  // najprej iz ShuntIntMax[0] >> v ShuntIntMax[1]
            ShuntIntMax[0]=ShuntInt;      // potem nova v ShuntIntMax[0]
            
         }
         if (ShuntInt< ShuntIntMin[0]){      // preveri če je vrednost manjša od min
            ShuntIntMin[1]=ShuntIntMin[0];   // ....in jo zapiši v ShuntIntMin[0]
            ShuntIntMin[0]=ShuntInt;      // ...itd            
         }
         
      ShuntTotal=ShuntTotal + ShuntInt;       // sešteva vrednosti
   }         
   
      ShuntTotal=ShuntTotal - ShuntIntMax[0];   // odšetejem max in min vrednsoti...
      ShuntTotal=ShuntTotal - ShuntIntMin[0];
      ShuntTotal=ShuntTotal - ShuntIntMax[1];
      ShuntTotal=ShuntTotal - ShuntIntMin[1];
      
    Shunt= (ShuntTotal/16);               // ostanek delim z 16
    Shunt= float(Shunt)/100.;                // da dobim nazaj float vrednsoti (decimalke)
   
//*********Konec meritev toka na shuntu in povprečenje...******************   
   

_________________
Elektronika za hobi
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3356
Aktiv.: 16.96

PrispevekObjavljeno: Ned Apr 09, 2023 1:19 pm    Naslov sporočila:   Odgovori s citatom

Če gre za relativno počasne spremembe meritev, narediš npr tri meritve eno za drugo in povprečiš.
Na koncu -lahko- preveriš, če to zares ne odstopa preveč od prejšnje (akceptirane) meritve. Če ne odstopa preveč, potem to novo izračunano vrednost uporabiš kot točno, drugače ignoriraš do naslednje meritve.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mosqito
Član
Član



Pridružen-a: Čet 07 Apr 2016 23:22
Prispevkov: 3246
Aktiv.: 33.10

PrispevekObjavljeno: Ned Apr 09, 2023 6:58 pm    Naslov sporočila:   Odgovori s citatom

Predlagam, da pogledaš najpreprostejši FIR filter, oz. drseče povprečje. Štrleči odčitki imajo manjši vpliv. Lahko uporabiš tudi uteženo drseče povprečje.

Par uporabnih linkov:
https://www.aranacorp.com/en/implementation-of-the-moving-average-in-arduino/amp/
https://www.microchip.com/en-us/application-notes/an0940
https://www.dspguide.com/ch15.htm

_________________
Always going the extra mile.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 78 dni


Powered by phpBB © 2001, 2005 phpBB Group