Arduino Forum upgrade scheduled for Monday, October 20th, 11am-4pm (CEST). Sorry for the inconvenience!
Pages: 1 [2] 3 4   Go Down
Author Topic: Segnale non linerare in ingresso come lo importo?  (Read 2698 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Full Member
***
Karma: 0
Posts: 185
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ci sono un paio di cose che non mi sconfinferano:
- inizializzare  mediatensione prima del ciclo for
- io farei direttamente mediatensione += analogRead(rsense)
- il ciclo for dura ben più di 86*DelayMicro(11,7) perché c'è anche la durata delle altre operazioni. non avevi un segnale che abilita la finestra temporale di 1ms? se possibile io fare una cosa tipo
Code:
mediatensione = 0;
tmp = 0;
for(segnale_abilitazione_attivo)
{
  mediatensione += analogRead(rsense);
  tmp += 1;
}
mediatensione /= tmp

per il riferimento dipende dall'entità del tuo segnale, per quello che avevi postato puoi anche impostare il riferimento interno di 1,1Vdc http://arduino.cc/en/Reference/AnalogReference.
di solito, comunque, si cerca di condizionare il segnale da acuisire in modo che vari nel range 0...Vref in modo da sfruttare tutta la risoluzione dell'AD
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 112
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie Frog sei sempre troppo gentile.
non sapevo dell'utilizzo di Aref.
Siccome nel progetto ci sta pure un sensore di temperatura , cambiare Aref non è che mi influisce  sul campionamento sensore di temperatua lm35dz su analog(0) ?
per quanto rigurda il codice il segnale_abilitazione_attivo potrebbe essere la variazione del duty ; nel codice da te postato non faccio la media sul periodo o mi sbaglio.

Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 185
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il riferimento dell'analogica è una per tutti i canali dell'AD, quindi è meglio se li equalizzi tutti su un range simile in modo da utilizzare lo stesso riferimento piuttosto che cambiarlo ogni volta (non so che tempi di assestamento ci siano)

ehm... nel codice precedente non ci va un for() ma un while(). fatto come l'ho scritto io fa la media partendo quando la funzione viene chiamata e per l'intervallo di tempo durante il quale il segnale di abilitazione è alto.

tu devi fare la media di un intero periodo o della parte in cui l'integrato viene abilitato?
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 112
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nel periodo.
frog ma nn potevi essere mio padre cosi mi davi delle dritte!!! smiley smiley smiley-wink smiley-grin
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 185
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

suppongo tu debba fare la media su tutti i periodi (uno dopo l'altro). in questo caso devi pensare a qualcosa di diverso dal mero "sommo i campioni e poi divido" perché non avresti poi il tempo per elaborare la media prima di partire con il successivo periodo. prova a cercare se ci sono soluzioni circuitali per fare una media hardware, in questo modo andresti a campionare solo una volta ogni millisecondo.

al massimo potresti sperare di essere mio fratello
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 112
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

e mi sa pure a me che la miglire strada è cambiare.
La soluzione hardware è un sensore ad effetto hall con a valle un amplificatore non invertente + un filtro.
che ne pensi?
Nel caso in cui quest'ultima vada bene ,  il valore medio lo posso madare direttamente al pin analog?
Vabbe allora un fratello con cui confrontarsi è sempre meglio smiley
ho trovato il nome dimmi se ti piace "Fraduino" opp "<Frogduino" ;D ;D
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 274
Posts: 22159
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao spank_78

"sensore ad effetto hall" Non andrá bene. La corrente da misurare é piccola e i disturbi sono grandi che comunque verranno letti anche dal sensore e tradotte in picchi di tensione.
perché non ti risparmi il sensore ad effetto hall e fai l' amplificazione e filtraggio a partire dalla tensione della resistenza.

Ciao Uwe
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 185
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

quoto uwefed: il segnale su cui lavorare c'è già.

@spank_78
il seguente codice non ti ricorda qualche altra operazione?

Code:
for(t=0; t<1ms; t++)
{
  mediatensione += analogRead(rsense);
}
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 112
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

SISI certo!
allora utilizzo mills() per contare il tempo.
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 185
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

no. dicevo, non ti ricorda qualche altra operazione matematica che ha un SSSSSSSSSimbolo particolare?
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 112
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sarà che sono stanco ,che l'italia a pareggiato  :(ma mi sembra che mi vuoi suggerire il tempo in ms..giusto?
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 185
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

no. la risposta al "velato" suggerimento era... integrale.

Code:
for(t=0; t<1ms; t++)
{
  mediatensione += analogRead(rsense);
}
è la discretizzazione di integrale per tempo che va da 0 a 1ms del segnale analogico
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 112
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

grazie al tuo aiuto ho scritto questo codice ma mi da dei valori troppo grandi.
Piu che un integrale è una sommatoria e anche dividendo per 100 mi da valori tipo di 15 volts.
Ho fatto la sommatoria su su un periodo di 100 ms a causa di millis() e diciamo che puo andare anche bene.
Code:
void corrente(){
  
                t= millis();
               for(t = 0;  t<100; t++)
              {
               mediatensione += analogRead(rsense);
              }
              
                Serial.print("tempo=");
                Serial.println(t);
                Serial.print("mediat=");
                Serial.println(mediatensione );
                Serial.print("Corrente=");
                Serial.println(mediatensione/0.56);
               mediatensione=0;
               t=0;

}

il codice non im convince.
« Last Edit: June 15, 2010, 04:56:56 am by spank_78 » Logged

kokiua
Guest
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusate l'intromissione, magari oggi con il fresco sono mezzo imbambolato  :smiley , ma una media non dovrebbe essere fatta almeno così:

Code:
for(t = 0;  t<100; t++){
  mediatensione = (mediatensione + analogRead(rsense)) / 2;
}
Altrimenti quella che fate la potete chiamare sommatensione, o no?  smiley-razz

---aggiungo:

Importante anche che le variabili in gioco siano almeno float, altrimenti se si divide per un intero si perdono valori decimali che possono avere un loro peso sulla media...

ovvero:
Code:
float mediatensione=0;
for(t = 0;  t<100; t++){
  mediatensione = (mediatensione + (float)(analogRead(rsense))) / (float)(2.0);
}
« Last Edit: June 15, 2010, 05:08:50 am by kokiua » Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 112
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho corretto cosi anche perchè mi sembravano che c'erano delle contraddizioni.
Code:
void corrente(){
  
                while(millis() < interval);
          
              {
                
               mediatensione += analogRead(rsense);
              
              
              }
          
                Serial.print("tempo=");
                Serial.println(t);
                Serial.print("mediat=");
                Serial.println(mediatensione );
                Serial.print("Corrente=");
                Serial.println(mediatensione/0.56);
               mediatensione=0;
            

}

e dividendo per 100ms mi da dei valori piu nella norma.
Logged

Pages: 1 [2] 3 4   Go Up
Arduino Forum upgrade scheduled for Monday, October 20th, 11am-4pm (CEST). Sorry for the inconvenience!
Jump to: