Se sei già registrato           oppure    

Orario: 11/08/2020 09:19:08  

 

Energia Alternativa ed Energia Fai Da Te > Arduino


TRUE RMS
FinePagina

qqcreafis

Avatar
GigaWatt


Gruppo:Utente
Messaggi:9557

Stato:



Inviato il: 22/05/2020 09:20:51

mi serve in tempo reale (adesso!)un tester true RMS con una banda passante di almeno almeno 3 KHz

Ho pensato di utlilizzare arduino in quanto ... disponibile

ma non riesco a trovare il tempo di sample dell'istruzione analogread deve essere il più piccolo possibile compatibilmente ai miseri 10 bit.
è il parametro fondamentale in quanto sul numero di letture al secondo si può derogare

il metodo più semplice potrebbe essere quello di accumulare solo la media e la media dei quadrati fare 10000 letture o più e poi spedire i dati



---------------
Al peggio non esiste limite

 

qqcreafis

Avatar
GigaWatt


Gruppo:Utente
Messaggi:9557

Stato:



Inviato il: 23/05/2020 17:56:00

void setup() {

  Serial.begin(9600);

}
unsigned long  acc;
unsigned long    acc2;

unsigned long  z;
//double z,acc,acc2,nume=200;
 double var2,media,media2,RMS,RMS02;

int i=0;

int n=4000;
 
void loop() {
               z=0;
               acc=0;
               acc2=0;
               var2=0;
               
             for(i=0;i<n;i++){

          z=analogRead(0);

          //delay(1000);

        
   

acc=acc+z;
               
          acc2=acc2+z*z;
    
          
//acc=0;
               //acc2=0;
        
                       }

  //num=n;
                               
        //var2=((acc2-acc*acc)/num^2*(5/1024)^2)^(1/2);
      // var2=sqrt(acc2-acc*acc)/n*5/1024;
            //var2=(acc)/n*5/1024;
            var2=(acc2-acc*acc);

            media=acc;
            media=media/n;

            media2=acc2;
            media2=media2/n;
            RMS=sqrt(media2)*5/1024;
            RMS02=(media2-media*media)*25/1024/1024;
            Serial.println(acc);  
Serial.println(media*media); 
Serial.println(media2);
Serial.println(RMS,4);
 Serial.print("var2 = ");
Serial.println(RMS02,8);  

// var2=((acc2-acc*acc)/num^2)^(1/2);
         //      var2=((acc2-acc*acc)/n^2*(5/1024)^2)^(1/2);
         
                    //  Serial.println( var2);
               //Serial.print( acc2);
               //Serial.print(" ");
               //Serial.println( acc*acc);
              // delay(1000);                     
                                               
        
}



---------------
Al peggio non esiste limite

 

qqcreafis

Avatar
GigaWatt


Gruppo:Utente
Messaggi:9557

Stato:



Inviato il: 23/05/2020 17:58:16

sembra che funzioni devo solo testare con onda sinosuidale

fornisce RMS com media diversa da zero ed il quadrato della varianza che è il valore RMS^2 nel caso di media 0



---------------
Al peggio non esiste limite

 

qqcreafis

Avatar
GigaWatt


Gruppo:Utente
Messaggi:9557

Stato:



Inviato il: 01/06/2020 08:51:32



void setup() {

  Serial.begin(9600);

}
unsigned long  acc;
unsigned long    acc2;

unsigned long  z;
//double z,acc,acc2,nume=200;
 double var2,media,media2,RMS,RMS02;

int m,i=0;

int n=4000;
 double valore=0;
void loop() {
               z=0;
               acc=0;
               acc2=0;
               var2=0;
               
             for(i=0;i<n;i++){

          z=analogRead(0);

          //delay(1000);

        
   

acc=acc+z;
               
          acc2=acc2+z*z;
    
          
//acc=0;
               //acc2=0;
        
                       }

  //num=n;
                               
        //var2=((acc2-acc*acc)/num^2*(5/1024)^2)^(1/2);
      // var2=sqrt(acc2-acc*acc)/n*5/1024;
            //var2=(acc)/n*5/1024;
            var2=(acc2-acc*acc);

            media=acc;
            media=media/n;

            media2=acc2;
            media2=media2/n;
            RMS=sqrt(media2)*5/1024;
            RMS02=(media2-media*media)*25/1024/1024;
            m=m+1;
            valore=valore+sqrt(RMS02);
            //Serial.println(m);
            if(m ==100){
              
              
              //Serial.println(m);
            Serial.println(valore/100,8); 
            valore =0;
            m=0;
            
             
//Serial.println(media*media); 
//Serial.println(media2);
//Serial.println(RMS,4);
// Serial.print("var2 = ");

//Serial.println(RMS02,8);  

// var2=((acc2-acc*acc)/num^2)^(1/2);
         //      var2=((acc2-acc*acc)/n^2*(5/1024)^2)^(1/2);
         
                    //  Serial.println( var2);
               //Serial.print( acc2);
               //Serial.print(" ");
               //Serial.println( acc*acc);
              // delay(1000);                     
           }                                    
        
}


funziona benissimo fa la media di 100 misure ciascuna composta da 4000 acquisizioni.



Modificato da qqcreafis - 01/06/2020, 11:05:33


---------------
Al peggio non esiste limite

 
 InizioPagina
 

Versione Mobile!

Home page       TOP100-SOLAR      Home page forum